Come realizzare un sistema di acquisizione dati low-cost

Immagine di un laboratorio di misure

Quante volte abbiamo sentito l’esigenza di acquisire dei dati per effettuare una elaborazione, per monitorare l’andamento di una particolare grandezza o per realizzare un sistema di controllo real-time? Sicuramente ci siamo dovuti confrontare con il costo della strumentazione necessaria, che non sempre era giustificato dal contesto in cui si andava ad operare. Per fortuna c’è Arduino a darci una mano: insieme ad un normale PC (che non consideriamo nel costo, a meno di non doverlo comprare solo per questa occasione!) con il software SCILAB (open source e gratuito) è possibile realizzare in modo abbastanza semplice ed economico un sistema di acquisizione ed elaborazione real time di dati.

Vediamo allora come, con po’ di pazienza, un Arduino e qualche cavo di connessione, si può realizzare una economica interfaccia I/O per un PC dotato di SCILAB, usando in questa applicazione le potenzialità dell’ambiente di simulazione grafica XCOS. Il sistema così ottenuto unisce la potenza di calcolo, propria del PC, con gli ingressi e le uscite di Arduino, il cui compito è solo quello di acquisire e trasferire al PC i dati: con XCOS possiamo analizzare i dati in “tempo reale” ed inoltre, sfruttando la possibilità di utilizzare i blocchi XCOS, potremmo sviluppare algoritmi di controllo più complessi o performanti di quelli ottenibili direttamente con Arduino. Viceversa si può anche pensare ad una forma di prototipazione rapida della legge di controllo (RCP), per determinare, ad esempio, i coefficienti di un PID prima di procedere alla programmazione dell’Arduino stand-alone. Basti pensare che per modificare i parametri su Arduino occorre riprogrammare il micro ogni volta, mentre con il sistema proposto si possono modificare i parametri ad ogni simulazione.
In questo contesto il real time è di tipo “soft real-time” in quanto non c’è alcun controllo sulla durata dell’esecuzione, ma il tempo reale è ottenuto solo se il programma ha un tempo di esecuzione inferiore al periodo di campionamento impostato.

CONFIGURAZIONE HW/SW

Per usare Arduino con SCILAB occorre installare preliminarmente il “serial communication toolbox” dal gestore di ATOMS, come mostrato nella seguente figura:

Serial Communication Toolbox

Questa libreria è necessaria per gestire la comunicazione fra la board e SCILAB durante la simulazione e quindi, a scanso di equivoci, non serve per programmare Arduino.

L’installazione di Arduino toolbox dipende dalla versione SCILAB posseduta: per la versione 6.0 (a 64 bit) è sufficiente utilizzare il gestore di ATOMS, o in alternativa digitare

atomsInstall("arduino")

In questo modo si installerà la versione più recente del toolbox. Per la versione 5.5 (a 32 bit), invece, bisogna procedere ad una installazione manuale, scompattando i file presenti nella cartella compressa prelevabile dalla pagina dedicata (il link è fornito nei riferimenti in fondo all’articolo) nella cartella ..\contrib presente nel path dove è installato SCILAB. Per caricare la libreria in SCILAB occorre eseguire il file loader.sce. L’aspetto negativo di questa procedura è il mancato caricamento all’avvio, pertanto va rieseguito il loader ad ogni nuova sessione di SCILAB.

Per poter usare Arduino con Scilab occorre, infine, caricare il programma di configurazione toolbox_arduino_v3.ino (disponibile anch’esso nella pagina dedicata al toolbox, nei riferimenti) sulla board dalla normale IDE di Arduino. Questa operazione va fatta solo una volta e non deve essere ripetuta, almeno fino a che la board non sia usata, e quindi riprogrammata, per altro.

DESCRIZIONE DELL’ESPERIMENTO

