Relè 24Vac via I2c, dimensionamento

Avevo erroneamente risposto in un post troppo vecchio.
Ho modificato lo schema come da suggerimento di Brunello, è ora mi chiedevo quale potrebbe essere la soluzione per non lavorare con le uscite invertite..

Alla fine invertirò via software, nel mentre ho partorito questo PCB.
Visto che è il primo che faccio dopo una ventina di anni, ogni suggerimento è ben accetto

La soluzione più semplice è utlizzare il classico Darlington Array ULN2803.

Devi però considerare che in questa configurazione al momento che fornisci tensione al PCF tutte le uscite vanno alte e di concerto vengono attivati tutti i TRIAC, rimanendo tali finchè arduino non termina la fase di start-up e attiva la linea I2C.

A meno che non si debba attivare dei banali led, io in genere evito questa configurazione.

Guarda era esattamente il mio unico dubbio, non credo ci sia modo per ovviare alla condizione in startup.
Per l’unl ho bisogno di cercare info sul come utilizzarlo.
Grazie

Ho aggiunto l'ULN2803, dal datasheet non riesco a capire se sia sufficiente così

nonzod:
Ho aggiunto l'ULN2803, dal datasheet non riesco a capire se sia sufficiente così

La frase "la soluzione più semplice..." penso che intendesse dire che puoi togliere tutti i fotoaccoppiatori e usare solo lo ULN2803

Forse sarebbe più indicato un buffer inverter, tipo 74HCT540?

Perchè vuoi complicarti la vita.............
Che noia ti dà gestirli in modalità inversa ?
Oltretutto ti basta il PCF..
Altrimenti puoi metterci un 74HC540 o 74HC541, ma ti serve un pin in più, perchè devi gestire anche l' OE del 74HC54x, altrimenti hai sempre gli stessi problemi

ero anch'io con lo stesso problema, ma basta invertire la logica nel software ed impostarle su HIGH in Setup (in modo che stiano spente al primo avvio)e funzionano perfettamente senza aggiungere nessun altro modulo!!!

acuplush:
ero anch'io con lo stesso problema, ma basta invertire la logica nel software ed impostarle su HIGH in Setup (in modo che stiano spente al primo avvio)e funzionano perfettamente senza aggiungere nessun altro modulo!!!

Ma quando si avvia arduino le linee sono HIGH?
Dovendo pilotare un sacco di luci non vorrei un'accensione di tutto l'impianto allo startup

Quando accendi il tutto , le linee sono in Alta impedenza, pero' ( dipende da cosa ci metti dietro ) potrebbero essere interpretate come HIGH.

brunello22:
Quando accendi il tutto , le linee sono in Alta impedenza, pero' ( dipende da cosa ci metti dietro ) potrebbero essere interpretate come HIGH.

... se si ha paura di questa cosa, l'ideale è mettere comunque delle pull-down sui pin interessati in modo che, prima che il setup() abbia impostato i pin, comunque essi abbiano un valore prefissato (LOW) :wink:

Guglielmo

Edit: Invece, se si vuole essere sicuri che siano su HIGH, basta mettere delle pull-up ...
... dipende cosa si vuole all'avvio di Arduino.

nonzod:
Ma quando si avvia arduino le linee sono HIGH?
Dovendo pilotare un sacco di luci non vorrei un'accensione di tutto l'impianto allo startup

impostando in setup tutte le uscite che vanno ai relè su HIGH, quando accendo arduino i relè rimangono sempre diseccitati fino a quando verranno attivati dalla sequenza programmata.
invece prima mi succedeva che a volte si eccitavano per un attimo per poi diseccitarsi

No, ho detto una mezza cavolata

The power-on reset circuit resets the I 2C-bus logic with VCC< VPOR and sets all I/Os to logic high (with current source to VCC )

Quindi niente resistenze di PullUp-

All'accensione le porte sono HIGH
Quando imposti le porte come uscite, vanno il LOW
Le metti subito come HIGH e non hai nessun problema

