Come fare dei grafici “super” con Arduino

Arduino può essere uno strumento di acquisizione dati low-cost che non ha nulla da invidiare a sistemi ben più costosi, se si scopre come salvare i dati dei propri esperimenti e come visualizzarli su dei grafici in tempo reale. Come ora vedremo, i grafici possono essere fatti in almeno tre modi: (1) usando il plotter seriale di Arduino; (2) usando il software Processing per Arduino; (3) usando il software MegunoLink Pro. Quest’ultimo permette anche di salvare i dati e di effettuare una serie di cose utilissime con una facilità incredibile, diventando uno dei più preziosi strumenti nel laboratorio dello scienziato dilettante. 

Il primo esempio che segue mostra come inviare un byte di dati da Arduino (o Genuino) a un personal computer e rappresentare il risultato. Si chiama “comunicazione seriale” perché la connessione appare sia alla scheda che al computer come una porta seriale, anche se potrebbe di fatto utilizzare un cavo USB, un convertitore da seriale a USB e da USB a seriale. È possibile utilizzare il plotter seriale del software Arduino (IDE) per graficare i dati inviati, oppure può essere letto con il software Processing.

L’impiego del software Processing anche per fare grafici è stato illustrato nel mio articolo Guida al software Processing per Arduino, cui pertanto rimando il lettore interessato. Tuttavia, l’uso di Processing è in generale più laborioso, pertanto lo sconsiglio allo scienziato dilettante per realizzare i suoi primi grafici, ed io stesso lo adopero solo per applicazioni particolari. Per la maggior parte delle applicazioni, sono sufficienti, per realizzare grafici, gli altri due metodi illustrati nel presente articolo.

Un esempio di grafico (piuttosto “povero”) ottenibile con Processing.

Il metodo più semplice: il plotter seriale

Il cosiddetto “plotter seriale” di Arduino (che trovate nel menù “Strumenti” del software Arduino) è davvero facile da usare. Invece di mostrare solo un mucchio di numeri e/o caratteri come fa il monitor seriale (che trovate nel medesimo menù), il plotter seriale effettivamente disegna i numeri nel tempo, dove l’asse y è il valore della grandezza da graficare e l’asse x è il tempo. Ciò si traduce in un grafico di tutte le variabili numeriche disegnate in tempo reale sullo schermo del PC.

L’asse y ha una semplice funzione di zoom automatico che si adatta ai valori, mentre l’asse x mostra gli ultimi 500 valori della grandezza (o grandezze) campionata. Un ritardo, ad esempio, di 20 ms – o delay(20) – nel loop principale fa sì che il plotter seriale mostri circa gli ultimi 15 secondi di dati (senza molto tempo di elaborazione all’interno del ciclo stesso). Occorre aumentare questo ritardo, ovvero stampare meno frequentemente, per rallentare lo scorrimento dell’asse x sullo schermo.

Il plotter seriale di Arduino mostra una linea retta a 1023 se uniamo il piedino a 5V con il piedino A0 e poi carichiamo su Arduino il codice illustrato qui sotto.

Poiché non esiste una documentazione ufficiale sul sito Web di Arduino in merito all’uso e alla funzionalità del plotter seriale, ne accennerò qui gli usi e le principali funzionalità. Caratteristiche: Tracciamento di grafici multipli; Grafici a ridimensionamento automatico; Supporta grafici con valori negativi; Scorrimento automatico lungo l’asse X; Colori diversi per ogni variabile. Applicazioni: Visualizzazione dati offline; Risoluzione dei problemi del codice; Analisi della forma d’onda.

L’hardware richiesto è una scheda Arduino (o Genuino) e un sensore analogico (potenziometro, fotocellula, etc.). Collega un potenziometro o un altro sensore analogico all’ingresso analogico 0 di Arduino (cioè al pin indicato con A0) o, più semplicemente, collega il pin 5V con A0 con un cavetto. Dopodiché copia e incolla su Arduino il seguente codice, o sketch, che trovi completo nel link di didascalia sotto la figura. Sul plotter seriale, vedrai una retta a 1023, valore che corrisponde a 5V.

Il codice da copiare e incollare su Arduino lo puoi scaricare da qui.

Il microcontrollore, infatti, non può capire direttamente la tensione analogica. Questo è il motivo per cui dobbiamo usare un convertitore analogico-digitale, o ADC in breve. L’Atmega328, che è il cervello di Arduino Uno, ha 6 canali (contrassegnati da A0 a A5), e un ADC a 10 bit. Ciò significa che mapperà le tensioni di ingresso da 0 a 5 V in valori interi da 0 a (2^10-1) cioè a 1023, il che fornisce una risoluzione di 4,9 mV per unità: 0 corrisponderà a 0 V, da 1 a 4,9 mV, da 2 a 9,8 mV e così via fino a 1023.

