Comunicación I2C Raspberry Pi -> Arduino

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».

Raspi+Arduino

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:RasPi Arduino I2C

#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

http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc

http://nullege.com/codes/search/smbus.SMBus.read_byte_data

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.