Costruire Robot Rover con Raspberry Pi e Arduino – Comunicazione I2C tra le due boards

Ecco finalmente online il prima aticolo della serie che porterà alla realizzazione di un fantastico Robot Rover basato su due piattaforme di sviluppo ormai molto conosciute ed apprezzate: Arduino e Raspberry Pi. L'idea è scaturita dalla mia passione per l'elettronica e probabilmente... per la robotica. Questo robot potrà essere realizzato, programmato e personalizzato da tutti coloro che pensano che il mondo potrebbe essere migliore con l'Open Source. In questo primo articolo voglio mostrare un aspetto interessante e fondamentale tramite il quale può essere realizzato il robot: Come far fare amicizia al Raspberry Pi ed Arduino!

Per giungere allo scopo finale ho immaginato che Arduino dovrà occupparsi di muovere il robot mentre il magnifico ed unico mini computer Raspberry Pi avrà il privilegio di comandare, infatti il suo compito sarà quello di inviare ad Arduino le istruzioni da eseguire, elaborare i dati rilevati dai sensori, gestire la visualizzazione del video, ricevere dalla rete (con relativa interfaccia web e/o applicazione specifica per cellulare) le istruzioni da eseguire, ed inviare sulla rete i valori letti dei sensori ed il video.

In questo articolo voglio mostrare a tutta la Community come è possibile far fare amicizia ad Arduino e Raspberry Pi... facendoli parlare tra di loro!

PREMESSA: Sono semplicemente un appassionato, un sognatore... un ragazzo a cui piacerebbe fare tanto ma ancora può fare ben poco. Per mandare avanti la realizzazione di questo progetto avrò bisogno dell'aiuto di tutta la community, perciò... Abbiate un po di pazienza.

Arduino e Raspberry Pi devono poter comunicare tra loro e la migliore soluzione credo che sia quella di utilizzare una comunicazione I2C. I circuiti base principali che abbiamo bisogno di utilizzare per realizzare questo robot sono:

  • Controllo dei motori - Tramite l’l298 che è un Compatto Hbridge duale per pilotare fino a 2 motori DC da 2A
  • Rilevatore di temperatura - tramite il sensore di temperatura DHT11
  • Rilevatore di distanza - tramite un sensore ad ultrasuoni
  • Rilevatore di luminosità - tramite una fotocellula
  • Circuito di accensione per luci - tramite un semplice circuito basato sul transistor BC557
  • Circuito di accensione per ventola - tramite un semplice circuito basasto sul transistor BC557

Dopo questa breve introduzione, voglio presentare il primo articolo della serie: Come costruire un Robot con Raspberry Pi ed Arduino

Come far comunicare Arduino e Raspberry Pi.

Naturalmente, come ho già detto, le due board hanno bisogno di comunicare tra di loro per effettuare le operazioni che faranno funzionare il robot, e le principali sono:

  • Muovere il Robot in 4 direzioni
  • Vedere la zona anteriore del Robot
  • Accendere le luci nel caso in cui ci sia buio
  • Integrare un sistema di automatizzazione per inserire il robot in un sistema di sorveglianza ed allarme

E’ possibile effettuare questo collegamento in diversi modi, tra cui principalmente:

  • Tramite la porta USB
  • Tramite UART
  • Tramite Wireless - Wifi, Bluetooth, Zigbee, …
  • Tramite I2C

Il collegamento che ci sarà tra Arduino e Raspberry Pi è molto breve, e quindi è molto semplice effettuare il collegamento tramite I2C, in quanto il mini computer ha sulla board 2 pin I2C tra le GPIO che possono essere collegati tramite 2 fili a due entrate analogiche di Arduino, più in particolare il pin A4 (SDA) e A5 (SCL). E’ scontato il fatto che deve essere collegata anche la massa.

