LO SCAFFALE DEGLI HOBBY

Appunti On Line

AVVERTENZE da leggere attentamente


ARDUINO

L'orologio di cartone


Cosa succede se in ufficio serve un orologio ben visibile da parecchi metri di distanza… e qualcuno per caso butta via una scatola di cartone con disegnato un bellissimo quadrante lucido di circa venti centimetri di diametro?

Succede che se si conosce Arduino, non si può assolutamente resistere alla tentazione di prendere una manciata di LED ultraluminosi su e-bay, un modulo RTC, e assemblare un “finto” orologio… che però è un vero orologio.

foto


L'hardware

Il progetto ruota attorno a un Arduino pro mini clone (ATMEGA328P 5V 16MHz) e a un modulo RTC DS3231 con bus i2c e batteria tampone. Il tutto montato su un residuo di basetta sperimentale millefori, a sua volta fissata nella scatola con semplice colla a caldo.

foto

Il regolatore di tensione 7805 è stato “alettato” per scrupolo, ma non diventa neppure tiepido. Il trimmer 2.2kΩ sulla sinistra serve per regolare il volume, ma alla fine non serviva, una semplice resistenza 100Ω in serie all’altoparlante è sufficiente per ottenere l’intensità sonora voluta.

foto

Tre pulsanti permettono di entrare/uscire dalla modalità regolazione, regolare l’ora e regolare i minuti. L’entrata e l’uscita dalla modalità regolazione è accompagnata da un motivetto musicale. Il pulsante di regolazione dei minuti dispone di autorepeat. L’ora e i minuti aggiornati vengono scritti nell’RTC ad ogni pressione dei pulsanti di regolazione.

Trattandosi di un orologio “da battaglia”, ad ore precise vengono suonate l’adunata, il rancio e la libera uscita. Inoltre fuori dall’orario di lavoro non visualizza più l’ora, ma un semplice effetto “luci rotanti”.

Il display è composto da 60 LED rossi ultraluminosi comandati in charlieplexing tramite nove linee. Quelli delle ore sono da 5mm, mentre quelli dei minuti da 3mm.

foto

Per leggere sia le ore che i minuti con un’unica corona circolare, il LED che indica l’ora rimane acceso fisso, mentre quello dei minuti lampeggia a 1Hz. Ok, quando il LED dell’ora e quello di minuti coincidono, per quel minuto si vede solo quello fisso dell’ora.

Naturalmente non è “radio controlled” come l’orologio “vero” che c’era nella scatola (che ironicamente è finito inutilizzato in fondo a un armadio), ma la precisione dell’RTC (pochi secondi di errore al mese) è più che sufficiente.

Lo schema elettrico visibile nel disegno seguente (cliccare per ingrandire) è veramente ridotto all’osso. I tre pulsanti normalmente aperti sono collegati a tre ingressi con resistenza di pull-up interna. Il bus i2c tra Arduino e RTC vista la ridotta distanza non richiede resistenze di pull-up esterne. L’altoparlante è comandato tramite un transistor in configurazione inseguitore di tensione, che funziona da amplificatore di corrente perché i 40mA richiesti per l’altoparlante sono troppi per un’uscita di Arduino. Questo è uno dei pochi casi in cui non serve una resistenza in serie alla base del transistor. Un diodo 1n4148 elimina eventuali extratensioni negative prodotte dalla bobina dell’altoparlante. Un diodo 1n4007 in serie all’alimentazione 12V protegge da eventuali inversioni di polarità

schema

Nove terminali di Arduino (linee A..I) vengono usati per comandare i LED con il metodo charlieplexing. In pratica si fornisce alimentazione positiva (uscita HIGH) una riga alla volta. Ogni riga fa capo agli anodi di otto LED. Si portano a massa (uscite LOW) le linee corrispondenti ai catodi dei LED che si vogliono accendere, mentre si tengono in alta impedenza (configurate INPUT) quelle dei catodi dei LED che si vogliono tenere spenti.

Con questo sistema si possono comandare fino a nove gruppi di otto LED (72 LED totali), ma per l’orologio sono sufficienti solo otto gruppi, di cui l’ultimo composto da soli quattro LED.

Il charlieplexing, come il multiplexing, richiede che le varie linee vengano alimentate a rotazione in rapida sequenza, in modo che ogni gruppo venga alimentato per pochi millisecondi almeno venti volte al secondo (50Hz).

Il software dell’orologio svolge questa funzione e cambia la linea attiva (e quindi il gruppo di LED gestiti) ogni due millisecondi. Questo significa che l’intero display viene aggiornato 62.5 volte al secondo.