Passiamo ora alla descrizione dell’esperimento partendo dal caso più semplice che consiste nel generare un treno di impulsi da un’uscita digitale ed acquisirla su un canale analogico. A cosa serve utilizzare un ingresso analogico per acquisire un segnale digitale? Oltre che a provare il funzionamento dell’ingresso (e tutta la catena di comunicazione con XCOS) anche a visualizzare l’effettivo andamento nel tempo dell’uscita digitale di Arduino, ricordando che un segnale “digitale” è sempre un segnale “fisicamente” analogico e solo la nostra interpretazione lo rende “digitale” (ovvero possiamo associare il valore di un bit ad un particolare insieme di valori assunti da un segnale analogico).
Volendo complicare un poco l’esperimento per renderlo più interessante possiamo utilizzare un fitro passa basso per capire cosa si ottiene al variare della frequenza o del duty cicle.
Come ultima esperienza proviamo l’effeto del filtro su un segnale PWM.

Tra i vari esperimenti cambiano solo i collegamenti hardware fra gli ingressi, il filtro e le uscite, mentre è possibile utilizzare un unico modello XCOS omnicomprensivo, per semplicità.

SCHEMA SOFTWARE

Lo schema è mostrato in figura 2. Rispetto ad un modello tradizionale notiamo i blocchi dedicati all’I/O di Arduino e due blocchetti particolari necessari per poter interagire con la nostra board.

Schema XCOS
figura 2: Schema XCOS

Il blocchetto “Card 1 on com 5″(in alto a sinistra) serve a configurare la scheda in uso e la porta seriale utilizzata. Come tutti i blocchi XCOS si accede ai parametri con doppio click del tasto sinistro del mouse. L’altro blocco, senza nome, (immediatamente a destra) serve a specificare la durata dell’acquisizione ed il periodo di campionamento. Questo dato non può essere ridotto a piacimento ma deve essere di almeno 5 ms. La scelta ottimale può essere fatta mediante tentativi, scegliendo il minimo tempo compatibile con l’esecuzione real-time, in coerenza con quanto detto prima.
Gli altri blocchi specifici della libreria Arduino sono quelli per la gestione degli ingressi e delle uscite (con i nomi evidentemente corrispondenti alle funzioni implementate).
Questi blocchi possono quindi essere connessi ai normali blocchi XCOS per la successiva elaborazione.
Analizzando lo schema si vede che i segnali analogici acquisiti in ingresso (sui canali A0 e A1, identificati rispettivamente con Pin 0 e Pin 1) sono inviati tramite un multiplexer ad uno scope per la successiva visualizzazione, senza alcuna elaborazione.
In uscita sul pin digitale 8 è inviato il treno un treno di impulsi, che è inoltrato anche ad uno scope per una verifica tra quanto inviato in uscita e quanto effettivamente ricevuto sul canale analogico A0. Per quanto riguarda le caratteristiche degli impulsi (in figura 3) il blocco prevede quattro parametri: delay (il tempo che intercorre fra l’inizio della simulazione e la partenza del primo impulso, in secondi), periodo di ripetizione degli impulsi (in secondi), duty cicle (durata dell’impulso, in percentuale del periodo) ed infine l’ampiezza che nel nostro caso sarà sempre 1 dovendo stimolare un’uscita digitale. Da notare che i tre parametri temporali sono interdipendenti e non possono essere quindi impostati in maniera arbitraria. Nello specifico il delay deve essere maggiore di (1/period - duty cicle) e non negativo.

parametri del treno di impulsi
figura 3: parametri del treno di impulsi

Sul Pin 10 inviamo un valore costante per verificare la funzionalità del PWM. Sapendo che Arduino accetta valori tra zero e 255 e volendo utilizzare una variabile con un valore di duty cicle “leggibile” (ad esempio in percentuale del periodo) occorre scalare detto valore per riportarlo nel range richiesto. In questo particolare esempio, dovendo acquisire il segnale sull’ingresso analogico che ha 1024 livelli, per ritrovare sullo scope lo stesso valore numerico (e non dover manipolare anche il valore acquisito sul canale A1) impostiamo la variabile con un numero compreso fra 0 e 1023 e poi effettuamo la moltiplicazione per il coefficiente 255/1023.
Per finire vediamo come è strutturata la visualizzazione: tutte le variabili di interesse sono inviate a dei blocchi “scope”, i quali hanno una particolarità: oltre all’ingresso relativa al segnale da visualizzare hanno anche un ingresso di controllo, gestito da un opportuno clock, che abilita gli istanti di acquisizione. Per chi proviene dal mondo Simulink questa è una prima differenza interessante in quanto in Simulink il periodo di acquisizione è pari (o multiplo, in caso di decimazione) al periodo di simulazione. In XCOS, invece, l’acquisizione si imposta in modo indipendente (ed asincrona rispetto al campionamento dei segnali di Arduino).
Riguardo alla scelta del periodo del periodo di acquisizione, per avere un dettaglio sufficiente delle forme d’onda campionate, occorre impostare un valore inferiore a quello di campionamento (con un rapporto di 1/5 ho visualizzato decentemente anche impulsi di ridotta durata, come si può osservare nelle successive figure).

