Tutorial‎ > ‎Raspberry Pi‎ > ‎

Collegare Raspberry e Arduino via seriale

Nota Tratto dalla all'incontro Introduzione alla Raspberry Pi Le slides è consultabile e scaricabile da qui (sono in Google Docs)

Prima di tutto stabiliamo come devono collegarli tra loro le due schede
  • semplicemente usando il cavo USB da collegare alla Raspi e Arduino come se quest'ultimo fosse collegato ad un PC. In questo caso perdiamo una porta USB della Raspyberry Pi.
  • usare le UART
  • via Wireless (ZigBee, WIFI Bluetooth)
  • ethernet
  • I2C/SPI

Come procediamo
  • usciamo la porta UART della raspi per collegarci con Arduino lasciando libero un connettore USB.
  • questo comporta che dobbiamo inserire un circuito per mantenere compatibile le due tensioni di lavoro in modo da non danneggiare la raspi.
  • Per questo scopo usciamo un economico CD4050B
  • Arduino tramite il suo pin VIN viene alimentato a 5V direttamente dalla raspi.
  • Scriveremo un piccolo programma per Arduino  e uno in Python che gira sulla raspi.

Il CD4050 è un integrato che fa da buffer/converter senza invertire il valore logico in ingresso. Lo alimentiamo a 3,3V in modo che la tensione massima di uscita è 3,3V con un valore logico 1 ed ovviamente 0V quando 0. State attenti a non usare il CD4049 che invece fa da inverter, invertento il valore in ingresso sul uscita.

Schema per collegare Arduino e la Raspberry Pi.
Questo schema usa la seriale presente sul connettore P1 delle GPIO della raspi per collegarla a Arduino. Viene usato un economico CD4050 per convertire le tensioni delle i/O. Arduino lavora a 5V mentre la raspi a 3.3V. Cosi si evita di usare una porta USB sulla raspi.
Arduino è alimentato a 5V direttamente dalla Raspi. 

Raspberry Pi Arduino via UART





Raspberry Pi Raspberry PiRaspberry Pi  CD4050 CD4050  Arduino Arduino  Arduino 
 PIN TYPETENSIONE
 PIN DIREZIONE/NOTEPINTENSIONE TYPE PIN
 P1-8 (GPIO14) TX 3V3 >>> 2  3V3 RX0
 P1-10 (GPIO15) RX 3V34 <<< 5 5V TX
 P1-25V POWER OUT 5V 
>>>
Alimenta Arduino a 5V
  5V 5V POWER IN VIN
 P1-6
 GND GND 8 GND 8 GND  GND
 P1-13V3 POWER OUT  3V3 1 Alimenta il CD4050
 a 3V3
 1   


1° esempio:
Accendere e spegnere un LED su Arduino inviando un comando dalla Raspi

Scriviamo questo piccolo codice per Arduino tramite il suo IDE

  1. int led = 13;
  2. void setup() {                
  3.  pinMode(led, OUTPUT);
  4.  Serial.begin(9600);  
  5. }
  6. void loop() {
  7.   if (Serial.available() > 0) {
  8.      char comando = toLowerCase(Serial.read());
  9.        // usciamo i caratteri a A ricevuti via seriale per accendere il led
  10.        if (comando == 'a') {
  11.           digitalWrite(13, HIGH);         
  12.        }
  13.        // gli altri caratteri lo spengono
  14.        else {
  15.           digitalWrite(13, LOW);
  16.        }        
  17.   }
  18. }   

Il codice è banale e niente di particolare. Accende il LED se riceve un carattere a o A tramite la seriale e lo spegne per ogni altro carattere ricevuto.

Scritto il codice trasferiamo al nostro Arduino.
Nota che puoi installare IDE Arduino sulla RPi, scrivere il codice e trasferirlo a Arduino via USB.

Passiamo al semplice codice scritto in Python sulla Raspberry Pi. Useremo direttamente la shell interattiva di Python. Se non presente va installato il pacchetto python-serial che è il modulo per gestire la seriale da questo linguaggio. Per installarlo:
  • sudo apt-get -u install python-serial

