Scheda Relè con Shift Register incorporato. Ogni tanto "salta" alcuni comandi

Salve a tutti.

Sono ancora alle prese con il mio progetto domotico. Tutto funziona, ma qualcosa non quadra con il controllo dei relè.
La scheda che ho costruito integra ShiftRegister e relè, più i vari connettori per collegare alimentazione 5V e 12V, GND, Data-Clock-Latch pin ed ovviamente i carichi dei relè. Premetto che mi sono accorto troppo tardi dell’esistenza degli ULN2803 (mea culpa), quindi i miei relè sono pilotati “alla vecchia maniera”, con resistenze e transistor.

Quindi abbiamo:

  • nr.8 relè G5LA-A-12V DC;
  • nr.1 Shift Register SN74HC595 pilotato tramite Clock, Data e Latch, /OE fisso a LOW, /MR fisso a +5V, Q7" non collegato;
  • RCLK (latch) con capacità da 1uF verso GND per limitare interferenze da spike;
  • Q0-Q7 collegati tramite resistenza da 4.7KOhm alle basi di transistor BC547. C’ è anche una resistenza di pulldown tra base e GND da 10KOhm;
  • emettitori dei BC547 collegati a GND, collettori collegati alla bobina del relè;
  • diodo di protezione per ogni relè;
  • in parallelo ad ogni bobina relè, ci sono anche un led rosso in serie ad una resistenza da 1KOhm

(Scusate se non posto uno schema chiaro, ma ho tutto solo su DesignSpark e devo dire di non essere un tipo molto preciso nella progettazione, quindi anche postando il mio schema, potreste trovarvi ancora peggio. Se serve, però, mi metto di impegno e ne preparo uno.)

Piloto il tutto con Arduino, il codice dello ShiftOut è leggermente modificato per fare altre cose, ma la sostanza è la seguente:

void shiftOut(int _latchPin, int _dataPin, int _clockPin, byte _val)
{
  int i;
  digitalWrite(_clockPin, LOW);
  digitalWrite(_dataPin, LOW); //test
  
  for (i = 0; i < 8; i++)
  {
    digitalWrite(_dataPin, !!(_val & (1 << (7 - i))));
    digitalWrite(_clockPin, HIGH);
    digitalWrite(_clockPin, LOW);
  }
  digitalWrite(_latchPin,LOW);
  delayMicroseconds(100); //delay per permettere alla capacità su latchPin di caricarsi
  digitalWrite(_latchPin,HIGH);
}

Detto questo, ecco il problema.
Capita alcune volte che lo Shift Register perda “colpi” e, nonostante i dati passati su DataPin siano tutti giusti, all’attivazione del LatchPin le uscite vengono messe tutte a LOW.
Aggiungo:

  • Sono sicuro che i dati passati siano giusti perché ho introdotto, in una versione di test, una serie di delay prolungati che mi hanno permesso, con un multimetro, di controllare ogni singolo dato passato ad ogni singolo clock (non ho un oscilloscopio, purtroppo, quindi mi sono arrangiato come ho potuto);
  • Inoltre, giusto per fare la prova del fesso, ho messo su breadboard uno shiftregister con 8 LED e l’ho collegato al posto della scheda sotto inchiesta. Mai avuto un singolo problema del genere: durante tutto il periodo di test, i LED che si accendevano erano quelli giusti;
  • Le “alcune volte” in cui il fenomeno capita, sono in realtà abbastanza rare, ma aumentano di frequenza se (non prendetemi per scemo, ma è vero!) il byte passato allo ShiftRegister ha il MSB che passa da 1 a 0. Mi spiego: uscite dello ShiftRegister B01000001 (esempio), accendo MSB, quindi passo allo ShiftRegister B11000001 ed ottengo le uscite corrette, dopodichè spengo MSB, quindi passo allo ShiftRegister B01000001, ma quello che ottengo come uscita è B00000000!!! :astonished: Mah…

Per completezza di informazione, tra Arduino e la scheda in questione ci sono circa 10metri di cavo schermato, ma ulteriori test mi fanno escludere che sia questo il problema. Se fosse un problema di perdita o distorsione di segnale lungo questi 10 metri di cavo, me ne sarei accorto durante il test effettuato introducendo i delay tra ogni singolo SRCLK. Ogni dato passato era leggermente al di sotto dei 5V, ma in ogni caso all’interno del range previsto dalla logica CMOS per far interpretare correttamente il segnale dallo Shift Register. Non dimentichiamo, infine, che ho fatto ulteriori test con Shift Register su breadboard, sempre alla fine di questi 10 metri di cavo, e non ho avuto alcun tipo di problema.
Per quanto concerne la parte “correnti in gioco”, dico che il datasheet dello SN74HC595 mi dice che è in grado di tirare fuori 20mA. Per pilotare i transistori ne dovrebbe servire circa 1mA, quindi anche qui siamo coperti.