SCHEMA HARDWARE

Lo schema hardware è mostrato in figura 4: l’uscita digitale 8 è collegata sia all’ingresso del filtro passa-basso che al pin A0 dell’Arduino, mentre l’uscita del filtro è connessa al Pin A1. Per l’esperimento con il PWM si sposta il cavetto dal Pin 8 al Pin 10, lasciando il resto inalterato.

Connessioni con breadboard
figura 4: schema hardware

Una foto del circuito realizzato è mostrato in figura 5.

foto circuito
figura 5: foto del circuito realizzato

Il filtro è stato realizzato con una resistenza da 4.7 kOhm ed una capacità da 4.7 uF. Con questi valori nominali possiamo effettuare un’analisi preliminare del filtro. Con una buona approssimazione abbiamo che la costante di tempo è R*C=22.09 ms, il tempo di assestamento all’1% è circa 99 ms. La pulsazione di taglio (a -3 dB) è il reciproco della costante di tempo, 45 rad/s cui corrisponde una banda passante di circa 7 Hz, come mostrato nel diagramma di Bode:

Diagramma di Bode del filtro
figura 6: Diagramma di Bode del filtro

 

RISULTATI

Si mostrano ora i risultati ottenuti nei vari esperimenti, effettuati variando di volta in volta i parametri del treno di impulsi o l’uscita digitale considerata, per il PWM.
L’esperiemento base consiste nel collegare l’uscita digitale 10 all’ingresso A0, diminuendo progressivamente periodo e duty cicle per valutare i limiti di funzionamento del nostro sistema di acquisizione dati, entro il minimo periodo di campionamento possibile (5 ms).
L’onda quadra ha un periodo di 500 ms con un duty cicle del 20% (quindi 100 ms).
In figura 7 è riportato in alto, in rosso, il segnale inviato al Pin 10 ed in basso, in blu, il segnale acquisito dal Pin A0 (e campionato poi da PC con XCOS).

segnali I/O 500 ms d=20%
figura 7

La prima cosa che si nota e su cui si deve far attenzione quando si acquisiscono per via analogica dei segnali digitali è che il segnale in uscita varia fra 0 e 1, essendo digitale, mentre il segnale acquisito in ingresso varia fra 0 e 1023. Il risultato è coerente con quanto ci aspettiamo, visto che il convertitore A/D è a 10 bit (1024 livelli). Abbiamo anche verificato, per via indiretta, che l’uscita digitale al livello alto è 5 volt.
Nella figura 8 ripetiamo la prova diminuendo il periodo a 200 ms, con un duty cicle del 5%. Anche in questo caso l’acquisizione sembra corretta, con il segnale campionato che corrisponde al segnale di ingresso.

acquisizione 200 ms d=5%
figura 8

Rendiamo l’esperienza più interessante filtrando il segnale digitale con il filtro passa basso prelevandone l’uscita con il Pin A1.
In figura 9 vediamo un’onda quadra con periodo 2 secondi e duty cicle del 50%. Possiamo affermare che il segnale passa quasi “inalterato”, senza attenuazione e soprattutto con un tempo di salita inferiore a quanto calcolato in base ai valori nominali.

acquisizione 2s d=50%
figura 9