Inoltre, come sicuramente si potrà vedere nel prossimo articolo, l’atmega328 sarà inserito su una board da me progettata per effettuare con facilità i collegamenti tra i sensori, l’alimentazione, e le 2 schede. Sarà una board monolayer progettata interamente da me e quindi sicuramente non sarà perfetta, ma almeno l'ho realizzata con Passione dedicandogli del tempo.

Raspberry Pi ha solo due porte USB, che verranno utilizzate per connettere una webcam e la chiavetta Wifi.

Come funziona questo collegamento?

Inizialmente ero quasi sicuro di aver bisogno di un convertitore di livello perchè Raspberry Pi lavora a 3,3V ed Arduino a 5V, ma dopo aver studiato il tipo di connessione che voglio effettuare, ho appreso che se il mini computer viene utilizzato come Master ed Arduino come slave non c’è ne di bisogno perchè Arduino non ha resistenze di pull-up installate.

Sul Raspberry Pi utilizzando Raspian bisogna effettuare alcuni passaggi che permettano di sbloccare l’utilizzo dell’ I2C, in quanto nonostante nell’ultima versione siano presenti i driver, di default è disabilitato.

Per prima cosa bisogna rimuovere l’I2C dalla blacklist digitando sul Raspberry Pi:

$ cat /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708

Dopodichè bisogna aggiungere una riga alla fine del file /etc/modules, digitando:

sudo nano /etc/modules

Si aprirà l’editor testuale di Linux. Bisogna posizionarsi alla fine del codice ed aggiungere questa riga:

i2c-dev

Salviamo premendo CTRL+X e Y Adesso bisogna installare il Tool I2C digitando:

sudo apt-get install i2c-tools

Ci siamo quasi... Adesso se l’utente che vorremo utilizzare è “pi”, dobbiamo dargli i permessi necessari digitando:

sudo adduser pi i2c

Perfetto! Adesso bisogna riavviare Raspberry. Se si vuole effettuare un Test si può provare a vedere i dispositivi I2C digitando:

ll /dev/i2c*

Invece se si vuole scansionare il bus I2C bisogna digitare:

i2cdetect-y 1

Bisogna installare il supporto I2C per Python (Documentazione, Quick2wire).

Adesso passiamo ad Arduino. Un semplice esperimento che può essere effettuato per testare il collegamento I2C tra arduino e Raspberry Pi. Configurare Arduino come slave. Tramite l’I2C Arduino riceve una cifra, la riconosce e se la cifra è ='1’ viene acceso un led. Ecco lo sketch per Arduino:

#include 

#define SLAVE_ADDRESS 0x04
int number = 0;
int state = 0;

void setup() {
   pinMode(13, OUTPUT);
   Serial.begin(9600);         // avvia la seriale per l’output
   // inizializzazione I2C
   Wire.begin(SLAVE_ADDRESS);

   // definizione callbacks per la comunicazioneI2C
   Wire.onReceive(receiveData);
   Wire.onRequest(sendData);

   Serial.println("Ready!");
}

void loop() {
   delay(100);
}

// callback for received data
void receiveData(int byteCount){

   while(Wire.available()) {
       number = Wire.read();
       Serial.print("data received: ");
       Serial.println(number);

       if (number == 1){

           if (state == 0){
               digitalWrite(13, HIGH); // set the LED on
               state = 1;
           }
           else{
               digitalWrite(13, LOW); // set the LED off
               state = 0;
           }
        }
    }
}

// callback for sending data
void sendData(){
   Wire.write(number);
}

Adesso ecco di seguito un codice in Python per il raspberry Pi che funziona così: il Raspberry Pi chiede di inserire una cifra e la invia ad Arduino, Arduino riconosce i dati ricevuti e li rinvia da dove li ha ricevuti:

import smbus
import time
# per RPI version 1, utilizza "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# Questo è l’indirizzo che abbiamo configurato nello sketch di Arduino
address = 0x04

def writeNumber(value):
   bus.write_byte(address, value)
   # bus.write_byte_data(address, 0, value)
   return -1

def readNumber():
   number = bus.read_byte(address)
   # number = bus.read_byte_data(address, 1)
   return number