nonzod:
Ho aggiunto l'ULN2803, dal datasheet non riesco a capire se sia sufficiente così

Così (schema del post #4) non si accende niente, le uscite dell'ULN non forniscono tensione ma chiudono a massa gli anodi dei LED.

steve-cr:
penso che intendesse dire che puoi togliere tutti i fotoaccoppiatori e usare solo lo ULN2803

Solo se può permettersi di collegare alla massa Arduino uno dei rami in alternata.

Ma infatti alla fine sono tornato alle origini, invertirò via SW.
Se avete modo mi date un parere sul PCB? Sono alle primissime armi dopo i tempi preistorici della scuola.

brunello22:
No, ho detto una mezza cavolata

Quindi niente resistenze di PullUp-

All'accensione le porte sono HIGH
Quando imposti le porte come uscite, vanno il LOW
Le metti subito come HIGH e non hai nessun problema

In effetti ho realizzato un circuito di test sul banco e, dopo il reset, per un attimo le uscite sono tutte High e si accendono tutti i led.
Questo è un problema abbastanza importante, non so se riesco a risolverlo via SW.
(sto usando questa libreria GitHub - xreef/PCF8574_library: PCF8574 library. i2c digital expander for Arduino, Raspberry Pi Pico and rp2040 boards, esp32, SMT32 and ESP8266. Can read write digital values with only 2 wire. Very simple to use and encoder support.)

Forse potrei risolvere con dei condensatori tra le uscite e vcc, ma non ho idea di come dimensionarli.

edit: Ho provato con degli elettrolitici da 100u e il picco scompare senza apparenti controindicazioni...

Io ti consiglierei vivamente di ritornare alla versione originale, eliminando il ULN2803 e pilotando gli optoisolatori direttamente dalle uscite del 8574, come hai presentato all'apertura del post.

A livello software la cosa è molto semplice. Come di norma, lo stato delle uscite lo rappresenti su una variabile “byte”.
Durante il loop gestisci i vari bit della variabile in modo non invertito, poi al momento di scrivere sulla periferica PCF8574 anteponi alla variabile il carattere “~” per ottenere l'inversione dei bit.

Wire.write(~VarData);

In questo modo si va a compensare l'inversione hardware provocata dal circuito che pilota gli opto, e tutto ritorna ad essere allineato al contenuto della tua variabile.

A titolo esemplificato allego codice

#include <Wire.h>


byte VarAddr = 0x20;    // indirizzo PCF8574
byte VarData = 0;       // variabile dello stato delle uscite

void setup() {

  Wire.begin( );                       // Inizialiazzazione bus  I2C

  Wire.beginTransmission(VarAddr);    // apre connessione I2C con periferica 
  Wire.write(~VarData);               // inverte valore e quindi forza i bit allo stato HIGH (led spenti)
  Wire.endTransmission();             // chiude connessione

}

void loop() {

  VarData ++;                         // modifica contenuto per ottenere variazioni
  Wire.beginTransmission(VarAddr);    // apre connessione I2C con periferica 
  Wire.write(~VarData);               // inverte valore e quindi forza i bit allo stato HIGH
  Wire.endTransmission();             // chiude connessione

  delay (500);                        // crea una pausa
}

Lascia perdere condesatori, resistenza pull-pp o pull-down ed ogni altra modifica.

I pin del PCF8574 li devi vedere, seppure in modo semplificato, connessi ad un transistor che chiude verso massa ed una resistenza di pull-up.

lelebum:
Io ti consiglierei vivamente di ritornare alla versione originale, eliminando il ULN2803 e pilotando gli optoisolatori direttamente dalle uscite del 8574, come hai presentato all'apertura del post.
....

Si come scritto sopra, alla fine non uso più l'ULN, il problema è relativo allo startup dell'8574 che mi fa "flashare" i led (nel circuito di test ho messo dei led come carico al posto del MOC).
Io dovrei evitare che i relé (nel circuito finale il tutto va a pilotare del relé a 24V) si attivino tutti insieme allo startup.