Si può giustificare questo risultato considerando che i valori reali dei componenti si discostano sensibilmente dai valori nominali(soprattutto la capacità, dato che il condensatore elettrolitico ha tolleranze elevate).
Vediamo ora cosa succede con un segnale a frequenza maggiore della banda passante. Ci aspettiamo un segnale di ampiezza ridotta che oscilla intorno al valor medio. In questo caso il duty cicle è del 50% , come si può vedere nella figura 10. Si nota anche che il segnale ha ancora un contenuto armonico importante in quanto l’onda quadra ha la frequenza fondamentale (50 Hz) di poco oltre la banda a -3 dB e quindi lo spettro risulta attenuato ma non del tutto eliminato (la risposta armonica diminuisce di -20 dB/decade).

acquisizione filtrata 20ms d=50%
figura 10

Per apprezzare l’effetto filtrante occorre un segnale con frequenza più elevata, non ottenibile con la normale uscita digitale di Arduino, dato che la commutazione dello stato dipende dal tempo di esecuzione del ciclo (e ricordiamo che nel sistema pilotato dal PC abbiamo, in aggiunta, un periodo di campionamento minimo di 5 ms). La soluzione consiste nell’utilizzare un’uscita PWM. Dalle specifiche sappiamo che il Pin 8 utilizza un’onda quadra a 488 kHz, che dovrebbe essere più che sufficiente per i nostri scopi. Possiamo, ad esempio, generare, un segnale PWM con duty cicle 80%, acquisire l’uscita del filtro sul Pin A1 e verificare che si tratti di un segnale costante, pari a 80% del fondo scala, che presenti un ridotto ripple. Per semplificare la prova ho impostato il valore costante a 800 in modo che sia particolarmente agevole la lettura analogica e la conseguente interpretazione del grafico acquisito, come mostrato in figura 11. Se si vuole conoscere il valore della tensione basta moltiplicare per 5/1023 il segnale acquisito, ricordando che il segnale digitale in uscita ha ampiezza 5V.

pwm filtrato
figura 11

Notiamo come nella figura il segnale in rosso non corrisponde a quanto ci aspetteremmo in uscita dal Pin 8 e cioè un’onda quadra di periodo 2 ms e durata dello stato alto 1.6 ms. Quello visualizzato è solo il segnale campionato a 5 ms, ovvero più del doppio del periodo e di fatto è una sequenza di valori a caso. Possiamo considerare questo fenomeno come esempio di aliasing dovuto a sottocampionamento.

CONCLUSIONI

In questo articolo abbiamo visto come realizzare un sistema di acquisizione dati low-cost con Arduino e Scilab/Xcos, a partire dalla installazione e configurazione del sistema fino alla realizzazione di alcuni esperimenti di test per verificarne la funzionalità. In particolare ho mostrato l’effetto di un filtro passa-basso su segnali digitali e PWM.
Lo strumento così approntato può essere impiegato per molteplici applicazioni. Una prima idea potrebbe essere implementare in XCOS un filtro passa-basso e valutare le differenza fra il segnale simulato e quello acquisito, oppure provare a realizzare un generatore di segnali arbitrari sfruttando il PWM.
Se avete già fatto qualcosa di simile oppure pensato a qualche altro esperimento o applicazione particolare scrivetelo nei commenti.

RIFERIMENTI

https://atoms.scilab.org/toolboxes/arduino/1.1

https://www.scilab.org/community/news/Scilab-Arduino-low-cost-data-acquisition

One comment on “Come realizzare un sistema di acquisizione dati low-cost

Interessante articolo, bravo. Sono un appassionato di queste tecnologie nel tempo libero ed un professionista della misura durante l’orario lavorativo. L’approccio qui descritto è sicuramente valido per scopi didattici/hobbistici ma si scontra con una serie di problemi reali di difficile soluzione come il rapporto segnale rumore, effetti dei loop di massa, immunità ai disturbi, stabilità della misura alle variazioni termiche e nel tempo, etc.. Uno strumento di misura professionale viene progettato, costruito e certificato con tutto questo in mente… Le soluzioni entry level di DEWESoft sono anche low-cost, costituiscono una soluzione HW + SW perfettamente integrata e testata e consentono di concentrarsi sul fenomeno fisico che si sta misurando senza dubitare dei segnali misurati. E’ sicuramente un approccio diverso da quello descritto nell’articolo ma probabilmente utile a qualcuno dei lettori: https://dewesoft.com/it/prodotti

Reply

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Pin It on Pinterest