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

connessione 12c

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!

STAMPA

34 Comments

  1. IvanScordato Ivan Scordato 23 novembre 2013
  2. willygroup 24 luglio 2013
  3. AngPri75 24 luglio 2013
  4. willygroup 24 luglio 2013
  5. IvanScordato Ivan Scordato 24 luglio 2013
  6. IvanScordato Ivan Scordato 24 luglio 2013
  7. AngPri75 24 luglio 2013
  8. Lucasss 24 luglio 2013
  9. IvanScordato Ivan Scordato 24 luglio 2013
  10. IvanScordato Ivan Scordato 24 luglio 2013
  11. Piero Boccadoro 27 luglio 2013
  12. Piero Boccadoro 27 luglio 2013
  13. Piero Boccadoro 27 luglio 2013
  14. Piero Boccadoro 27 luglio 2013
  15. Piero Boccadoro 27 luglio 2013
  16. IvanScordato Ivan Scordato 27 luglio 2013
  17. Lucasss 27 luglio 2013
  18. IvanScordato Ivan Scordato 27 luglio 2013
  19. raghi11 25 novembre 2013
  20. AngPri75 29 luglio 2013
  21. IvanScordato Ivan Scordato 26 novembre 2013
  22. IvanScordato Ivan Scordato 29 luglio 2013
  23. IvanScordato Ivan Scordato 29 luglio 2013
  24. AngPri75 31 luglio 2013
  25. IvanScordato Ivan Scordato 31 luglio 2013
  26. raghi11 27 novembre 2013
  27. raghi11 11 novembre 2013
  28. vincenzo.gis 4 agosto 2013
  29. IvanScordato Ivan Scordato 4 agosto 2013
  30. simoneangeletti22 16 novembre 2013
  31. AngPri75 21 agosto 2013
  32. IvanScordato Ivan Scordato 21 agosto 2013
  33. AngPri75 22 agosto 2013
  34. IvanScordato Ivan Scordato 22 agosto 2013

Leave a Reply