La foto seguente mostra in particolare il cablaggio dei diversi gruppi di LED. Gli anodi sono tutti all’esterno e fanno capo alle nove linee attraverso le resistenze di limitazione da 150Ω.

foto

È importante che i LED siano del tipo ultraluminoso, perché vengono accesi solo per due millisecondi ogni 16 millisecondi (duty cycle 12.5%). I LED “normali” potrebbero risultare poco luminosi. Questi invece, nonostante il basso duty cycle, risultano perfettamente visibili a oltre quindici metri di distanza (parliamo sempre di ambiente “indoor”).

Per ridurre l’eccessiva direzionalità sono stati leggermente smerigliati con della carta vetrata, in modo da non risultare completamente trasparenti e diffondere la luce su un raggio più ampio.



Nota sull'RTC

Questi moduli normalmente hanno un circuito di ricarica previsto per pile ricaricabili LIR2032, ma vengono invece venduti con pile non ricaricabili CR2032.

A causa di questo si sono verificate esplosioni di pile CR2032 su circuiti alimentati a 5V.

Per risolvere definitivamente il problema basta alimentarli a 3.3V, oppure usare una pila ricaricabile, oppure escludere del tutto il circuito di ricarica, che è formato da una semplice serie diodo più resistenza (i componenti evidenziati nella figura seguente, il diodo è quello arancione):


Per escludere il circuito di ricarica è sufficiente asportare il diodo o la resistenza.

E già che ci siamo, ripassiamo anche le saldature del portapila perché è già capitato di trovarne difettose (una è quella appena sotto il diodo arancione).



Il software

Se l’hardware è ridotto all’osso, il merito è del software (come in generale in tutte le architetture programmabili). Di seguito il link allo “sketch”... nome davvero molto infelice scelto per indicare i programmi per Arduino, che infatti viene sempre stravolto in modi impensabili, screch, schertch, skrek, skect, scheck, sckretch, e, immancabilmente, lui:
shreck



“Noio” chiamiamolo invece per
quello che è: programma!

DOWNLOAD



Come detto prima, il display viene aggiornato completamente 62.5 volte al secondo, cioè ogni 16 millisecondi. Questi 16ms vanno divisi su otto gruppi di LED, quindi ogni gruppo è attivo per due millisecondi, poi tocca al gruppo successivo ecc.

L’intera struttura del programma deve essere pensata per poter garantire questo tempo periodico base con la maggior precisione possibile, anche se più operazioni diverse vengono portate avanti (apparentemente) in parallelo.

Questo si realizza solo strutturando l’intero programma sotto forma di piccoli “automi” a stati finiti che “collaborano” tra loro scambiandosi informazioni tramite variabili globali.

Il loop principale è ridotto a otto chiamate di funzione. Ogni funzione conserva il proprio stato di lavoro interno in variabili locali static, e comunica con le altre scrivendo o leggendo delle variabili globali.

Ad esempio la funzione play si occupa esclusivamente di suonare una melodia quando trova la variabile onPlay impostata a true. Mentre i dati per la melodia stessa sono contenuti in array di frequenze e durate.

Come si fa ad avviare una melodia? Si impostano i puntatori agli array desiderati e si imposta a true la variabile onPlay. Tutto qui. Poi il loop principale continua a richiamare play migliaia di volte al secondo permettendo alla funzione di portare avanti il proprio lavoro un passettino alla volta ad ogni “giro”. Quando la funzione ha finito i dati imposta di nuovo la variabile onPlay a false.

Questo vale per tutte la altre funzioni: quelle che fanno il debounce software dei pulsanti, quella che in base al pulsante premuto (o rilasciato) decide cosa far fare all’orologio, quelle che in base all’ora attuale decidono se deve suonare qualche melodia o se il display deve mostrare l’ora oppure solo un LED che gira, e naturalmente la funzione charlie che ogni due millisecondi cambia il gruppo di LED attivo sul display.

Per quanto riguarda il display, ogni LED è rappresentato con un bit dell’array di byte vidmem. La corrispondenza è ben evidenziata anche sullo schema elettrico. Per accendere o spegnere un LED è sufficiente impostare a uno o a zero il corrispondente bit, e poi ci “pensa” la funzione charlie ad accendere fisicamente i LED giusti.

La funzione oraToVidmem si incarica invece di trasformare il contenuto delle variabili ore e minuti nei corrispondenti bit a uno della memoria video vidmem.

foto

Il costo totale, considerando che alimentatore 12V, pulsanti, altoparlante e cavetti vari sono di recupero, non supera la quindicina di euro.

La scatola aperta ha due funzioni: la prima è quella di permettere al suono di diffondersi bene, la seconda di formare una base di appoggio stabile.



All'indice principale | Al vecchio sito