Relé 8x - ovládání i2c

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Relé 8x - ovládání i2c

Příspěvek od ohruska » 09 led 2018, 13:29

Spojením těchto dvou komponent vznikne blok relé ovládaný přes I2C, čtyři dráty, které nezmenšuje počet IO pinů arduina.
Deska relé 8x
Deska relé 8x
Deska ovládání I2C
Deska ovládání I2C


Piny z modulu ovládání byly odstraněny. Deska modulu ovládání byla nasazena na piny relé a zapájena. Ještě je nutno propojit GND piny desky relé s deskou ovládání a GND relé.
Protože jsem nechtěl, aby deska ovládání přečuhovala přes obrys desky relé. Bohužel to přineslo opačné řazení relé, ale to lze obsloužit programově.
Hotová deska
Hotová deska

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Relé 8x - ovládání i2c

Příspěvek od ok1vkt » 11 bře 2018, 22:01

Ahoj, prosimtě, chci se zeptat... Mam stejnou releovou desku, bez I2C.
Zjištuju, že deska má obracenou logiku. tzn, pokud je vystup arduina aktivní, tak mi relé odepne a obraceně....
Zkrátka aktivace relé se provádí hodnotou LOW.

Chci se zeptat, jak nejjednodušeji otočit logiku vystupů? Abych mohl psát program ve smyslu HIGH=sepnutí relé (popřípadě True). ??
Výstupy zatím nemám nadefinované, jde mi spiš o tu logiku aby seděla a nemusel bych celej program obracet.
Díky za pomoc

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Relé 8x - ovládání i2c

Příspěvek od petan » 11 bře 2018, 22:09

Deska je tak konstruovaná. Buď připojit mezi desku a Arduino invertor, nebo to ošetřit programově. Prostě si vytvořit proměnné, kterým budeš přidělovat hodnotu výstupu a nakonec v nějaké funkci fyzicky zapneš/vypneš výstupy, ale s obrácenou logikou

Kód: Vybrat vše

bool Vystup1;
bool Vystup2;

void loop(){
	Vystup1 = true;
	Vystup2 = false;
	
	Vystupy();
}

void Vystupy(){
	digitalWrite(PIN, !Vystup1);
	digitalWrite(PIN, !Vystup2);
}

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Relé 8x - ovládání i2c

Příspěvek od ohruska » 11 bře 2018, 22:26

Já jsem to řešil takto;

Kód: Vybrat vše

/**
 * This demo code demonstrate all functionnalities of the PCF8574 library.
 *
 * PCF8574 pins map :
 * 0: led
 * 1: led
 * 2: led
 * 3: button + pull-up resistor
 */

/* Dependencies */
#include <Wire.h>    // Required for I2C communication
#include "PCF8574.h" // Required for PCF8574

#define R1 7  //RELÉ 1
#define R2 6  //RELÉ 2
#define R3 5  //RELÉ 3
#define R4 4  //RELÉ 4
#define R5 3  //RELÉ 5
#define R6 2  //RELÉ 6
#define R7 1  //RELÉ 7
#define R8 0  //RELÉ 8


/** PCF8574 instance */
PCF8574 expander;

/** setup() */
void setup() {

  /* Setup serial for debug */
  Serial.begin(9600);
  
  /* Start I2C bus and PCF8574 instance */
  expander.begin(0x38); DESKA RELÉ 8x
  
  /* Setup some PCF8574 pins for demo */
  expander.pinMode(0, OUTPUT);
  expander.pinMode(1, OUTPUT);
  expander.pinMode(2, OUTPUT);
  expander.pinMode(3, OUTPUT);
  expander.pinMode(4, OUTPUT);
  expander.pinMode(5, OUTPUT);
  expander.pinMode(6, OUTPUT);
  expander.pinMode(7, OUTPUT);


   expander.set();   // All RELE OFF
   delay(2000);
   expander.digitalWrite(R1, LOW); // Turn off led 1 // toto je jenom pokus, abych věděl jestli reagují relé podle čísel.
   delay(2000);
   expander.digitalWrite(R2,LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R3, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R4, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R5, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R6, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R7, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R8, LOW); // Turn off led 1
   delay(2000);
}
Jako první všechna relé vypnul, pak jsem jenom testoval funkci jednotlivých relé.
Ota

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Relé 8x - ovládání i2c