Ora vediamo il codice per leggere i valori dall’ADC e convertirli in letture di tensione utili, ovvero lo sketch che potete copiare e incollare sulla vostra scheda Arduino per visualizzare le tensioni su A0. La variabile ‘value’ contiene un valore compreso tra 0 e 1023 a seconda della tensione. Il valore ottenuto viene ora moltiplicato per la risoluzione dell’ADC (5V/1023 = 4,9 mV per unità) per ottenere la tensione effettiva. Infine, viene visualizzata sul plotter seriale che trovate in “Strumenti” la tensione misurata (in questo caso 5V).

Il nuovo codice da copiare e incollare su Arduino lo puoi scaricare da qui.

La funzione di plotter seriale esiste già da tempo nell’IDE di Arduino, ma la versione più recente consente di tracciare più variabili contemporaneamente (fornite da altrettanti sensori o il risultato di vari calcoli su una singola variabile realmente acquisita), in modo da poterle comparare visivamente. Tuttavia, non è facile trovare sul web un esempio già fatto di uno sketch per graficare due variabili contemporaneamente, perciò quanto ora riportiamo sarà senz’altro utile per il neofita di Arduino.

Per acquisire valori di due grandezze contemporaneamente occorre modificare il codice. Ad esempio, colleghiamo il piedino da 3,3V all’ingresso A1, in modo da avere un secondo “segnale” di tensione da acquisire in aggiunta alla tensione di 5V sul piedino A0. Ebbene, ora copia e incolla su Arduino il seguente codice o sketch. Il grafico che otterrai con il plotter seriale di Arduino è riportato nella figura qui sotto. Puoi ovviamente acquisire ulteriori segnali con modifiche analoghe. Prova anche un delay(200).

Questo terzo sketch da copiare e incollare su Arduino lo puoi scaricare da qui.

Come vedi, per graficare più variabili o forme d’onda contemporaneamente, viene stampato uno ‘spazio’ tra le due istruzioni di stampa. Ad esempio, i valori delle variabili temperatura e umidità avranno forme d’onda separate tracciate sullo stesso grafico simultaneamente. Infine, ricordati sempre di impostare la velocità di trasmissione (baud rate) del plotter seriale in modo che corrisponda a quella del codice: quella impostata di default, 9600 baud, non è né la più alta né la più bassa possibile.

Con poche linee di codice, Arduino è in grado di agire anche come un generatore di funzioni: è in grado di produrre forme d’onda quadrate, triangolari, sinusoidali ed a dente di sega. Sarebbe dispendioso in termini di tempo analizzare l’output esclusivamente sulla base di valori numerici; e questa è un’altra applicazione in cui il Plotter seriale di Arduino è utile: nel visualizzare le forme d’onda prodotte. Ma, come ora vedremo, vi sono modi ancora più soddisfacenti per sfruttare le potenzialità di Arduino.

Due esempi di forma d’onda realizzabili con Arduino e viste sul plotter seriale.

I grafici migliori: quelli con MegunoLink Pro

Il plotter seriale di Arduino presenta numerosi limiti, che possono venire facilmente superati usando un software a parte per fare i grafici e salvare i dati dei propri esperimenti: il software MegunoLink Pro, sviluppato proprio per Arduino. I suoi principali vantaggi rispetto al plotter seriale di Arduino sono: (1) Grafici molto curati e facilmente zoomabili e navigabili (sia in tempo reale che a posteriori) di più variabili contemporaneamente; (2) Facile registrazione e salvataggio dei dati.

Il grafico MegunoLink Pro di un sensore di gas metano acquisito con Arduino nel momento in cui veniva aperto per 1 secondo il gas da un accendino vicino.

Per fare dei grafici di più variabili contemporaneamente con MegunoLink Pro, scarica il relativo programma dal sito del produttore e, se vuoi poterne usare tutte le funzioni, acquista una tantum la licenza (che costa circa 30 euro ma ti gratificherà notevolmente). A questo punto copia e incolla e poi carica su Arduino il codice riportato qui sotto e che puoi scaricare per intero dal link che trovi nella didascalia della figura. Questo codice serve per inviare i dati letti sui pin A0 e A1 al software MegunoLink anziché al plotter seriale.

Lo sketch da copiare e incollare su Arduino, che puoi scaricare da qui.

Su MegunoLink troverai: strumenti di registrazione e monitoraggio; un modo per visualizzare i dati in forma tabulare;  un modo per separare i messaggi per il flusso seriale generale (ad esempio, il debug stream); un modo per programmare alcuni dispositivi Arduino;  uno strumento per tracciare i punti su una mappa dalle coordinate GPS; un modo per creare interfacce utente che inviano e ricevono comandi seriali; e uno strumento per tracciare dati x-y arbitrari. Insomma, di tutto di più.

Ci interessano di solito solo tre visualizzatori: innanzitutto il Connection Manager, accanto il Monitor standard e infine il visualizzatore Time Plot. Si apriranno l’uno sull’altro, tuttavia MegunoLink ha un’interfaccia ancorata elegante. Basta trascinare ogni scheda dove vuoi. Nota nella figura qui sopra che che ho configurato MegunoLink con il Connection Manager in alto, il Monitor nel mezzo e il visualizzatore del Time Plot in basso. Ovviamente, ognuno sceglie il layout che preferisce.