Riassumendo, il problema è da ricercarsi all’interno della scheda che ho fatto, ma i calcoli mi dicono che tutto torna.

Non chiedo soluzioni prêt-à-porter, ma se qualcuno mi aiuta ad accendere qualche lampadina nella mia testa, gliene sarei grato!

Saluti.

provo abuttarla li.
quando fai i test vai piano, mentre in normale esercizio andando piu’ veloce iniziano i problemi.
prova ad aumentare il delay, e metterne magari anche uno tra un’operazione e l’altra, visto che i relè di loro non sono proprio dei fulmini.
potrebbe anche trattarsi di delay di propagazione, se un filo presenta una capacita piu’ alta degli altri, il cambiamento di stato arriva in ritardo, rispetto agli altri perdi sincronismo.
probabile che abbia detto na fesseria. (quasi sicuramente)
ciao.

Effettivamente questa cosa l'ho espressa in modo poco chiaro, ma il problema c'è anche quando "vado piano". E' proprio questo il punto: andando piano, ho appurato che i dati passati sono giusti, la tensione è corretta, il timing anche, ma nonostante tutto, la scheda costruita da me tira fuori tutte le uscite a LOW (non sempre, lo ribadisco), mentre la breadboard di test si comporta correttamente (SEMPRE). Questo praticamente mi permette di escludere a priori tutto ciò che viene PRIMA della scheda, concentrando gli sforzi solo sull'hardware. Quello che vorrei escludere con il vostro aiuto è un errore concettuale nel progetto della scheda, in modo da focalizzare gli sforzi sulla realizzazione hardware. Oppure invalidare completamente il metodo di troubleshooting portato avanti fino ad ora ed effettuare altri test da voi suggeriti per trovare problemi da qualche altra parte (lo escludo, ma non bisogna mai porre limiti alla Divina Provvidenza).

prova a sostituire l'integrato. vedi che tra le saldature non ci sia dei rimasugli di colofonia dei microcorti o saldature fredde. dopodichè io passo parola . ciao

L’integrato l’ho già sostituito (con quello della breadboard funzionante), ora smonto la scheda e controllo le saldature come mi hai detto (anche se questo test l’ho fatto appena l’ho costruita). Se fosse una saldatura fatta male, non mi torna lo stesso che questa cosa avvenga solo quando cambio il MSB del byte passato allo Shift Register.

se l'hardware è ok, allora cerca nel sotware. li è meglio che me ne sto zitto XD un'ultima cosa, metti un condensatore da 0,1uF a cavallo della alimentazione dell'integrato,il piu' vicino possibile, non costa molto ed a volte fa miracoli. ciao e auguri. poi facci sapere come risolvi così imparo anch'io.

Questo sistema non può funzionare a 10 metri con nessun tipo di cavo

per testare a velocità ridotta non ti funziona perchè devi mettere un delay tra ogni istruzione digitalWrite un delayMicroseconds(10);

goldx: se l'hardware è ok, allora cerca nel sotware. li è meglio che me ne sto zitto XD un'ultima cosa, metti un condensatore da 0,1uF a cavallo della alimentazione dell'integrato,il piu' vicino possibile, non costa molto ed a volte fa miracoli. ciao e auguri. poi facci sapere come risolvi così imparo anch'io.

Fratello, io ti voglio bene!!! Mentre saldavo il condensatore sull'alimentazione degli integrati, mi sono accorto che una pista dei 5V era discontinua (una cosa invisibile ad occhio nudo). Riparata quella, tutto funziona!!! Probabilmente, non so come, l'integrato riusciva ad alimentarsi con i pin dedicati ai segnali. Per @icio: il sistema funziona, fidati. Ed il cavo, a dire la verità, è anche più lungo...siamo sulla 15ina di metri. Per quanto riguarda il delay che hai detto, gli shift register sono in grado di reggere velocità anche più elevate. Fai conto che tra un digitalwrite ed un altro, anche se consecutivi, il codice in esecuzione impiega un tempo più che sufficiente per le necessità di quegli integrati. L'unico delay necessario è sul latch pin, perché c'è un condensatore verso GND, quindi se il latch non è sufficientemente lungo, il condensatore non fa in tempo a caricarsi.

Non va bene portare fuori un pin-expander sincrono a livello TTL in giro per il mondo, non ti lamentare se accendendo una lampada al neon o un motore arduino si resetta o si blocca

pdbc75...non sapevo di avere un fratello XD in tal caso, probabile che hai circa la mia eta' (65). tutto è bene quel che finisce bene. sono contento che hai risolto.

sono d'accordo con quel che dice icio, ma casomai quello lo vedi con il tempo. come si dice, visto che hai fatto 30, fai 31, due bei xbee e tu sai sicuramente come si fa (io no) e ti togli la paura :blush: ciao.