while True:
   var = input("Inserisci 1 - 9: ")
   if not var:
       continue

   writeNumber(var)
   print "RPI: Ciao Arduino, Ti ho mandato ", var
   # sleep one second
   time.sleep(1)

   number = readNumber()
   print "Arduino: Hey RPI, ho ricevuto un numero ", number
   print

Ecco un immagine che rappresenta come effettuare il collegamento tra Raspberry Pi ed Arduino:

Dopo quest’articolo di introduzione voglio annunciare ufficialmente che intendo andare fino in fondo per realizzare questo progetto e spero che possa essere realizzato senza incontrare intoppi.

Vi piace?

Che ne dite?

Ditemi cosa ne pensate così da migliorare il progetto perchè sarà davvero fantastico. Sono a disposizione per rispondere nei commenti. Il prossimo articolo sicuramente sarà molto più interessante di questo perchè porterà a far fare un altro passo verso la realizzazione di questo Particolare robot. Quindi nel prossimo articolo troverete altre informazioni interessanti per Costruire un robot rover con Arduino e Raspberry Pi. A presto!

Scarica subito una copia gratis
Tags:

40 Commenti

  1. Avatar photo willygroup 24 Luglio 2013
  2. Avatar photo AngPri75 24 Luglio 2013
  3. Avatar photo willygroup 24 Luglio 2013
  4. Avatar photo Ivan Scordato 24 Luglio 2013
  5. Avatar photo Ivan Scordato 24 Luglio 2013
  6. Avatar photo AngPri75 24 Luglio 2013
  7. Avatar photo Lucasss 24 Luglio 2013
  8. Avatar photo Ivan Scordato 24 Luglio 2013
    • Avatar photo Francesco Ferrara 28 Dicembre 2015
      • Avatar photo Francesco Ferrara 28 Dicembre 2015
  9. Avatar photo Ivan Scordato 24 Luglio 2013
  10. Avatar photo Piero Boccadoro 27 Luglio 2013
  11. Avatar photo Piero Boccadoro 27 Luglio 2013
  12. Avatar photo Piero Boccadoro 27 Luglio 2013
  13. Avatar photo Piero Boccadoro 27 Luglio 2013
  14. Avatar photo Piero Boccadoro 27 Luglio 2013
  15. Avatar photo Ivan Scordato 27 Luglio 2013
  16. Avatar photo Lucasss 27 Luglio 2013
  17. Avatar photo Ivan Scordato 27 Luglio 2013
  18. Avatar photo AngPri75 29 Luglio 2013
  19. Avatar photo Ivan Scordato 29 Luglio 2013
  20. Avatar photo Ivan Scordato 29 Luglio 2013
  21. Avatar photo AngPri75 31 Luglio 2013
  22. Avatar photo Ivan Scordato 31 Luglio 2013
  23. Avatar photo vincenzo.gis 4 Agosto 2013
  24. Avatar photo Ivan Scordato 4 Agosto 2013
  25. Avatar photo AngPri75 21 Agosto 2013
  26. Avatar photo Ivan Scordato 21 Agosto 2013
  27. Avatar photo AngPri75 22 Agosto 2013
  28. Avatar photo Ivan Scordato 22 Agosto 2013
  29. Avatar photo raghi11 11 Novembre 2013
  30. Avatar photo simoneangeletti22 16 Novembre 2013
  31. Avatar photo Ivan Scordato 23 Novembre 2013
  32. Avatar photo raghi11 25 Novembre 2013
  33. Avatar photo Ivan Scordato 26 Novembre 2013
  34. Avatar photo raghi11 27 Novembre 2013
    • Avatar photo mikelin 22 Marzo 2015
  35. Avatar photo luke_451 16 Febbraio 2015
  36. Avatar photo michele.brini 10 Marzo 2017
    • Avatar photo IvanScordato 10 Marzo 2017

Rispondi a raghi11 Annulla risposta

Seguici anche sul tuo Social Network preferito!

Send this to a friend