A questo punto non ti resta che fare due semplici settaggi per poter visualizzare i grafici. Apri MegunoLink Pro e  clicca su “Connection manager” dal menù in alto a destra. Qui dovrai selezionare la porta (port), che di default è “none” (può essere ad es. la COM4, COM8… COM47, etc.) e il baud rate (di default 9600). Ora clicca su “Time plot” per aprire la schermata grafica. Per far partire la visualizzazione, devi cliccare su “My serial device 0” per attivare la connessione (che potevi anche attivare dal Connection manager).

Le tre visualizzazioni più importanti del software MegunoLink Pro.

Nella figura appena mostrata attiro la tua attenzione sulle caselle verdi. Qui è dove è necessario selezionare la connessione appena creata. Nello screenshot la connessione è stata chiamata “RS232 4” (mentre di default si chiama “My serial device 0”), quindi è selezionata nei visualizzatori Monitor e Time Plot. I dati dovrebbero iniziare ad arrivare sul monitor dal tuo Arduino formattato nel modo in cui abbiamo discusso in precedenza e dare origine a un grafico (in questo caso di temperatura).

Il passo finale è selezionare il canale di tracciamento, se questo è previsto (nel seguito di questo articolo vedremo come si fa a crearlo). Nel Time Plot seleziona il menu a discesa (casella arancione nello screenshot) e seleziona “Temperature”. Il grafico dovrebbe a questo punto prendere vita e iniziare a tracciare il valore (in questo caso piuttosto costante) della temperatura nel momento in cui il valore fornito dal sensore entra nel convertitore analogico-digitale (ADC) della scheda Arduino.

Nel nostro solito esempio in cui sulla scheda Arduino abbiamo collegato il pin 5V a A0 e il pin 3,3V ad A1 in modo da avere due semplici tensioni da graficare, con MegunoLink Pro otterremo il grafico mostrato qui sotto, che oltre ad essere molto più bello di quello del plotter seriale e ad avere una scala x e y molto dettagliata, è zoomabile con i comandi “Zoom” e navigabile (cioè spostabile come se lo si prendesse con la mano) con il comando “Pan”. Li trovate entrambi come icone sopra la scritta “Chart”.

Il bel grafico con le tensioni di 5V e 3,3V ottenuto con MegunLink Pro.

MegunoLink ti permette non solo di fare subito dei bei grafici, ma anche di vedere i dati storici che ti permettono di identificare comportamenti strani come transienti casuali e deriva a lungo termine. Questa ultima parte dell’articolo utilizza una scheda Arduino Uno con un sensore di temperatura collegato al pin di ingresso analogico. Ogni secondo richiede una lettura e invia il valore dei dati sul canale seriale, in cui però questa volta lo strumento software chiamato MegunoLink traccia i dati in un grafico.

MegunoLink Pro utilizza un messaggio speciale per rilevare i dati e tracciarli automaticamente. Questo formato di messaggio speciale è riportato di seguito. Come vedi dalle righe di codice riportate, ogni pacchetto deve avere una coppia di parentesi graffe {} per indicare un messaggio speciale. Dopo la primo parentesi graffa è la parola chiave TIMEPLOT che dice a MegunoLink che vuoi tracciare usando il visualizzatore del Plot tempo (il tempo sull’asse x e il valore dei dati sull’asse y).

Di seguito è riportato del testo, in questo caso ChannelName. Lo useresti per separare i diversi grafici. In questo caso, se stiamo progettando un sacco di temperature in tutta la casa, puoi chiamare il canale “Temperature”. Dopo il nome del canale c’è una parola chiave dati, MegunoLink usa questa per decodificare il messaggio correttamente. Di seguito c’è un altro pezzo di testo che nomina la serie. Questa sarebbe la stanza che stai monitorando, ad esempio “Cucina”.

Dopodiché, in questo esempio c’è un’altra parola chiave “T”, questa indica a MegunoLink che si desidera utilizzare l’ora del computer come timestamp. In alternativa, se si dispone di un orologio in tempo reale, è possibile inviare il proprio tempo. Ciò è dimostrato nell’esempio in basso (seconda riga). Quindi, nel mondo di Arduino puoi semplicemente usare il codice seguente ed il software MegunoLink traccerebbe 25.6 continuamente usando il tempo del computer sull’asse x.

Generalmente vorresti fare di più che inviare un singolo valore, quindi una semplice funzione è la strada da percorrere. Di seguito mostriamo una funzione che prende un float (25.6) e lo invia con lo stesso formato illustrato sopra. Quindi mettendo insieme tutto questo ottieni un programma Arduino (vedi qui sotto) che legge un canale analogico collegato a un sensore di temperatura e invia la temperatura a MegunoLink. Basta programmare il tuo Arduino con esso e sei pronto a dare un’occhiata al lato MegunoLink delle cose.

Lo sketch completo che puoi scaricare da qui. Il relativo grafico ottenibile è stato mostrato in precedenza in questo stesso articolo.