Dall’immagine è arduo capire di cosa di tratti…
ma se sei curioso prometto che da fuori sarà più interessante…
E’ un prototipo hobbistico definibile come dispositivo di STAGE AUTOMATION: automazione scenari, attuatori di vario tipo, automazione luci, effetti pirotecnici, automatismi audio e altro… con controllo radio a bassa latenza. Non esisteva sul mercato senza unire più unità ingombranti e costosissime.
Mi serviva, me lo sono fatto, con un copioso uso dei microcontroller “ARDUINO” della ATMEL.
Vediamo questa scatola magica com’è fatta:
Ho usato 12 circuiti interconnessi di cui 3 ARDUINO, 2 RADIO digitali a 2.45 GHz ed altri moduli.
Per farli funzionare ho scritto 3000 righe di codice in C++ (vers. Arduino) e dato che non conoscevo il C++… me lo sono imparato.
E’ stato divertente arricchire il progettino di aspetti sfidanti, anziché di fare cruciverba… per stimolare la creatività, l’arte del Problem Solving e un pizzico di Project Management.
Sul lavoro sarebbero cose che affiderei ad ingegneri e programmatori più bravi di me… in questo caso mi sono ingegnato da solo, anche se mutatis mutandis l’approccio è lo stesso:
si scelgono le risorse umane/tecniche e/o si acquisiscono gli skill necessari per ottenere il risultato. Et voilà !
Questa “Stage Automation Box” con il suo assistente fa davvero molte cose e l’ho già predisposta per funzioni aggiuntive, senza modifiche hardware, semplicemente programmandola.
Ma credo sia più interessante vedere vedere qualche sfida affrontata nel loro sviluppo.
Questa box comunica tramite:
ovviamente può ricevere un comando tramite uno di questi canali per poi processarlo ed inviarlo agli altri e/o attivare dispositivi interni.
Dato che ho accennato al Project Management, questo dispositivo non prevedeva inizialmente tutte le funzioni attuali.
Qualunque cosa faccia, tecnica e non, ho costantemente nuove idee di miglioramento, tuttavia ho imparato a gestire l’eccessiva creatività in modo da ridurne gli side effects indesiderati.
Per citarne uno: aggiungere nuove prestazioni / specifiche DURANTE i lavori rischia di non far rispettare i tempi di conclusione del progetto.
Anche se per hobby, ho voluto per gioco mantenere un approccio professionale: mi sono ugualmente fissato un milestone nel quale poter dire “è finito, funziona“. Così ho dovuto fare una scelta di quali idee idee implementare subito e quali rinviare ad una successiva versione, in base a criteri come importanza, opportunità, complessità, rischi, tempistiche di progetto.E’ però molto importante che nella roadmap di sviluppo, le modifiche rinviate alla Fase 2, vengano tenute presente nella Fase 1, in modo da avere subito quelle precauzioni che non ostacolino o piuttosto facilitino le realizzazioni successive.
ARDUINO e PROCESSORI
Cuore del sistema è il microprocessore ATmega2560:
montato nell’ARDUINO MEGA 2560. Il che mi garantisce la potenza e memoria necessarie, ben 54 I/O dei quali 15 con PWM out, 16 INPUT ANALOGICI a 10 bit e 4 UART.
Siccome pretendo dalla CPU una risposta prontissima agli INPUT ho preferito non darle l’incombenza di gestire anche i miei articolati protocolli RF, così facendo posso permettermi di dedicare in esclusiva la sua SPI al processore audio.
A darle una mano ho delegato un ARDUINO NANO aggiuntivo a 5V, con il compito di governare separatamente il modulo radio con la sua SPI per la comunicazione bidirezionale con il telecomando.
L’ARDUINO MEGA qui sopra ed il NANO qui sotto dialogano tra loro tramite una UART a 250.000 bit/s, adeguatamente veloce per i miei scopi.
ARDUINO NANO ARDUINO PRO MINI 3.3V 8MHz
Il cuore del telecomando radio è invece un piccolo ARDUINO PRO MINI a 3.3V 8Mhz anziché 5V 16Mhz, così da contenere i consumi per l’alimentazione a batteria (9V).
Questo non inficerà le prestazioni, dato il set ridotto di compiti, e sarà più facile gestire elettricamente il modulo RF, anch’esso a 3.3V e parzialmente “5V tolerant”.
5V tolerant: non è tipicamente saggio collegare direttamente un output a 5V ad un input a 3.3V: molti ingressi hanno infatti un “diodo di clamping” che verrebbe bruciato istantaneamente… il contrario invece funziona senza problemi.
Chi è interessato si legga “10 modi per distruggere un Arduino” al punto #6,
in questo caso sarebbe il modulo RF ad essere a rischio distruzione.
A completare la lista dei microprocessori c’è poi un VS1053 della VLSI finlandese, che gestisce la parte audio stereo con qualità CD, da file prelevati da una apposita scheda di memoria SD.
A questo ho accoppiato le schede interne di un BEHRINGER DI20 per ottenere due uscite audio XLR bilanciate professionali e consentire cavi di lunghezza anche di 200 metri, senza disturbi indotti.
Caotico? E’ un prototipo… perdipiù hobbistico. E che funziona perfettamente (quando collaudo le cose sono spietatissimo…!!). Considerando che ci sono 12 circuiti collegati, compressi in pochissimo spazio, sono molto soddisfatto.
Ho cercato di fare copioso uso di flat cable, come qualcuno immaginerà sono perlopiù cavi riciclati di hard disk IDE. I due gusci dell’apparecchio, con circuiterie in ambo i lati, sono alla fine connessi da un solo grosso flat cable.
LA TASTIERA
Volevo dei tasti predisposti per il LED, con una bella corsa verticale ed un buon “feeling” meccanico.
Qualcosa idealmente di prossimo ai pulsanti da operatore di gru 🙂 ma che trovassero posto nel poco spazio a disposizione.
Sul mercato ce ne sono a iosa, molto costosi, tuttavia per i miei prototipi di solito faccio un po’ il McGyver, riutilizzando parti di oggetti in rottamazione, talvolta in origine destinati a tutt’altro…
è un’altra una forma di esercizio mentale ed ecologico.
Per la tastiera ho quindi preso un Registratore di Cassa non riparabile, di quelli ancora con i tasti a contatto elettrico dorato, non in gomma conduttiva, con una tastiera che mi piacesse. L”ho poi letteralmente segata in modo da ottenere la configurazione voluta.
Questi tasti hanno il copritasto trasparente e rimovibile in modo da poterci mettere sotto una dicitura a piacere.
LED
Volevo dotare ogni tasto di un LED “parlante” a colori. Anche in questo caso per esercizio di ergonomia.
Non volevo fare il multiplexing di 14 LED a matrice per non perdere reattività del microprocessore, né complicare inutilmente la circuitazione ed il wiring.
Per cui ho evitato l’uso di LED RGB che con il loro 4 pin avrebbero peraltro richiesto 3×14+1= 43 fili.
Il giusto compromesso l’ho ottenuto utilizzando LED bi-colore configurati internamente in anti-parallelo, e quindi con 2 soli pin anziché 3: in sostanza con la corrente in un verso si accende il LED rosso, nell’altro il LED verde.
Se proprio volessi un terzo colore posso alternare velocemente i due colori ottenendo l’arancio.
Per ottenere questo risultato con 14 LED avrei dovuto impegnare 28 uscite del processore, infatti per cambiare il LED interno è necessario cambiare lo stato di entrambi i suoi pin, alzando uno ed abbassando l’altro e viceversa. Per spegnerlo poi basta metterli allo stesso potenziale.
In realtà avevo già ideato la soluzione anche a questo:
ho aggiunto un comune LM317 per generare una sorta di “massa virtuale” a 2.8V… alla quale collego un pin comune di tutti i LED. L’altro pin di ognuno invece viene collegato al micro che cambierà la tensione a 0V o a 5V di fatto invertendo la polarizzazione rispetto ai 2.8V di massa virtuale, e di conseguenza il colore del LED.
Con soli 15 fili (anziché 43) e 14 resistenze ho ottenuto quindi il mio obiettivo, a colori.
Da quanto sopra si direbbe che quindi il LED non si possa spegnere…
Sbagliato: basta configurare l’OUTPUT come INPUT e questo pone l’OUT del microcontroller in condizione fluttuante “floating“: non scorre corrente e quindi il LED si spegne.
Dati due LED uno rosso ed uno verde in anti-parallelo, sappiamo che:
– la forward voltage del LED rosso = 1.7V
– la forward voltage del LED verde = 2.3V5V – 1.7 – 2.3 = 1 V, metà sarà utilizzato con una polarizzazione e metà con l’altra ==> 0.5V
La tensione della massa virtuale dovrà essere di 2.3 + 0.5 = 2.8 V
la resistenza di polarizzazione dovrà essere R = 0.5 V / 10 mA = 47 OhmIl diodo è collegato ad un capo alla massa virtuale di 2.8V e all’altro all’OUT dell’Arduino tramite R:
quando OUT = +5V il LED rosso è ON con (5 – 2.8) +2.2V (1.7 + 0.5) di tensione e 10mA
quando OUT = 0V il LED verde è ON con (0 – 2.8) -2.8V (2.3 + 0.5) di tensione e 10mA
quando OUT = FLOATING non scorre alcuna corrente ed il LED si spegne
Lavorando di fino, l’efficienza luminosa e anche la percezione stessa di luminosità dei LED è variabile con il colore. Perciò ho predisposto una regolazione fine della dei 2.8V per bilanciare le correnti tra i due colori in modo da ottenere la stessa luminosità percepita.
INPUT digitali e analogici
Nella foto seguente vediamo il pannello I/O con 8 ingressi/uscite programmabili, ossia posso decidere liberamente quante usarne come ingresso e quante come uscita.
Per semplificare la flessibilità di utilizzo del congegno, mi sono inventato una funzione auto-detect degli input, ossia durante il boot faccio l’analisi dello stato di ogni ingresso in modo da capire automaticamente se è:
per i primi due adotto la routine ed i filtri software anti-rimbalzo adeguati, mentre per il terzo caso ho lavorato in analogico per rilevare l’attivazione dell’ingresso e calcolare anche l’intensità per un risultato dinamico.
Ogni I/O è dotato di un LED blu per indicare quando l’OUT si attiva, di solito con un impulso temporizzato.
Sfruttando l’elevata tensione forward dei LED blu, un paio di 1N4007 e la resistenza di pull-up interna dell’Arduino, sono riuscito – in stato di riposo – a farli accendere debolmente quando il jack è configurato come INPUT (vedi foto i 4 led in basso).
MIDI in/out – AUDIO out
In quest’altra foto sotto vediamo da sinistra a destra:
NOTA: la porta MIDI è elettricamente una seriale TTL impostata a 31250 baud rate.
In ingresso le specifiche prevedono sempre e rigorosamente l’interposizione di un optoisolatore, nella fattispecie ho usato un 4N26 che avevo già in casa.
DISPLAY
Ho utilizzato un classico 4 x 20 caratteri basato sul controller HITACHI HD44780.
Aggiungendo poi un controller seriale I2C mi sono semplificato il cablaggio, la regolazione del contrasto ed ottengo il controllo software della luminosità del display, senza dover aggiungere un transistor per farlo.
NOTA: La retroilluminazione del display richiede 240mA mentre le uscite dell’Arduino tollerano al massimo 40mA cadauna più altre restrizioni globali.
Non è quindi saggio pilotare la retroilluminazione direttamente dalle uscite dell’Arduino e bisogna interporre un transistor a fare da switch – comandato in base dall’OUT dell’Arduino – oppure sfruttare controller I2C che lo include già.
Questo è puramente un display di testo, non è quindi possibile tracciare linee grafiche o cambiare dimensione dei caratteri. Io però volevo ugualmente due cose:
Come si vede dalla foto sotto ce l’ho fatta… 🙂 e per giunta in modo molto soddisfacente.
Come?
Ho sfruttato la possibilità del controller di memorizzare 8 caratteri custom di 8×8 pixel. Pochissimi, ma ho fatto ugualmente il miracolo con un lavoro certosino di ottimizzazione tecnica e visiva e usando ogni bit disponibile ed ottenere il massimo effetto percettivo. Una specie di Tangram elettronico 🙂
D’altronde il JPEG per le immagini, l’MKV per i video e l’MP3 per l’audio non ottengono forse buoni risultati con un impiego di risorse straordinariamente basso ?
Una piccola complicazione nel rappresentare la barra del volume è derivata dal fatto che il nostro orecchio percepisce il volume con una progressione logaritmica (10log in base 10). Chi è del settore sa che ad esempio tutti i potenziometri per il volume audio sono appunto di tipo B, ossia logaritmici.
Di conseguenza ho fatto i calcoli della visualizzazione della barra con una progressione logaritmica.
Molto ostica, dato che la CPU è concentrata con priorità massima nei confronti degli INPUT, la visualizzazione delle barre è decisamente in priorità bassa. Tuttavia sfruttando i buoni strumenti a disposizione del microcontrollore ATMEL, tra i quali la gestione degli interrupt, sono riuscito a realizzare anche questa funzione.
Per i numeri grandi volevo qualcosa di più elegante dello stile 7 segmenti… perciò ho lavorato per approssimazioni successive su caratteri custom “angolari” e l’ideazione di un font di buona leggibilità in una matrice da 3×4.
Il risultato alla fine mi ha soddisfatto.
IL TELECOMANDO RADIO
Anche questo oggetto mi ha dato delle belle soddisfazioni !
Ho utilizzato dei moduli radio in banda 2.45 GHz che che avevo già selezionato per altri scopi con ottimi risultati. Ho scelto versione base a 10mW ma potenziata con una piccola antenna per il giusto guadagno in più e raggiungere quasi 100 metri in aria libera.
L’obiettivo era in realtà ottenere una gittata affidabile di 15 mt anche in presenza di muri e disturbi. E così è.
Il telecomando in sostanza ha una levetta per selezionare 3 diversi comandi destinati alla ricevente, mentre con il selettore rotativo si sceglie il numero da associare a tale comando. Il pulsante rosso infine lo invia.
Il pulsante verde funziona da STOP di una qualsiasi esecuzione della scatola magica ma nel caso di azionamento di motorizzazioni e effetti pirotecnici è utilizzato ASSIEME al pulsante ROSSO per prevenire partenze accidentali.
C’è inoltre una presa jack per collegare un pulsante esterno, pedale o trigger piezoelettrico direttamente al telecomando.
Per quanto riguarda l’handshakedelle comunicazioni, purtroppo le librerie in dotazione del fornitore del chipset non erano affidabili.
Ho dovuto perciò disattivare alcune funzioni native e sviluppare un mio protocollo di handshake con opportuni checksum di controllo, marcatori delle trasmissioni, timing ottimizzato ed altre precauzioni per ottenere il giusto livello di sicurezza ed affidabilità.
I due dispositivi parlano tra loro bidirezionalmente ed il telecomando riceve un feedback non solo della avvenuta ricezione, ma anche di QUALE trasmissione dato che ognuna è identificata in modo univoco.
Ad ogni trasmissione effettuo un controllo sulle eventuali ritrasmissioni e con criteri un po’ complessi da spiegare determino perfino un indice di qualità della ricezione che tiene conto anche dei disturbi e che evidenzio poi come feedback tramite i LED.
Così è possibile monitorare o controllare a priori la qualità di ricezione nelle zone dove sarà usato.
Per sfizio personale il dato che viene inviato dal telecomando sul layer radio l’ho reso compatibile con il protocollo MIDI. Quindi di fatto è anche una sofisticata trasmittente MIDI wireless.
La latenza end-to-end della trasmissione è di 7.5 ms, ossia meno di un centesimo di secondo dalla pressione del tasto alla completa decodifica e attivazione del comando da parte della ricevente.
Volendo si possono ottenere tempi ancora più rapidi a scapito di qualche altro aspetto, ma per i miei scopi è già molto veloce.
Un ottimo risultato se consideriamo che il dato passa da:
pulsante ==> ARDUINO3 ==> RADIO2 ) ) ) ) ( ( ( ( RADIO1 ==> ARDUINO2 ==> ARDUINO1
Devi essere connesso per inviare un commento.