Indice |
Abstract
Sono innumerevoli i prgetti di orologi digitali realizzati mediante dispositivi elettronici tradizionali o programmabili; il progetto di marco438, Uno "strano" OROLOGIO DIGITALE, è la dimostrazione di come con pochi componenti, tanta pazienza e buone basi di elettronica, si può arrivare ad ottenere un ottimo risultato. Quello che voglio proporre io è, per così dire, l'alter ego di quel progetto, visto in chiave PICMicro. Obiettivo di questo progetto è dimostrare come, con altrettanto pochi componenti, sia possibile creare un'applicazione divertente ed anche utile. Infatti, oltre a segnare l'ora, l'obiettivo è quello di realizzare una sveglia.
Le specifiche
Si vuole realizzare un orologio digitale con queste caratteristiche:
- alimentazione a batteria;
- funzionamento a basso consumo;
- controllo livello tensione di batteria;
- dotato di dispositivo acustico per sveglia;
- dotato di un sistema RTCC per il mantenimento dell'ora;
- possibilità di regolare l'orario e l'ora della sveglia;
- estrema facilità di utilizzo;
- visualizzazione su display a 7 segmenti;
- possibilità di impostare un orario di sveglia;
- segnalazione acustica allo scadere dell'orario di sveglia;
- aspetto estetico "accattivante".
Alcuni aspetti di questo progetto sono stati trattati in altri articoli, pertanto per gli approfondimenti rimando alla lettura dei testi indicati in bibliografia.
Schema elettrico
In figura è proposto lo schema elettrico dell'orologio; il circuito si basa su di un PIC18F4520 alimentato a batteria (pacco batteria da 4 stilo). Il dispositivo DS1302 è deputato a "tenere l'ora", scaricando il PIC dall'incombenza di dover svolgere questa funzione. La visualizzazione avviene mediante dei display a catodo comune, pilotati in multiplexing.
I quattro display segnalano decine e unità delle ore seguiti da decine e unità dei minuti. Al display delle unità delle ore è collegato anche il punto decimale, utilizzato anche per segnalare i secondi che trascorrono. Il segnale di allarme della sveglia viene emesso da un buzzer piezo, dotato di oscillatore integrato.
Il controllo della tensione di batteria è affidato alla coppia D1-R2, come già indicato in un precedente articolo.
Un pulsante, un LED ed un encoder rotativo (dotato di pulsante assiale), completano la scheda.
Pulsanti ed encoder
Per le impostazioni dell'ora e di quella della sveglia, ho pensato di utilizzare un encoder rotativo con pulsante, come quello di figura.
La rotazione dell'albero dell'encoder genera due onde quadre sfasate di 90° elettrici.
La gestione dell'encoder è affidata a una routine di interrupt che rileva la transizione di un canale e acquisisce lo stato dell'altro canale. Ne consegue che se i due canali hanno lo stesso valore logico alto, il senso di rotazione è ad esempio orario; qualora i due segnali abbiano valori logici discordanti, il senso di rotazione è l'opposto, cioè antiorario.
Il prototipo in allestimento r
A little bit of firmware
Il codice è scritto in C, con C18 di Microchip. Si compone di diversi file, tra cui un driver per la gestione del display a sette segmenti. Il driver è in grado di scrivere anche alcuni caratteri sul display, permettendo brevi messaggi di saluto (come quelli che si vedono, nel filmato, all'avvio dell'orologio). Sulla scheda trova posto un DS1302, pertanto ho provveduto a inserire del codice per la lettura e la scrittura dei dati per quel chip. Con un paio di macchine a stati, si riesce a implementare la gestione dell'ora e della sveglia, comprese le operazioni per impostare i valori
ClrWdt(); rtc_get_time(); rtc_get_date(); // Clock state machine cycle switch (ClockState) { case IDLE: StateIdle (); break; case SETUPCLOCK: SetupClock (); break; case SETUPCLOCKHOURS: SetupClockHours (); break; case SETUPCLOCKMINUTES: SetupClockMinutes (); break; case SETUPALARM: SetupAlarm (); break; case SETUPALARMHOURS: SetupAlarmHours (); break; case SETUPALARMMINUTES: SetupAlarmMinutes (); break; case SHOWDATE: ShowDate(); break; } ClrWdt(); // Alarm state machine cycle switch (AlarmState) { case ALARM_IDLE: AlarmIdle(); break; case ALARM_ON: AlarmOn(); break; } }
Go To Sleep and Watch Dog Timer
Al fine di mantenere i consumi al valore più basso possibile, si è reso necessario l'utilizzo di qualche stratagemma. In particolare, l'adozione della funzione "sleep" e l'uso del Watch Dog Timer (WDT). Con la funzionalità di sleep, il microcontrollore entra in uno stato di "sonno"; così come accade per l'Uomo e gli animali, durante il sonno il battito cardiaco rallenta, le funzioni locomotorie sono inibite ma i sensori restano attivi. Ciò significa che, quando dormiamo, se qualcuno parla a voce alta, il senso dell'udito percepisce il suono e lo trasmette al cervello, il quale ci fa destare dal sonno (a volte in modo indesiderato). Analogamente, il PIC deve essere svegliato periodicamente, per poter svolgere alcune funzionalità altrimenti impossibili da svolgere dormendo. Ad esempio, ruotando il pomelllo dell'encoder, il PIC si sveglia e compie queste azioni:
- legge l'ora dal modulo DS1302;
- misura lo stato di tensione della batteria;
- mostra l'ora sul display alternata alla scritta "bAtt";
- aspetta 3 secondi;
- spegne tutto e torna di nuovo in sleep.
Per poter risvegliare il PIC è necessaria una sollecitazione esterna, come la rotazione dell'albero di encoder, gestita automaticamente dall'hardware del microcontrollore. Questo sarebbe sufficiente se ci si limitasse a mostrare l'ora. Dovendo anche far suonare la sveglia, all'orario prestabilito, è necessario che saltuariamente il PIC si svegli autonomamente, controlli l'ora e se questa coincide con quella della sveglia, attiva il buzzer (facendo suonare la sveglia), altrimenti torna in modalità sleep. Il Watch Dog Timer, o WDT, è un timer specifico che può essere programmato per risvegliare il PIC quando si trova in modalità di sleep. L'attivazione del WDT e la sua programmazione sono quindi parti fondamentali del firmware.
void GoToSleep (void) { PORTD = 0x00; T0CONbits.TMR0ON = 0; T1CONbits.TMR1ON = 0; T2CONbits.TMR2ON = 0; GoToSleepFlag = 1; Sleep(); T0CONbits.TMR0ON = 1; T1CONbits.TMR1ON = 1; T2CONbits.TMR2ON = 1; ClrWdt(); }
Meccanicamente
L'aspetto estetico l'ho curato io. Può piacere o no, ma a me piace e sono contento di come è riuscito il tutto. Ho pensato ad una lamiera di 1 mm di spessore, tagliata e sagomata come si vede dalle fotografie. La scheda rimane sostenuta da quattro viti elettrosaldate (in gergo "prigionieri") ed è mantenuta distante dal piano frontale grazie a quattro tubetti in plastica, ottenuti da una cannuccia per bibite.
I display sono celati dietro ad una mascherina di plexiglass trasparente rossa, opportunamente sagomata. Con righello e computer ho poi realizzato e stampato su carta adesiva quanto sta sul piano anteriore. Il pulsante di arresto allarme è collocato in corrispondenza della scritta GO. Il risultato è quello che si vede qui di seguito:
Il pacco batterie viene mantenuto fermo in posizione grazie ad un po' di nastro bi-adesivo; il LED che indica se la sveglia è stata puntata trova spazio nella parte inferiore dell'orologio.
Come funziona
Come dettato dalle specifiche, ho voluto fortemente che l'utilizzo dell'orologio-sveglia fosse il più semplice possibile. Gli utenti di questo progetto sono infatti, in primis, miei bambini. Dato che l'orologio va in modalità sleep dopo pochi secondi, per poter vedere l'orario impostato è sufficiente ruotare l'encoder o premere uno dei due pulsanti.
Per impostare l'ora si opera come segue:
1. si preme e si mantiene premuto per almeno 3 secondi il pulsante dell'encoder;
2. quando su display compaiono le ore, mediante la rotazione dell'encoder si imposta l'ora;
3. una volta che l'ora è stata impostata, premendo il pulsante dell'encoder si passa all'impostazione dei minuti;
4. quando su display compaiono i minuti, mediante la rotazione dell'encoder se ne impostano i valori;
5. la pressione del pulsante dell'encoder termina la sessione.
Per impostare l'orario della sveglia, si opera come segue:
1. si preme e si mantiene premuto per almeno 3 secondi il pulsante dell'encoder unitamente al pulsante di reset allarme;
2. quando su display compaiono le ore, mediante la rotazione dell'encoder si imposta l'ora;
3. una volta che l'ora è stata impostata, premendo il pulsante dell'encoder si passa all'impostazione dei minuti;
4. quando su display compaiono i minuti, mediante la rotazione dell'encoder se ne impostano i valori;
5. la pressione del pulsante dell'encoder termina la sessione.
Dato che dopo pochi secondi il PIC si mette "a dormire" e spegne tute le periferiche, per vedere che ora è, si rende necessario "svegliare il PIC", ruotando o premendo il pomello dell'encoder. Se invece si vuole sapere a che ora è stata impostata l'ora della sveglia, basta premere il pulsante di reset sveglia; se contemporaneamente il LED si accende, vuol dire che la sveglia suonerà all'ora indicata.
Se la tensione di batteria scende sotto un valore prefissato, la segnalazione "bAtt" compare sui display, indicando appunto che le batterie si stanno pian piano esaurendo.
Questo video mostra l'utilizzo dell'orologio e come si punta la sveglia.
Nuove funzionalità
L'utilizzo di un Real Time Clock Calendar come DS1302 comporta diversi vantaggi, tra cui la possibilità di disporre anche della data nel formato giorno/mese/anno e giorno della settimana. Al momento della pubblicazione di questo articolo, le funzionalità del calendario non sono state ancora sviluppate ma conto di farlo non appena possibile.
Conclusioni
Oggettivamente pensavo che la realizzazione di un orologio fosse una cosa più semplice. A rendere le cose più complicate sono forse le specifiche che io stesso mi sono dato e che mi hanno imposto determinate scelte tanto a livello elettronico quanto a livello firmware. Non escludo che si sarebbero potute intraprendere altre strade progettuali, a partire dal non utilizzo di un modulo RTCC dedicato e via via altre considerazioni. Qualunque fossero state le scelte effettuate, fissate le specifiche l'importante era centrare gli obiettivi ed arrivare al termine del progetto.
Download or not download ?
Non è mia prassi, ma questa volta non ho intenzione di riportare i dati del firmware completo, fin tanto che non è stato ottimizzato. Sono infatti intenzionato a migliorarlo al fine di renderlo più performante. Quindi si tratta di attendere un po'...
Ringraziamenti
Per questo lavoro, soprattutto per gli aspetti meccanici, devo ringraziare alcuni amici che mi hanno aiutato nella realizzzione di talune parti:
- Salvatore C., per il taglio della lamiera, le forature e la mascherina di plexiglass rossa;
- Matteo C., per lo sviluppo del percorso CAM della mascherina di plexiglass rossa;
- Pasquale R., per la piegatura della lamiera;
- Sabata P., per l'applicazione delle viti elettrosaldate.
Un ringraziamento va inoltre al maestro, e mio caro amico, Ides il quale, presso i suoi studi "ZANIDES", mi ha permesso la registrazione audio della cover presente nel video.
Bibliografia
- Datasheet PIC18F4520: http://ww1.microchip.com/downloads/en/DeviceDoc/39631E.pdf
- Ambiente di sviluppo MPLAB: http://www.microchip.com/mplab
- Compilatore C18: http://www.microchip.com/C18
- Sito web PicExperience
- Collana "LO HAI MAI REALIZZATO CON UN PIC?":
- Il contamarce
- Una sorpresa musicale per Babbo Natale
- Una tecnica antirimbalzo
- Il dado elettronico
- Un approccio ai timer dei PICMicro
- I PIC e i segnali analogici: la conversione A/D
- Generare segnali PWM con i PICMicro
- La lampada SIBILLA!
- Una tecnica di misura della tensione di batteria
- Il PIC tiene la data e l'ora
- Una prima occhiata a SDCC
- Pillole di microcontrollori PIC: