La scheda di Output per Arduino
La scheda di Output per il sistema domotico realizzato con Arduino – Espandere le uscite della scheda arduino – Fino a 14 uscite per ogni integrato.
Pur non essendo il cuore di questo progetto, dal punto di vista software è stata la realizzazione piu’ complessa che mi ha permesso di ottenere una scheda adatta per una molteplicità di applicazioni che necessitano di temporizzazioni. In pratica tale scheda può essere utilizzata in molteplici circuiti, da robot all’antifurto di una automobile nonchè per creare fantastici giocattoli animati.
Nel progettarla ho cercato di fare una scheda capace di gestire stili di temporizzazione diversi (fisso, lampeggiante, pulsante ecc) e comandabile semplicemente con lo standard I2C, proprio per utilizzarla in una molteplicità di progetti.
La scheda di Output per Arduino descritta in questo progetto è basata sulla CPU atmega328 con arduino bootloader. Il software che ho progettato per questa CPU rimane in attesa di comandi I2C e quindi imposta il comportamento di ognuno dei suoi 14 pin.
Con questi comandi ogni pin può essere acceso o spento, immediatamente o con ritardo, per sempre o per determinato tempo. Come si vede nella foto, la scheda è formata tre sezioni identiche ognuna contenete una CPU in modo tale da indirizzare ben 42 pin (3 ATMEGA328 * 14 pin = 42 pin totali).
Tuttavia è possibile aggiungerne altre incrementando 14 pin per ogni CPU. Fino a 8 CPU il software da caricare in ogni CPU è lo stesso poichè l’indirizzo I2C è impostabile collegando a 0 o 1 tre dei suoi piedini analogici. Per piu’ di 8 CPU è necessario modificare l’indirizzo base I2C di partenza del programma.
In pratica occorrerà caricare il programma *.pde alle prime 8 cpu, modificare l’indirizzo di partenza i2c e ricaricare il programma alle successive 8 cpu e continuare così per tutti i gruppi di 8 cpu.
Un ulteriore ingresso analogico è destinato per lo zero detection. Nel progetto ai 14 pin di uscita, tramite un transistor, vengono collegati dei relè collegati al 230V. La caratteristica negativa dei relè è la generazione delle extratensioni quando i suoi contatti commutano all’intorno della cresta dell’onda sinusoidale del 230V. Tale fenomeno oltre a rovinare i contatti dei relè producono degli spike (disturbi) che possono inficiare sul comportamento di altre apparecchiature elettroniche.
Per ridurre al minimo tale fenomeno, il progetto dispone di una entrata analogica per il zero detection al fine di calcolare il momento migliore per la commutazione. Il programma è progettato per attendere 6ms dalla rilevazione dello zero prima di attivare il relè. Dato che tipicamente il relè impiega 4ms per attivarsi avremo che la dal primo passaggio per lo zero alla attivazione passino 6ms+4ms ovvero 10 ms cioè il proprio il tempo in cui l’onda sinusoidale del 230V ritorna allo 0V e quindi commuta senza tensione e quindi corrente sui contatti. Per la disattivazione del relè invece dato che tipicamente questi impiegano 7ms, il tempo di attesa prima del rilascio è quindi di soli 3ms.
Però quanto detto rappresenta una condizione ideale. Questo perchè il circuito di zero detection può introdurre qualche ms di ritardo e i relè non commutano con il ritardo tipico indicato. Per ovviare a queste problematiche diventa necessario modificare i tempi indicati nel programma *.pde fino a ridurre al massimo le scintille sui contatti dei relè (modo empirico su base statistica da fare se non si dispone di strumenti di misurazione adatti allo scopo). Tuttavia la scheda funziona anche in assenza di un circuito esterno di zero detection poichè in ogni caso il programma dopo 15ms (un ciclo e mezzo) senza impulsi sul pin zero detection commuta comunque. L’assenza di un circuito Zero detection è consigliato per collegare apparecchiature caratterizzate da un forte assorbimento di potenza elettrica quali pompe, lavatrici, forni ecc.
Ma ritorniamo ora al comportamento principale del circuito. Come accennato le temporizzazioni sono alla base di molti circuiti elettronici. Ad esempio gli antifurti accendono per un certo tempo una sirena, oppure attivano funzionalità dopo un certo tempo per lasciare tempo al proprietari di disattivarlo prima di attivare le sirene. Un altro esempio i robot che a secondo dei sensori attivati avanzano e indietreggiano attivando i motori per un tempi prestabiliti.
Da questo presupposto, l’idea di fare un circuito elettronico dedicato ad accendere e spegnere le sue uscite, dopo e per un certo tempo, facilmente comandabile mediante il protocollo I2C.
In particolare il circuito permette di comandare fino a 14 pin accendendoli
1) immediatamente,
2) dopo un certo ritardo,
3) immediatamente per un certo tempo,
4) dopo un certo ritardo e per un certo tempo
Anche la modalità di accensione del pin è varia e può essere:
1) acceso fisso
2) acceso lampeggiante lento
3) acceso lampeggiante veloce
4) acceso lampeggiante lento e negli ultimi 5 secondi prima di spegnersi, cambio della velocità di lampeggio a veloce
5) acceso, un lampeggio singolo ogni 20 secondi
6) acceso lampeggiante in sequenza un lampeggio ogni 5 secondi per 4 volte e poi 4 lampeggi veloci.
7) acceso lampeggiante lampeggi veloci.
8) Spento
Come funziona
Mediante il protocollo I2C si passa il comando al chip e questo si occupa di tutta la fase dela gestione del pin. Per comprendere passando il comando //23580 si ottiene che il pin 2 (dei 14 disponibili) lampeggi lento (comando 3) dopo secondi e per 8 secondi dopo di cui il pin va a 0.
La descrizione dei comandi è nella sezione successiva.
L’animazione a lato dovrebbe dare l’idea del funzionamento. Il comando I2C arriva lungo il bus rappresentato dalla freccia rossa. Le CPU del circuito intepretano il comando quindi accendono il pin corrispondente.
In questa animazione per chiarezza non sono rappresentati tutti i comandi possibili ma solo alcuni.
Comandi di temporizzazione.
I comandi passano dati su quale pin accendere, dopo il tempo, per quanto tempo e come deve essere lasciato il pin alla fine.
Guardando il grafico, l’istante indicato da t0 è il momento in cui arriva il comando, il tempo di ritardo è rappresentato da t1-t0 in verde. Il tempo di accensione è rappresentato da t2-t1 in blu e il tempo da t2 in poi , in rosso è il tempo dopo al comando.
La scheda accetta il comando, lascia invariato il pin che può essere a zero oppure ad uno per tutta la durata del tempo di ritardo. Poi lo accende o spegne in funzione del valore in pin lampeggio e lo mantiene tale per tutta la durata di Pin T accensione. Al termine lo imposta come indicato nel valore Pin stato finale.
Per creare i comandi si usa la seguente sintassi:
/ / Pin StileLampeggio Tritardo Taccensione StatoFinale
(sostituire quanto contenuto tra <> (comprese) con i valori della tabella seguente espressi in esadecimale in un byte)
Fixed |
Pin |
StileLampeggio |
T ritardo |
T accensione |
StatoFinale |
//
Due caratteri fissi |
Numero del pin da accendere, da 0 a 13 |
Come deve lampeggiare il pin: 0=spegni 1=Accendi 2=Inverti lo stato; se 1 lo metti a 0 e viceversa.
Valorizzato a 2 il ritardo funziona ma poi cambia lo stato e basta. Non si reimposta alla fine del tempo di accensione che quindi può essere valorizzato a qualsiasi valore diverso da zero. .
|
quanto ritardo
Dopo quanti secondi si deve attivare.
Da 0 a 255 (ovvero 4 minuti e 15 secondi al massimo) .
|
quanto deve rimanere acceso
Dopo quanti secondi il pin ritorna allo stato precedente al comando.
Da 0 a 254 secondi; oppure sempre acceso se valorizzato a 255.
Attenzione impostare 255 significa sempre acceso.
Comandi con questo valore a zero non vengono eseguiti.
|
A quale stato deve andare al termine del tempo di ritardo + tempo di accensione:
0=alla fine va a zero 1=alla fine va a uno 2= ritorno allo stato precedente al comando.
Questo valore è ignorato per Pin Lampeggio 2 (cambio stato che viene fatto sempre una sola volta al termine del tempo di ritardo) |
Qualche esempio (i valori dentro le <> devono essere passati in binario. Esempio <255> passare un byte con tutti i bit a 1. il bit meno significativo è a destra).
Comando | Descrizione | Stato del pin in uscita |
//<13><1><0><255><0> | Prendi il pin 13 (<13>), lo accendi (<1>), lo fai subito (<0>), e lo mantieni acceso (<255>). | |
//<6><1><5><25><0> | Prendi il pin 6 (<6>), lo accendi (<1>), dopo 5 secondi (<5>), e lo mantieni acceso per 25 secondi (<25>) e infine lo spegni <0>. | |
//<7><2><0><x><0> | Prendi il pin 7 (<7>), Gli cambi lo stato; Se acceso lo spegni o se spento lo accendi (<2>), lo fai subito (<0>), e lo lasci stare così indipendentemente dal valore dell’ultimo byte <x> che quindi può assumere qualsiasi valore diverso da zero. Per il comando lampeggio = 2 lo stato finale non è necessario tuttavia è necessario passargli comunque un valore. | |
//<3><2><5><x><0> | Prendi il pin 3 (<3>), Gli cambi lo stato; Se acceso lo spegni o se spento lo accendi (<2>), lo fai dopo 5 secondi (<5>), e lo lasci stare così indipendentemente dal valore dell’ultimo byte <x> che quindi può assumere qualsiasi valore diverso da zero. | |
//<3><5><5><8><0> | Prendi il pin 3 (<3>), attivagli il lampeggio veloce <5> , lo fai dopo 5 secondi (<5>), e per 8 secondi <8> ed al termine lo imposti a zero. | |
//<3><5><5><8><1> | Prendi il pin 3 (<3>), attivagli il lampeggio veloce <5> , lo fai dopo 5 secondi (<5>), e per 8 secondi <8> ed al termine lo imposti a uno. |
Da considerare che:
1) in caso di sovrapposizione di comandi, l’ultimo comando valido ad un determinato pin sostituisce il comando precedente.
2) Dato che non ha senso accendere un pin per zero secondi, tutti i comandi che hanno come tempo di accensione il valore zero sono immediatamente ignorati.
3) È possibile inviare //****0** per invertire i livelli di uscita dei pin. In questo modo i pin vanno a 0 quando sono accesi e rimangono a 1 quando sono spenti. Inviando //****1** si riportano i pin allo stato normale (ovvero togli l’inversione).
L’hardware
Vediamo ora il circuito. Usa tre CPU ATMEGA328 con arduino bootloader. Ogni CPU ATMEGA328 ha al suo esterno solo pochi componenti necessari per farlo funzionare; il quarzo da 16Mhz, due condensatori da 22pf e l’immancabile filtro capacitivo formato da altri due condensatori da 100.000pf vicinissimi alla CPU. Infine una resistenza ed un led collegato ad ogni pin di uscita per avere indicazioni visive sullo stato dei pin.
La semplicità de circuito è conseguenza al fatto che tutte le funzioni sono svolte dal software caricato nella CPU e sia perchè la CPU è priva di ogni parte aggiuntiva come ad esempio l’hardware di comunicazione USB, la cui mancanza obbliga a caricare il software alla CPU mediante una scheda arduino diecimila.
Come realizzare la scheda
Stampate il circuito e replicatelo su una basetta millefori. Cercate di rispettare fedelmente le misure disponendo i pezzi esattamente come indicato. Iniziate a saldare i pezzi incominciando dai pezzi piu’ bassi. Armatevi di pazienza per collegare tutti i fili necessari. Ho usato e personalmente consiglio fili recuperati da un multi coppia telefonico i cui fili sono colorati e offrono una sufficente resistenza e rigidità che favorisce il posizionamento in fase di saldatura.
Come caricare il software sull ATMEGA328.
Per caricare il software su questi integrati si deve ricorre alla scheda arduino diecimila. Da questa si deve estrarre la Cpu dallo zoccolo mediante un piccolo cacciavite piatto e poi inserirci sopra ogni altra CPU da programmare.
Preparare un computer collegato tramite usb all’arduino diecimila, con il software IDE Arduino scaricabile da www.arduino.cc nella sezione download (mentre scrivo è alla versione 0022).
Caricare nell’ IDE arduino il programma *.PDE (nell’IDE è chiamato Sketch), appoggiare la cpu atmega 328 con arduino bootloader (si acquistano su internet ad un costo di circa 6 euro l’una) sulla scheda arduino diecimila (tenerla con un dito in modo che tutti i pin facciano contatto ma non spingerla a fondo nello zoccolo in modo da estrarla velocemente al termine della programmazione) e infine cliccare l’icona con la freccia verso destra per caricare il software nella CPU ATMEGA328. Ripetere il tutto per ogni CPU, ed inserirle nella scheda hardware.
Terminate tali operazioni la scheda è pronta. Per testarla utilizzate un altro arduino per passargli comandi I2C e quindi vedere i led collegati ai pin accendersi.