Controllare Arduino da Raspberry Pi

Meccanismo Complesso - Controllare Arduino da Raspberry

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.

  • Raspberry Pi
    • Progetti
      Server
      • LAMP
        Server
      • Flask
        web server
      • Clusters
        MPI parallel
      • Arduino
        Remote control

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.

Meccanismo Complesso - Arduino USB Raspberry

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.

Meccanismo Complesso - Arduino Pro Mini

Altri Arduino sono flessibili e possono essere collegati a tessuti, superfici mobili, come il LilyPad Arduino (vedi qui).

Meccanismo Complesso - Lilypad

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.

Meccanismo Complesso - Raspberry and Arduinos

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.

Meccanismo Complesso - Matplotlib Python

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:

Meccanismo Complesso - Python Data Analytics

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
Meccanismo Complesso - Raspbian and Arduino IDE

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.

Meccanismo Complesso - Raspbian and Arduino IDE 2
Meccanismo Complesso - Raspbian and Arduino get Time

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.

Meccanismo Complesso - Raspbian and Arduino terminal

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.

Meccanismo Complesso - Raspbian and Arduino blinking

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.

5 commenti su “Controllare Arduino da Raspberry Pi

  1. Lucas

    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

    • admin

      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.

  2. Lucio Menci

    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

    • webmaster

      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.

Lascia un commento