Příspěvek od ok1vkt » 11 bře 2018, 22:30

Mohl bych toto:

digitalWrite(PIN, !Vystup1);
digitalWrite(PIN, !Vystup2);

dat přimo do setupu??
Asi ne, viď? protože proběhne jen jednou

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Relé 8x - ovládání i2c

Příspěvek od ok1vkt » 11 bře 2018, 22:34

ohruska píše:
11 bře 2018, 22:26
Já jsem to řešil takto;

Kód: Vybrat vše

/**
 * This demo code demonstrate all functionnalities of the PCF8574 library.
 *
 * PCF8574 pins map :
 * 0: led
 * 1: led
 * 2: led
 * 3: button + pull-up resistor
 */

/* Dependencies */
#include <Wire.h>    // Required for I2C communication
#include "PCF8574.h" // Required for PCF8574

#define R1 7  //RELÉ 1
#define R2 6  //RELÉ 2
#define R3 5  //RELÉ 3
#define R4 4  //RELÉ 4
#define R5 3  //RELÉ 5
#define R6 2  //RELÉ 6
#define R7 1  //RELÉ 7
#define R8 0  //RELÉ 8


/** PCF8574 instance */
PCF8574 expander;

/** setup() */
void setup() {

  /* Setup serial for debug */
  Serial.begin(9600);
  
  /* Start I2C bus and PCF8574 instance */
  expander.begin(0x38); DESKA RELÉ 8x
  
  /* Setup some PCF8574 pins for demo */
  expander.pinMode(0, OUTPUT);
  expander.pinMode(1, OUTPUT);
  expander.pinMode(2, OUTPUT);
  expander.pinMode(3, OUTPUT);
  expander.pinMode(4, OUTPUT);
  expander.pinMode(5, OUTPUT);
  expander.pinMode(6, OUTPUT);
  expander.pinMode(7, OUTPUT);


   expander.set();   // All RELE OFF
   delay(2000);
   expander.digitalWrite(R1, LOW); // Turn off led 1 // toto je jenom pokus, abych věděl jestli reagují relé podle čísel.
   delay(2000);
   expander.digitalWrite(R2,LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R3, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R4, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R5, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R6, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R7, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R8, LOW); // Turn off led 1
   delay(2000);
}
Jako první všechna relé vypnul, pak jsem jenom testoval funkci jednotlivých relé.
Ota

No tohle je na te I2C sběrnici.... Ale ja hlavně nikde nevidim že bys otačel tu logiku. Tzn.- to že signálem LOW se relé sepne (což nechci, chci spínat High). Takže jakto funguje? to nic neotáči ne?

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Relé 8x - ovládání i2c

Příspěvek od ok1vkt » 11 bře 2018, 22:36

ok1vkt píše:
11 bře 2018, 22:34
ohruska píše:
11 bře 2018, 22:26
Já jsem to řešil takto;

Kód: Vybrat vše

/**
 * This demo code demonstrate all functionnalities of the PCF8574 library.
 *
 * PCF8574 pins map :
 * 0: led
 * 1: led
 * 2: led
 * 3: button + pull-up resistor
 */

/* Dependencies */
#include <Wire.h>    // Required for I2C communication
#include "PCF8574.h" // Required for PCF8574

#define R1 7  //RELÉ 1
#define R2 6  //RELÉ 2
#define R3 5  //RELÉ 3
#define R4 4  //RELÉ 4
#define R5 3  //RELÉ 5
#define R6 2  //RELÉ 6
#define R7 1  //RELÉ 7
#define R8 0  //RELÉ 8


/** PCF8574 instance */
PCF8574 expander;

/** setup() */
void setup() {

  /* Setup serial for debug */
  Serial.begin(9600);
  
  /* Start I2C bus and PCF8574 instance */
  expander.begin(0x38); DESKA RELÉ 8x
  
  /* Setup some PCF8574 pins for demo */
  expander.pinMode(0, OUTPUT);
  expander.pinMode(1, OUTPUT);
  expander.pinMode(2, OUTPUT);
  expander.pinMode(3, OUTPUT);
  expander.pinMode(4, OUTPUT);
  expander.pinMode(5, OUTPUT);
  expander.pinMode(6, OUTPUT);
  expander.pinMode(7, OUTPUT);


   expander.set();   // All RELE OFF
   delay(2000);
   expander.digitalWrite(R1, LOW); // Turn off led 1 // toto je jenom pokus, abych věděl jestli reagují relé podle čísel.
   delay(2000);
   expander.digitalWrite(R2,LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R3, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R4, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R5, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R6, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R7, LOW); // Turn off led 1
   delay(2000);
  expander.digitalWrite(R8, LOW); // Turn off led 1
   delay(2000);
}
Jako první všechna relé vypnul, pak jsem jenom testoval funkci jednotlivých relé.
Ota

