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