Raspberry Pi Episodio 5: Arduino su I2C

Benvenuti nel 5° episodio di Raspberry Pi, come ben potete immaginare, a volte è necessario espandere lahttp://www.automazioneos.com/wp-admin/post-new.php rete del sistema che si sta utilizzando per associarlo a nuovi sensori o a nuove attuazioni.

Per fare questo, nei sistemi automatici si fa uso di bus di comunicazione sui quali viaggiano informazioni relative a sensori, microcontrollori e attuatori.

Con l’esperienza di oggi si vuole costruire una comunicazione tra due schede microcontrollore: Raspberry PI ed Arduino.

In seguito è riportato il diagramma per il collegamento:

schema_bb

il codice da caricare su Raspberry Pi:

[cpp] import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# This is the address we setup in the Arduino Program
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("Enter 1 – 9: ")
  if not var:
  continue

 writeNumber(var)
 print "RPI: Hi Arduino, I sent you ", var
 # sleep one second
 time.sleep(1)

 number = readNumber()
 print "Arduino: Hey RPI, I received a digit ", number
 print
[/cpp] e quello per Arduino:

[cpp] #include <Wire.h>

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

void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // start serial for output
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);

// define callbacks for i2c communication
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);
}

[/cpp] L’esperienza riprodotta ha avuto come fonte di ispirazione questo blog

Non perdete la prossima ed ultima puntata di Raspberry Pi!

 

 

 

Vincenzo Cicogna on FacebookVincenzo Cicogna on GithubVincenzo Cicogna on LinkedinVincenzo Cicogna on TwitterVincenzo Cicogna on Youtube
Vincenzo Cicogna

Editore e autore di questo blog di notte, sviluppatore software per sistemi embedded di giorno, passa il suo tempo a dilettarsi ed approfondire le dinamiche del mondo.

Appassionato di droni e tuttala, si diletta di tanto in tanto a scattare qualche foto in giro per il mondo o a leggere qualche libro.

Ama viaggiare, fotografare e condividere le sue produzioni.


Tags:
By Vincenzo Cicogna | gennaio 28th, 2015 | SHOW COMMENTS (2)

2 Responses

  1. Riccardo says

    Molto interessante e sopratutto utile! Grazie Vincenzo!

    • Vincenzo Cicogna
      Vincenzo says

      Grazie mille Riccardo 😉