No tohle je na te I2C sběrnici.... Ale ja hlavně nikde nevidim že bys otačel tu logiku. Tzn.- to že signálem LOW se relé sepne (což nechci, chci spínat High). Takže jakto funguje? to nic neotáči ne?
Joo takhle, ty mysliš jako že otáčí to pořadí relé... to je OK. To zrovna nějak neřeším, spiš mi jde o tu logiku spínání

ohruska
Příspěvky: 235
Registrován: 08 pro 2017, 20:56
Reputation: 0

Re: Relé 8x - ovládání i2c

Příspěvek od ohruska » 11 bře 2018, 22:43

Kód: Vybrat vše

expander.set();   // All RELE OFF
Toto vypne všechna relé

Kód: Vybrat vše

expander.clear(); // All RELE ON
Toto zapne všechna relé
Je to stále obrácená logika.
Mě tam jen vadilo, že po zapnutí byly všechna relé sepnutá. Tak jsem je hned v setup-u, po inicializaci vypnul.

petan
Příspěvky: 358
Registrován: 23 črc 2017, 10:19
Reputation: 0
Kontaktovat uživatele:

Re: Relé 8x - ovládání i2c

Příspěvek od petan » 11 bře 2018, 23:42

ok1vkt píše:
11 bře 2018, 22:30
Mohl bych toto:

digitalWrite(PIN, !Vystup1);
digitalWrite(PIN, !Vystup2);

dat přimo do setupu??
Asi ne, viď? protože proběhne jen jednou
Přesně jak říkáš.

Tímhle kódem fyzicky měníš stav výstupů (ten vykřičník před proměnnou jednoduše převrátí její stav). Je to tedy nutné volat při každém průchodu smyčkou loop. V setupu je vhodný všechny relé vypnout.
Možná nejlepší varianta je použít mezi Arduino a desku nějaký invertor. Něco jako CMOS 4049. Ten pak přímo otočí signály a nestane se ti že se všechny relé sepnou v případě že ti Arduino vzdechne (i když u elektroniky nikdy nevíš :D )

ok1vkt
Příspěvky: 26
Registrován: 06 úno 2018, 16:29
Reputation: 0

Re: Relé 8x - ovládání i2c

Příspěvek od ok1vkt » 12 bře 2018, 00:14

petan píše:
11 bře 2018, 23:42
ok1vkt píše:
11 bře 2018, 22:30
Mohl bych toto:

digitalWrite(PIN, !Vystup1);
digitalWrite(PIN, !Vystup2);

dat přimo do setupu??
Asi ne, viď? protože proběhne jen jednou
Přesně jak říkáš.

Tímhle kódem fyzicky měníš stav výstupů (ten vykřičník před proměnnou jednoduše převrátí její stav). Je to tedy nutné volat při každém průchodu smyčkou loop. V setupu je vhodný všechny relé vypnout.
Možná nejlepší varianta je použít mezi Arduino a desku nějaký invertor. Něco jako CMOS 4049. Ten pak přímo otočí signály a nestane se ti že se všechny relé sepnou v případě že ti Arduino vzdechne (i když u elektroniky nikdy nevíš :D )
Přesně jak říkaš..... Ja sem do setupu ještě musel přidat definování pinů jako vystup samozřejmě. Bez toho mi to nemakalo :-) coz je škoda, zase o další řádky navíc.
Jinak jak si rekl, v setupu zapisuju na piny uroveň HIGH, aby rele zustaly v klidu. Pokud sem tam tento zapis neměl, tak se mi rele tak na vteřinu aktivovala, než došlo na loop kde se to neguje.
Mockrat díky za pomoc, ted uz mi zbyvají ještě definovat vstupy a bude to :-)

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti