Orologio binario a colori

Update 2022, Jul 3
Put together “Orologio con display in binario”, “Orologio binario a colori” e “BinClock_II con controllo via App”; translated into English and stored to https://hackaday.io/project/186171-clock-with-binary-display

Che periodaccio. Mi trovo bloccato a metà di uno spostamento. Il virus è arrivato e ha cambiato la vita di tutti, facendo un “freeze” di chi stava muovendosi da una città all’altra per un nuovo lavoro. Così, ora ho solo un minuscolo laboratorio da viaggio, ma tanto tempo libero… Che fare ? Ho solo pezzetti di circuiti di prova, presi un po’ qui e un po’ là e messi alla rinfusa dentro una scatola. Rovistando, ho trovato una vecchia striscia di led a colori, comprata anni fa on-line e basata sul chip GS1903. Ci sono 30 led, ma collegati a tre a tre, quindi i “pixel” usabili sono solo 10. Ho pensato di fare un orologio, ma data la penuria di pixel, ho dovuto farlo con l’output in codice binario! Questo poi, non è il primo: se guardate a questo link, ne troverete un altro, molto piccolo e “wearable”.

Hardware

Cominciamo dall’immagine del prototipo:

Come vediamo, il micro usato è un ESP-8266, nella versione montata su un modulino ESP-03. Lo so, questo è molto vecchio e credo sia anche fuori produzione, ma come ho detto, nella scatola della roba vecchia c’è appunto…roba vecchia. Comunque, rispettando i GPIO utilizzati, si può usare qualsiasi altro modulo più recente. Vediamo lo schema elettrico completo:

Per una visione migliore, potete cliccare l’immagine o scaricare il disegno in formato PDF da questo link.

Dato che questa striscia di led funziona tipicamente a 12 Volts, ho usato un regolatore switching per portare l’alimentazione ai 3.3 Volts che mi servono per l’ESP8266. Il circuito è molto semplice e come vedete, nonostante i componenti SMD, è montato su una scheda per prototipi. Il modulino ESP-03, invece, è stato “ritagliato” da una vecchia scheda di produzione (di mia progettazione) recuperata da prove di affidabilità.

La parte più complicata, ovviamente, è stata la realizzazione del display. Ho ritagliato la striscia nei vari pezzi da 3 leds e poi ho ricollegato i fili. Come elementi “diffusori” ho usato dei vasetti (vuoti) di yoghurt.

Fase 1: mappatura elementi
Fase 2: cablaggio (che fatica)
Fase 3: test operativo (ore 16:15)

Come si nota dall’immagine, i minuti vengono contati a cinque a cinque e le ore vanno da 1 a 12 (tutto in binario, sommare i led accesi per il risultato). C’è un led supplementare per la situazione di “zero minuti” perché non mi piace avere tutta la linea spenta. I pixel totali sono quindi nove, quello avanzato lo tengo da parte per farci qualche altra cosa…

Firmware

Ho realizzato il firmware sulla piattaforma di sviluppo Arduino. Il programma, per quanto riguarda la parte dell’orologio, è molto semplice. Diventa un po’ più complicato per la gestione dei vari comandi di personalizzazione attraverso la porta seriale. Inoltre, c’è anche la possibilità di connettersi (attraverso il WiFi e il router di casa) ad un server DAYTIME che permette di mantenere l’orologio sempre sincronizzato. Il cuore del Real Time Clock (RTC) è davvero semplice: poche righe di programma…

Utilizzando la funzione millis() si ha una buona precisione di conteggio. Dato che c’è anche la possibilità di re-sincronizzarsi con un Time Server (se impostato, ogni 8 ore) non ci sarà mai la necessità di “regolare l’ora”. Comunque, anche senza connessione a Internet, l’orologio è abbastanza preciso e, dato che mostra i minuti a cinque a cinque, passerà un bel po’ di tempo prima che lo si debba regolare manualmente.

Nota bene: al reset il circuito si mette in una condizione di “devi regolare l’ora” che è visualizzata con tutti i led accesi. Questo permette l’uso come semplice “striscia di led colorati”, con i colori programmabili attraverso la porta seriale. Se non si esegue mai una regolazione dell’ora (manuale o automatica), si rimarrà sempre in questo stato. Tutto vi sarà più chiaro dopo aver letto la parte sul software di controllo.

Data la complessità del programma completo, non pubblico “lo sketch” sorgente, ma troverete nell’allegato il file .bin per programmare il micro del vostro circuito. Il programma è compilato per un generico ESP8266 con 1 MB di flash, quindi potrete usare il file .bin anche per programmare altri moduli, diversi dall’ESP-03 mostrato sullo schema. Per programmare il modulo dovrete collegare un’interfaccia USB-TTL tra il vostro PC e l’hardware. Mi raccomando: ricordatevi di settare l’interfaccia in modo che i segnali seriali siano a 3.3 Volts. In genere, c’è un ponticello o uno switch a bordo per questo scopo.

Per la programmazione, avrete bisogno di un software liberamente scaricabile da internet. Non è necessario installare la piattaforma di sviluppo Arduino, basta scaricare un software di programmazione. Lo trovate sul sito di Espressif (il produttore del chip) o su vari forum. Ecco cosa bisogna fare per programmare il micro: prima di tutto, bisogna inserire il ponticello “prog” sul modulo e poi premere “reset”. In questo modo, il micro entra in fase di programmazione e aspetta quindi comandi e dati da seriale. Successivamente si può eseguire il programma:

Qui si sceglie la versione per ESP8266, con l’apposito pulsante. Ora compare la finestra con i vari campi da riempire:

Qui dobbiamo seguire l’ordine dei numeri:

1) inserire qui il percorso per il file BinClock_xxxxxx.bin
    scaricato da questo sito (fa parte del file .zip allegato)
2) inserire qui l'indirizzo di partenza (0x00000)
3) spuntare i due checkbox come da immagine
4) inserire qui la COM Port usata (interfaccia seriale USB)
5) inserire qui la velocità della seriale (115200)
6) cliccare start

Se tutto è stato fatto correttamente, il programma inizierà a fare il suo lavoro e poco dopo terminerà così:

A questo punto, si può chiudere il programma e rimuovere il ponticello “prog” dal circuito, quindi si può premere di nuovo il “reset”. Tutti i led della striscia si accenderanno in colore bianco e il led blu sul “service pin” comincerà a lampeggiare una volta al secondo. In questa situazione, i led della striscia rimarranno tutti accesi e non ci sarà nessuna sincronizzazione dell’orario, perché mancano dei dati essenziali (SSID, PASW, DAYTIME server) che dovremo programmare via software, dando dei comandi in seriale attraverso un terminale o utilizzando l’applicazione per PC (Windows) che trovate nell’allegato (zippata insieme al file .bin).

Software

Come dicevo, si potrebbe usare un qualsiasi terminale, settato a 115200,N,8,1 per dare i comandi di personalizzazione. Tutti i comandi iniziano con il segno + e sono seguiti da due lettere ed eventualmente dai dati e infine dal terminatore (CRLF). Siccome ricordarsi tutti i comandi a memoria è un po’ complicato, ho deciso di scrivere un’applicazione per Windows per rendere le cose più semplici. Questa App è un “eseguibile puro” (un .exe) e non ha bisogno di installazione. Può essere “lanciata” anche da una chiavetta USB. Ho scritto questo software in FreeBasic con FireFly. Ecco uno screenshot del programma:

In alto a sinistra troviamo la finestra dei messaggi, dove vedremo sia i comandi inviati da noi (su seriale) sia le risposte ricevute dal micro. I comandi disponibili sono raggruppati per sezioni. Vediamole:

Com Port - impostazioni della porta seriale
Hardware - comandi per la sezione hardware
Credentials - comandi per SSID, PASW, DAYTIME server
Time - comandi per RTC
LedMap - comandi per modificare mappa dei led
Palette - comandi per modificare la palette dei colori

Prima di vedere i singoli comandi nel dettaglio, è utile una precisazione: trovate comandi che scrivono valori in RAM e altri che trasferiscono la RAM su EEprom. Il chip ESP8266 non ha una vera EEprom, ma è la stessa FLASH che viene gestita “come se fosse” una EEprom tramite una libreria di sistema. Al reset, la prima volta che si accende il dispositivo, la EEprom viene riempita con i valori di “default” e poi il suo contenuto viene copiato sulle variabili in RAM, che sono quelle che vengono usate dal programma. A ogni reset successivo, i dati vengono sempre letti dalla EEprom sulla RAM, ricaricando così la situazione precedentemente salvata. Quindi, se modifichiamo un valore in RAM e non lo salviamo su EEprom, alla successiva riaccensione perderemo la modifica effettuata.

