Archivo de la categoría: python

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

Configurar I2C en la Raspberry Pi

En las Raspberry no viene configurado por defecto el I2C, primero tenemos que activar los modulos:

Editamos:

sudo nano /etc/modules

y añadimos las líneas:

i2c-bcm2708
i2c-dev

Ademas tendremos que instalar esto para disponer de las herramientas de línea de comandos:

sudo apt-get install i2c-tools

Y esto si queremos usar el bus I2C desde python:

sudo apt-get install python-smbus

Ademas tendremos que comprobar que en /etc/modprobe.d/raspi-blacklist.conf no aparecen los mismos módulos de antes. Si aparecen, habrá que comentarlos:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

Y… ¡reiniciamos!

sudo reboot

Con suerte a la vuelta usando el comando i2cdetect (con el valor 1 para la Resumen de la configuración del bus I2C en la Raspberry Pi B 512Mb, 0 para la antigua) podremos detectar los dispositivos que tengamos colgados del bus i2c:

sudo i2cdetect -y 1

Referencias:
https://learn.adafruit.com/adafruits-raspberry-pi-lesson-4-gpio-setup/configuring-i2c
Imagen: http://opensource.com/life/14/3/favorite-raspberry-pi-projects