Vamos a ver si podemos comunicar una Arduino y una Raspberry Pi mediante I2C. Empezaremos por lo básico: una sola dirección, con la Raspberry Pi como «master» y el arduino como «esclavo».
No complicaremos mucho de momento… copia y pega de los ejemplos de Arduino para hacer una recepción de datos por I2C, con alguna pequeña modificación para que las cadenas salgan mejor por pantalla y que pite el buzzer:
#include <Wire.h>
int led = 13;
int buzz = 4;
int direccion=31;
void setup() {
pinMode(led, OUTPUT);
pinMode(buzz, OUTPUT);
Wire.begin(direccion); // nos unimos al bus i2c bus con la dirección #direccion
Wire.onReceive(receiveEvent); // registramos el evento de recepción de datos
Serial.begin(9600);
beep(); // Pos eso... beep... xD
}
void loop() {
// Ponemos a la placa a hacer algo...
digitalWrite(led, HIGH); // Encendemos el led de la placa
delay(100); // Esperamos un poco
digitalWrite(led, LOW); // Apagamos el led de la placa
delay(100); // Esperamos un poco
}
void receiveEvent(int howMany) {
beep();
Serial.print("RX:");
while(Wire.available()>0) // Mientras tengamos caracteres en el buffer
{
char c = Wire.read(); // Leemos uno
Serial.print(c); // Imprimimos
}
Serial.println('|'); // Para que veamos por pantalla cuando acaba
}
void beep() {
digitalWrite(buzz, HIGH);
delay(50);
digitalWrite(buzz, LOW);
}
Y en la parte de la Raspberry Pi algo también muy simple (hay que configurar primero el I2C en la Raspberry Pi)
import smbus
import time
bus = smbus.SMBus(0)
DEVICE_ADDRESS = 0x1F # La misma con la que configuramos el arduino
DEVICE_MODE1 = 0x00
DEVICE_COM0 = 0x48 # 'H'
cadena= [0x48, 0x6f, 0x6c, 0x61] #'H' 'o' 'l' 'a'
#Bucle principal
while True:
try:
#bus.write_byte_data(0x1f,DEVICE_MODE1 , DEVICE_COM0 ) #Con esto enviamos un byte
bus.write_i2c_block_data(DEVICE_ADDRESS, DEVICE_COM0 , cadena) # Con esto enviamos un array de bytes
time.sleep(0.1)
except IOError as e:
print e
Referencias:
http://razzpisampler.oreilly.com/ch10.html