Sezione Com Port

Questa è la sezione che ci permette di definire la porta seriale da usare e la velocità che deve avere. Dopo aver inserito / modificato i dati, premere “open” e si riceverà un messaggio di OK oppure di errore. Se OK, il testo del pulsante si trasforma da “open” in “close”. Per poter inviare comandi, ovviamente, la porta deve essere “open”.

Sezione hardware

Qui abbiamo tre comandi che impattano sull’hardware. Questi sono:

REINIT! – cancella la chiave di prima scrittura EEprom, che torna così alle condizioni iniziali. Tutti i dati in EEprom verranno sostituiti con i valori di default. Dopo la cancellazione della EEprom, il circuito si resetta automaticamente. Il comando da seriale è +kc (seguito da CRLF).

HW Reset – Provoca il reset dell’hardware. In conseguenza al reset, la RAM viene riempita di nuovo con i valori letti dalla EEprom. Il comando da seriale è +hr (CRLF).

Demo Clock – Abilita la funzione demo clock. In pratica, l’orologio si mette a “girare” al ritmo di 5 minuti al secondo, così da visualizzare rapidamente tutte le combinazioni del display, dalle 12:00 alle successive 11:55 e via di seguito. Per uscire dal modo “demo” si deve resettare il circuito (con il pulsante o con comando seriale). Il comando da seriale è +dc (CRLF).

Sezione CREDENTIALS

Qui abbiamo cinque comandi e tre box di immissione testo. Vediamone le funzioni:

Read RAM values – Legge dalla RAM i dati relativi a SSID e PASSWORD del modem router WiFi al quale eventualmente collegarsi, poi legge anche l’indirizzo del sito che vogliamo usare come DAYTIME server. Il valore di default per tutti i dati è “no”, ad indicare che non usiamo Internet e non aggiorniamo l’orario automaticamente. L’elenco dei valori viene mostrato sulla finestra dei messaggi. Il comando da seriale è +rc (CRLF).

-> RAM (dopo Router SSID) – trasferisce il contenuto del box di edit Router SSID nella corrispondente variabile in RAM. Il comando da seriale è +idtesto (CRLF).

-> RAM (dopo Router PASW) – trasferisce il contenuto del box di edit Router PASW nella corrispondente variabile in RAM. Il comando da seriale è +pwtesto (CRLF).

-> RAM (dopo DAYTIME server) – trasferisce il contenuto del box di edit DAYTIME server nella corrispondente variabile in RAM. Utilizzare un DAYTIME server che fornisca l’orario con valore CEST (Europa centrale). Se si usa un server che fornisce il valore UTC, verranno sottratte due ore, senza tener conto dell’ora legale! Io uso il server time.ien.it che fornisce appunto l’orario CEST. Il comando da seriale è +datesto (CRLF).

Copy RAM to EEPROM – copia tutte e tre le variabili dalla RAM alla EEprom, così che possano essere ricaricate automaticamente al prossimo reset del circuito. Il comando da seriale è +wc (CRLF).

Sezione time (rtc)

Qui abbiamo due comandi e un box di immissione testo. Vediamone le funzioni:

-> RTC – trasferisce il contenuto del box di edit Time hh:mm:ss nelle variabili RAM delle ore, minuti e secondi (RTC). Questa scrittura provoca l’uscita dalla condizione di “attesa di regolazione orario” che si verifica ad ogni reset del circuito e di conseguenza la striscia di led si accende con il valore impostato. Il comando da seriale è +tshh:mm:ss (CRLF).

Get Time (RTC) – legge il valore corrente della RAM per ore, minuti e secondi. Il valore letto viene mostrato nella finestra dei messaggi. Il comando da seriale è +tg (CRLF).

Sezione Palette

La sezione Palette serve per specificare le combinazioni di colore che vogliamo usare nel nostro orologio. Ci sono 16 righe da (00 a 15) per tre colonne (Red, Green, Blue) alle quali possiamo assegnare i valori tra 000 e 255 secondo i nostri gusti. Il colore determinato dalla tripletta potrà poi essere utilizzato nella mappa dei led attraverso il suo indice (numero di riga). Per esempio, se nella riga 00 abbiamo scritto R 255, G 000, B 000, allora nella mappa dei led potremo scrivere 00 su un elemento quando vogliamo che sia colorato di rosso; se nella riga 01 abbiamo scritto R 000, G 255, B 000, allora scriveremo 01 nella mappa dei led per avere il led corrispondente colorato di verde.

