Finora molti di noi hanno sempre intravisto Raspberry Pi e Arduino come due piattaforme concorrenti. Non a caso tra i vari smatettoni e maker non è raro tirare fuori un pò di concorrenza per gli appassionati di Arduino contro gli appassionati di Raspberry Pi. Bene oggi voglio cambiare un po’ le cose, e farvi vedere come sia possibile sfruttare il meglio da ogni cosa. Se siete possessori sia di schede Arduino che Raspberry, questo articolo vi mostrerà come applicare al meglio e sinergicamente queste due schede.
[wpda_org_chart tree_id=27 theme_id=50]
Collegare Arduino al Raspberry
Esistono vari modi, ma il modo più semplice è proprio quello di utilizzare un connettore USB e collegare direttamente tra di loro le due schede.
Per vedere se il collegamento è andato a buon fine e il Raspberry riconosce Arduino, da Raspbian aprite una sessione di terminale e immettete il seguente comando per controllate se Arduino è presente tra i dispositivi connessi via USB.
$ lsusb
Installazione di Arduino IDE su Raspbian
Aprite il terminale e immettete i seguenti comandi
$ sudo apt-get update $ sudo apt-get install arduino
In questo modo verrà installata una vecchia versione di Arduino, cioè la 1.0.5.
Altrimenti si può utilizzare l’Arduino IDE da qualsiasi altro PC per scrivere i programmi e caricarli su Arduino. Poi basterà collegare Arduino al Raspberry Pi in seguito.
Lo schema Raspberry Pi – Arduino
Adesso diamo un’occhiata un po’ al quadro generale. Raspberry Pi è un computer di bassissimo costo (vedi qui), non a prestazioni elevate, certo, ma comunque ha il suo sistema Linux, ed effettua tutte le operazioni necessarie. Questo è tutto quello che ci occorre. Magari ci aggiungerei il Wireless Dongle (di obbligo 😉 ). Arduino è una scheda elettronica (vedi qui) che permette la gestione di sensori e la raccolta dei loro dati. Inoltre è in grado di comandare anche attuatori (motori) e interruttori. Ok, ok, 🙂 anche Raspberry ha la sua GPIO, però esistono tantissimi modelli di Arduino adatti ad ogni tipologia di uso ed il loro costo è davvero basso.
Per esempio esiste l’Arduino Pro Mini (vedi qui)che ha dimensioni di pochi centrimetri (come un pollice) e quindi può essere facilmente utilizzato come controller per sensori.
Altri Arduino sono flessibili e possono essere collegati a tessuti, superfici mobili, come il LilyPad Arduino (vedi qui).
Quindi nello schema generale vedrei tanti Arduino utilizzati come controller di sensori e attuatori, tutti collegati ad una scheda Raspberry Pi vista come stazione locale per la gestione e l’acquisizione dei dati. Più Raspberry Pi formeranno più stazioni locali che trasmetteranno dati via Wireless ad un computer centrale che potrebbe benissimo essere il tuo laptop.
Nella figura sottostante la rappresentazione dello schema.
L’importanza di Python per gestire i dati di Arduino
Su Raspbian utilizzeremo Python come linguaggio di programmazione per avere un controllo a più alto livello dei dati provenienti e da inviare alla scheda Arduino. Infatti Python è un linguaggio che ben si presta alla gestione dei dati sia dal punto di vista di calcolo che di visualizzazione. Inoltre il fatto che sia un linguaggio che permette di eseguire programmi sia da listato che riga per riga da terminale, lo rende lo strumento adatto in questo genere di operazioni.
Esistono librerie come Pandas per l’analisi dei dati e Matplotlib per la loro visualizzazione, che rendono Python uno strumento avanzato per la gestione dei dati.
Per chi fosse alle prime armi, o volesse approfondire l’argomento dell’analisi dei dati e su come di programma in Python per generare grafici accattivanti con Matplotlib, consiglio vivamente questo libro:
Python Data Analytics (Apress – 2015) – Fabio Nelli
Questo libro parte dai rudimenti del linguaggio Python per passare poi ad una panoramica sulle più librerie di Python per la gestione dei dati: Numpy per avere una efficiente struttura dati alla base, Pandas che permette di gestire i dati e manipolarli in maniera semplice, efficiente, Scikit-learn che utilizza gli strumenti del Machine Learning per fare previsioni e classificazioni sui dati raccolti. Matplotlib che permette di ottenere grafici 2D e 3D per la visualizzazione dei dati. Infine argomenti come il Data Mining e gli approcci classici dell’analisi dei dati vengo trattati. Il libro è ricchissimo di esempi il cui codice viene spiegato passo passo.
Programmiamo Arduino
Adesso a titolo di esempio, programmeremo una scheda Arduino (nel mio caso Arduino UNO) in modo che emetta dei dati ogni 5 secondi. Questi dati inviati per via seriale verranno poi raccolti e gestiti da Raspberry Pi.
Avviate l’Arduino IDE che avete appena installato su Raspberry. Aprite una sessione di terminale e digitate il comando
$ arduino
Ma prima di cominciare a scrivere il codice, avremo bisogno di installare la libreria TIME necessaria per includere nel nostro codice time.h. Infatti questa libreria, anche se importante, non è inclusa nelle librerie standard. Per scaricarla premete qui. Una volta scaricato il file time.zip, andate sull’IDE e importatelo con Sketch > Importa Libreria >Add Library.
Poi inserite il codice seguente:
Compilate e inviate il codice su Arduino che comincerà ad eseguirlo iterativamente
Da questo momento Arduino invierà ripetutamente un segnale ogni 5 secondi, simulando così la rilevazione continua da parte di un sensore.
Programmiamo Python su Raspberry Pi (Raccolta dati da Arduino)
Adesso sempre da Raspberry apriamo una sessione da terminal. Lavoreremo con la versione 2.7 di Python. La libreria necessarie per comunicare con Arduino e gestire i dati seriali da esso inviati è pyserial, già inclusa nella distribuzione base delle librerie e quindi non sarà necessario installarla.
Scriviamo il file arduino01.py con nano, o con qualsiasi altro editor.
import serial arduinoSerialData = serial.Serial('/dev/ttyACM0',9600) while 1: if(arduinoSerialData.inWaiting()>0): myData = arduinoSerialData.readline() print myData
Eseguiamo il codice
$ python arduino01.py
Adesso il segnale inviato da Arduino verrà ricevuto da Raspberry attraverso la porta seriale (USB) ttyACM0. Attenzione, se avete più Arduino collegati, l’Arduino che trasmette potrebbe avere un altra porta seriale assegnata (controllate).
Sul terminale apparirà una riga ogni 5 secondi in cui viene riportato il messaggio inviato da Arduino.
Programmiamo Python su Raspberry (Invio comandi ad Arduino)
Nell’esempio precedente abbiamo ricevuto da Raspberry i segnali provenienti da una scheda Arduino che simulava la lettura di valori proveniente da un sensore. Adesso in questo esempio, vedremo il caso opposto. Abbiamo visto che nello schema Raspberry-Arduino illustrato in questo articolo, i Raspberry svolgono la mansione di controllare uno o più Arduino, a cui non solo sono collegati sensori, ma anche attuatori o interruttori.
Allora Raspberry, attraverso Python, dovrà essere in grado non solo di ricevere dati da Arduino attraverso la porta seriale, ma anche di inviare comandi in modo che possano essere eseguiti da Arduino. Comandi che serviranno ad interrompere la lettura, avviare un motore, chiudere un interruttore, ecc.
In questo esempio, scriveremo un codice su Arduino che mette in ascolto la scheda, pronta per ricevere comandi da via seriale. I comandi inviati saranno numeri da compresi tra 0 e 9 che corrisponderanno alla frequenza con cui il LED 13 (quello integrato nella scheda Arduino) dovrà lampeggiare.
Apriamo Arduino IDE e scrivi il codice seguente.
Una volta finito, compilalo e caricalo sulla scheda Arduino, che comincerà ad eseguirlo. Arduino si metterà in ascolto pronta a ricevere un comando da Raspberry.
Prima abbiamo visto come si poteva gestire la comunicazione con Arduino attraverso un programma in Python. Adesso in questo esempio, vedremo l’approccio interattivo attraverso il terminale. Infatti i comandi Python possono essere lanciati riga per riga.
Si lancia Python come interprete
$ python
e poi si inseriscono i comandi uno alla volta.
>>> import serial >>> arduinoSerialData = serial.Serial('/dev/ttyACM0',9600) >>> arduinoSerialData.write('5')
Vedrete il LED sulla scheda di Arduino cominciare a lampeggiare con una discreta velocità
>>> arduinoSerialData.write('3')
Adesso il LED lampeggierà più ripetutamente.
Conclusione
In questo articolo abbiamo visto come sia possibile far lavorare sinergicamente le schede Arduino e Raspberry Pi. In un prossimo articolo illustrerò il caso in cui due Arduino verranno gestiti contemporaneamente dalla stessa scheda Raspberry. Questi due Arduino produrranno una serie di dati che verranno raccolti da Raspberry, elaborati mediante le librerie Python come Pandas e infine visualizzati in grafici tramite Matplotlib.
Is it possible to connect multiple Arduino uno boards to Raspberry pi?
# Open a file
path = “/dev/serial/by-id/”
dirs = os.listdir( path )
#print dirs
for file in dirs:
arduino = serial.Serial(‘/dev/serial/by-id/’+file,9600)
The example does not work for me
I think that one problem is that each Arduino should be assigned to a specific arduino variable (arduino1, arduino2, …) and at the end of the code you have to close all the serial connections. You are opening in the for loop several serial connection all assigned to the same variable.
Hey there, is it possible to send string or character to arduino from rpi?
And will serial library work in python 3?
Ciao Fabio,
Hai accennato alla fine dell’articolo che avresti illustrato il caso in cui due Arduino verranno gestiti contemporaneamente dalla stessa scheda Raspberry. Era il caso che mi interessava (avrei tre mega da gestire con un unico punto di accesso, ed il Raspberry mi sembrava la miglior soluzione).
Pensavo a collegarli, anziché tramite la seriale della porta USB, attraverso una rete parallela sui pin dedicati alla comunicazione, ma non saprei proprio come fare…
Hai già pubblicato qualcosa e non mi riesce a trovarlo? O hai trovato difficoltà?
Grazie,
Lucio
Ciao,
in realtà non ho avuto tempo e mi sono concentrato su altri argomenti. Invece della rete vorresti usare un BUS con un protocollo dedicato, come i PLC, attraverso i PIN di comunicazione. Interessante. Potrei lavorarci sopra a Gennaio.
Per il momento sto aggiornando tutto il sito. Se ci stai già lavorando e hai trovato una soluzione fammi sapere, potrei pubblicarti a nome tuo un articolo.