La porta seriale 0 sulla RPi si trova su /dev/ttyAMA0. La stessa è occupata da getty che permette di accedere alla raspi via seriale. Se volete disattivare definitivamente commentate la riga /etc/inittab

#Spawn a getty on Raspberry Pi serial line

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100



Ora alla un terminale della raspi eseguiamo Python in modalità interattiva

pi@raspberrypi ~/demo $ python

Python 2.7.3rc2 (default, Apr 23 2012, 04:52:06)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import serial

>>> arduino=serial.Serial('/dev/ttyAMA0')

>>> print arduino

Serial<id=0x687290, open=True>(port='/dev/ttyAMA0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

>>> arduino.write('a')

1

>>> arduino.write('s')

1

>>>


con arduino.write() inviamo a Arduino il valore sia seriale, che se a o A il LED si accende mentre con gli altri carattere si spegne.

2° esempio:
Ora un altro piccolo esempio usando ADC di Arduino. Un potenziomentro ci permetterà di variare la tensione in ingresso del pin A0 del ADC di Arduino. La lettura sarà inviata alla raspi via seriale

5V ---|POT|--- GND
|
pin A0 di Arduino

Collegate il potenziometro come qui sopra alla scheda Arduino
Ora vediamo di scrivere il codice per:

  • Arduino
    • il quale legge il valore di A0
    • lo converte già in valore di tensione
    • lo invia via seriale
  • sulla raspi scriviamo un programmino in Python per la lettura (basterebbe un semplice terminale seriale)

Codice Arduino

  1. const int PinPot = A0; // il potenziometro è collegato alla ingresso analogico A0
  2. /*
  3. definiamo la variabile di conversione della valore_ADC - tensione
  4. - 1024 sono le combinazioni della risoluzione del ADC a 10bit e va da 0 a 1023. Per determinare quando corrisponde un byte si usa Vref / 1024 dove Vref è la tensione di riferimento.
  5. - 5.0 è la tensione di riferimento che è quella di Vcc.
  6. - 5.0 / 1024 = corrispondenza in tensione del singolo byte di conversione. Equivale a circa 0,0049V x byte. Esempio se ADC legge 512 significa che abbiamo in ingresso analogico ci sono circa 2,5V (512*0,0049) */
  7. float VByte = 5.0/1024; // Otteniamo a che tensione corrisponde un Byte
  8. int ValPot = 0; // variabile del valore del potenziometro letto ADC 

  9. void setup() {  
  10. Serial.begin(9600); 
  11. }

  12. void loop() {
  13. ValPot = analogRead(PinPot); //leggiamo A0
  14. // Ora inviamo la tensione letta alla Raspi.
  15. Serial.print("Tensione: ");
  16. // prima convertiamo il valore digitale per il valore intensione del Byte 
  17. // e lo inviamo alla seriale
  18. Serial.print(ValPot*VByte);
  19. Serial.println("Volt"); 
  20. delay(100); 
  21. }

Ora il codice in Python sulla raspi scrivendolo in un file.
Dalla console della raspi

pi@raspberrypi ~/demo/python $ nano arduino_adc.py


import serial

arduino=serial.Serial('/dev/ttyAMA0') # se via USB ttyACM0 per Arduino UNO

while 1:

  print arduino.readline()


salviamo e diamo il comando

pi@raspberrypi ~/demo/python $ python arduino_adc.py



Vediamo scorrere il valore della tensione letto da Arduino e variando il potenziometro vediamo le variazioni a video

Un alternativa è usare il protocollo firmata. Questo è un protocollo di comunicazione tra HOST e MCU come nel nostro caso Arduino. Esistono sia le librerie per Arduino (IDE contiene degli esempi) che per Python e C/C++


Nel piccolo e semplice esempio precedente era per farvi vedere come far comunicare la raspi e arduino tramite seriale e come costruisci un semplice circuito di conversione delle tensioni.
Il codice funziona anche usando la porta USB.

Avete visto come fare un piccolo ed economico convertitore dei livello delle tensioni per le GPIO.
Comments