Abbiamo tre comandi e quattro box di immissione testo. Vediamone le funzioni:

-> RAM – trasferisce il contenuto dei box Index, RED, GREEN, BLUE nelle corrispondenti variabili in RAM. Index è sempre di 2 cifre, da 00 a 15, mentre RED, GREEN e BLUE sono sempre di 3 cifre da 000 a 255. Dopo la scrittura, entro un secondo, tutti i led della striscia che “puntano” a questa riga della Palette, cambiano colore secondo i dati immessi. Il comando da seriale è +psxx,rrr,ggg,bbb (CRLF).

Read RAM values – Legge dalla RAM tutta la Palette (16 righe per 3 colonne) e la mostra sulla finestra dei messaggi. Il comando da seriale è +pg (CRLF).

Copy Palette / Leds to EEPROM – copia tutta la Palette e la mappa dei leds dalla RAM alla EEprom, così che tutti i dati possano essere ricaricati automaticamente al prossimo reset del circuito. Il comando da seriale è +wm (CRLF).

Sezione LEDMAP

La mappa dei leds serve per attribuire ad ogni “pixel” della striscia di leds, uno dei colori disponibili nella Palette. I leds in questo orologio sono solo 9, ma il software prevede indici da 00 a 15 per eventuali futuri “allargamenti”. In questa applicazione i leds sono mappati così:

indice | elemento display binario
---------------------------------
  00   | cifra 8 (ore)
  01   | cifra 4 (ore)
  02   | cifra 2 (ore)
  03   | cifra 1 (ore)
  04   | cifra 0 (minuti)
  05   | cifra 5 (minuti)
  06   | cifra 10 (minuti)
  07   | cifra 20 (minuti)
  08   | cifra 40 (minuti)
---------------------------------

L’indice 09, che viene dopo i leds effettivi, serve per stabilire la luminosità generale della striscia (brightness) e può avere valori da 01 a 10 dove 10 è il più luminoso.

Abbiamo due comandi e due box di immissione testo. Vediamone le funzioni:

-> RAM – trasferisce il contenuto dei box Index e Value nelle corrispondenti variabili in RAM. Index è sempre di 2 cifre, da 00 a 15; anche Value è sempre di due cifre da 00 a 15 (tranne nel caso in cui sia l’elemento usato per la luminosità, che va da 01 a 10). Dopo la scrittura, entro un secondo, il led indirizzato da Index utilizzerà il valore di Palette indicato in Value. Il comando da seriale è +lsxx,vv (CRLF).

Rd RAM values – Legge dalla RAM tutta la Ledmap (9 + 1 righe) e la mostra sulla finestra dei messaggi. Il comando da seriale è +lg (CRLF).

Nota: non esiste un comando per salvare la LedMap in EEprom, perché si utilizza quello già presente nella sezione Palette.

Conclusioni e allegati

Questo è tutto (per il momento). Il prossimo passo sarà quello di aggiungere il controllo del dispositivo con lo smartphone, attraverso un’App per Android scritta da me.

Spero che questo progetto vi piaccia e mi scuso per eventuali errori, che comunque, appena li avrò scoperti, provvederò a correggere. Nel file allegato trovate, zippati insieme, sia il file .bin per programmare il micro, sia il .exe per il computer (Windows). Il file .zip ha una password che è “eficara”. Ho usato il programma 7Z per comprimere e cifrare i files. Prima di ogni operazione di unzip / exec sui files scaricati da Internet, verificate il codice SHA-1 per essere sicuri che il file sia integro e non manipolato da altri. In questo caso l’hash deve essere: 4D38BFAADACE203309C6F069CB8AF1258898462A
Infine, il link per il download, che è questo: BinClock.zip

Vi ricordo che non mi assumo nessuna responsabilità per eventuali problemi che dovessero sorgere con il download e/o l’installazione del materiale messo a disposizione. Si tratta di materiale di natura hobbistica e messo a disposizione in forma gratuita, perciò voi, utilizzandolo, vi prendete la piena responsabilità. Non sono un esperto di “legalese”, ma spero che il concetto sia sufficientemente chiaro.

Ciao!