La mia ultima ARDUINATA… Stage AUTOMATION Box !

Cosa caspita è questo “coso” ?
Se continui ti faccio vedere, e prometto che visto da fuori sarà molto più interessante…

E’ un prototipo hobbistico che definirei dispositivo di STAGE AUTOMATION: non esisteva sul mercato, mi serviva, perciò me lo sono fatto. Grande ARDUINO !

Ci sono 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.
Mi sono divertito ad arricchirlo di aspetti sfidanti, anziché fare cruciverba… giusto per divertirmi a creare, fare del Problem Solving e un pizzico di Project Management.

Lo ammetto, sono piuttosto orgoglioso del risultato perché non ho più 20 anni 🙂 e di solito sono cose che sul lavoro faccio fare ad ingegneri e programmatori molto più bravi di me…  ma mutatis mutandis l’approccio è lo stesso:
scelgo le risorse e gli skill da acquisire per ottenere il risultato. Et voilà !

Vediamo i due dispositivi da fuori:

01-group

Questa scatola magica con il suo assistente fa un sacco di cose ed è predisposta per farne altre semplicemente programmandola.
Ma più che questo credo sia più interessante vedere insieme qualche sfida affrontata nel loro sviluppo.

Questa box comunica tramite:

  • la sua tastiera, il display LCD e ben 36 LED disseminati ovunque
  • pedaliere, pulsantiere esterne e trigger (piezoelettrici)
  • uscite per relé attuatori (es. porte, tende elettriche, scenari, effetti pirotecnici)
  • interfaccia digitale MIDI IN e MIDI OUT per centraline luci DMX, sintetizzatori e pedaliere MIDI
  • audio OUT stereo XLR bilanciato
  • radio digitale bidirezionale a bassa latenza per il telecomando (ripreso in foto), in futuro DMX radio

ovviamente può ricevere un comando tramite uno di questi canali per poi processarlo ed inviarlo agli altri e/o attivare dispositivi interni.

Visto 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, modificare le cose DURANTE i lavori rischia di non far rispettare i tempi di conclusione del progetto.
Anche se per hobby 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 rinviarle ad una successiva versione, in base a criteri come importanza, opportunità, complessità, rischi, slittamento dei tempi.

L’importante è che le modifiche rinviate alla Fase 2, vengano tenute presente nella Fase 1, in modo da avere quelle precauzioni che non ostacolino o meglio che 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, 54 I/O dei quali 15 con PWM out,  16 INPUT ANALOGICI a 10 bit e 4 UART.

arduino-mega2560

ARDUINO MEGA 2560 R3

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 a 5V aggiuntivo, con il compito di governare 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 Mini Pro

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 inficierà 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.

00-all-inside

Caotico?  E’ un prototipo… considerando che sono 12 circuiti collegati, compressi in poco spazio, non è poi così male.
Ho cercato di fare copioso uso di flat cable, riciclati perlopiù da connettori di hard disk IDE. I due gusci dell’apparecchio, con circuiterie in ambo i lati, sono alla fine connessi da un unico 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 non funzionanti, talvolta 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.

tastiera


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.

bi-rg-led         2terminalbicolorled

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 di tutti i LED. L’altro loro pin invece viene collegato al micro che cambierà la tensione a 0V o a 5V di fatto invertendo la polarizzazione rispetto ai 2.8V e di conseguenza il colore del LED.

Si direbbe che quindi il LED non si può spegnere! Sbagliato: basta configurare l’OUTPUT come INPUT e questo si pone in condizione fluttuante “floating”, non scorre corrente e quindi il LED si spegne.
Con soli 15 fili e 14 OUT e 14 resistenze ho ottenuto quindi il mio risultato a colori !

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.3V

5V – 1.72.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 Ohm

Il 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 è:

  1. un normalmente aperto
  2. un normalmente chiuso
  3. se si tratta di un trigger a sensore piezoelettrico

per i primi due adotto la routine ed i filtri software anti-rimbalzo adeguati, mentre per il terzo caso lavoro in analogico per rilevare l’attivazione dell’ingresso e calcolare in più anche la sua 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:

  • l’ingresso per la memoria SD dove sono contenuti brani, samples audio, sequenze di scena
  • le due interfacce MIDI IN e MIDI OUT (i due LED sopra fanno da monitor)
  • l’interruttore del Ground Lift, per rimuovere eventuali ronzii da loop di massa
  • varie uscite audio (sbilanciate) tra le quali i due XLR dell’audio bilanciato

03-audioout

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ù ulteriori restrizioni nel complesso. 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 bisogna usare un 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:

  • realizzare un “VU meter” a barre, che mi indicasse il volume istantaneo dell’audio, come negli impianti stereo
  • poter scrivere dei numeri molto grandi per poter essere visibili a grande distanza

Come si vede dalla foto sotto ce l’ho fatta… 🙂 e per giunta in modo molto soddisfacente.
Come?

05-pan-dark

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.
D’altronde il JPEG per le immagini, l’MKV per i video e l’MP3 non ottengono forse ottimi 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 logaritmici.
Di conseguenza ho fatto i calcoli della lunghezza della barra con una progressione logaritmica.

Più ostica è stata la memoria di picco (peak hold) ossia quel segno in cima alla barra che rimane “sospeso” per un certo tempo a ricordare il punto più alto raggiunto dal volume, per poi “cadere” per gravità virtuale.
La CPU è concentrata con priorità massima nei confronti degli INPUT e la visualizzazione delle barre è in priorità più bassa. Questa priorizzazione è stata piuttosto articolata ma Arduino mette buoni strumenti a disposizione, tra i quali la gestione degli interrupt.

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.

Dovendo fare un oggetto molto compatto, di consumi ridotti e soprattutto avendo pochi OUT disponibili, ho inserito una matrice di 3×3 led, multiplexati a matrice e che uso per indicare:

  • conferma del numero scelto con il selettore rotativo
  • il livello di carica della batteria (all’accensione)
  • la qualità della ricezione del segnale della ricevente, dopo una trasmissione
  • se il comando non è stato ricevuto

 

06-remote         07-remote-in

Purtroppo le librerie in dotazione del fornitore non erano affidabili.
Ho dovuto perciò disattivare alcune funzioni native per sviluppare un mio protocollo di handshake con checksum di controllo, marcatori delle trasmissioni, timing ottimizzato ed altre precauzioni per ottenere il giusto livello di 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 sono identificate in modo univoco.

Ad ogni trasmissione effettuo un controllo sulle eventuali ritrasmissioni e con criteri un po’ complessi da spiegare determino un indice di qualità della ricezione che tiene conto anche dei disturbi e che evidenzio poi come feedback tramite i LED.

Così è possibile 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

Sei arrivato fin qua ?  Complimenti !!
Sei curioso almeno quanto me!  🙂

 


Commenti (2)
  • Avatar

    Sandro Dec 16 2016 - 12:09 Reply

    Complimenti Roberto!

    …mi sarei aspettato un audio o stage a valvole!!!

    Ciao,
    Sandro

    • Avatar

      Roberto Baldassar Dec 16 2016 - 15:14 Reply

      Grazie Sandro !
      Per le valvole ho già un amplificatore che ne ha 14 e pesa come un carro armato… in questo caso ho scelto un po’ di leggerezza !! 😀

Scrivi un tuo Commento

Nome (required)

Il tuo Sito - opzionale