20 noviembre, 2013

Protocolo I2C y Arduino

El protocolo I2C, define las reglas de como podemos conectar diferentes dispositivos entre si, desarrollado por Philips en la década de los 80/90, convirtiéndose en la actualidad como un estándar. I2C crea un bus de comunicación entre los diferentes dispositivos en serie, esto nos permite conectar hasta 1000 dispositivos uno detrás de otro. La comunicación siempre se realizara entre dos dispositivos, uno actuara de maestro, este es el que trasmitirá la señal para sincronizar la transferencia de datos, y el otro de esclavo. El que hace de maestro, no tiene por que hacer esta función siempre, puede ir pasándose de uno a otro, aunque no todos los periféricos tienen esta funcionalidad, están diseñados para ser siempre esclavos.

Para identificar que periférico a enviado la información, cada uno de ellos tiene una dirección única, igual que una red de ordenadores donde cada ordenador tiene sus propia dirección.

El bus I2C consta de 3 lineas, SDA ( datos), SCL (reloj) y GND (masa)

  • SDA: Es la linea por donde circulan los datos, formateada de la siguiente forma:
    | start | A7 A6 A5 A4 A3 A2 A1 R/W | ACK | … DATA … | ACK | stop | idle |
  • SCL: Por esta linea va la señal para sincronizar las transferencias de datos.
  • GND o masa: Se utiliza como referencia de voltaje para el calculo de las otras lineas.

I2C y Arduino

Arduino cuenta la posibilidad de poder manejar comunicaciones I2C. Según el modelo de Arduino que tengamos, los pines de SDA y SCL, varían, En el caso del Arduino UNO los pines son: para SDA es el pin A4, y el SCL es el pin A5, para el LEONARD estos vienen marcados como tales, y en caso de MEGA el pin para el SDA es el pin digital 20 y para SCL es el pin digital 21.

[singlepic id=31 w=480 h=480 float=center]

Para el manejo de comunicaciones I2C en Arduino debemos importar la librería «Wire.h» ha nuestro programa. Esta librería esta incluida con las básicas que trae el programa de Arduino.

 Ejemplo con dos Arduinos

Ejemplo de como podemos unir dos Arduinos a través de una comunicación I2C. Uno de los Arduinos sera el maestro y el otro el esclavo.

Esquema de conexionado

[singlepic id=32 w=480 h=480 float=center]

Código fuente para el Arduino maestro:

#include <Wire.h>

void setup()
{
  Wire.begin();                // Iniciamos la comunicacin I2C, en el maestro la direccion no es obligatoria
  Serial.begin(9600);          // Iniciamos la comunicacion por el puerto serie para mostrar los datos

}

void loop()
{
  Wire.requestFrom(1, 12);       // Manda una peticion al escaldo numero 2 de 6 bytes

  while(Wire.available())       // Miestras tengamos datos en el buffer seguimos leyendo
  {
    char Datos = Wire.read();       // Leemos un byte y lo pasamos a una variable de tipo char
    Serial.print(Datos);            // Lo mostramos en el puerto serie
  }

  delay(60000);                  // Esperamos 1 minuto para volver a pedir informacin al esclavo
}

Código para el Arduino que hace las funciones de esclavo

#include <Wire.h>

void setup()
{
  Wire.begin(1);                // Nos añadimos al bus como esclavo, con la direccion 1
  Wire.onRequest(requestEvent); // Registro de eventos
}

void loop()
{
  delay(100);                    // retraso de 100 milisegundos
}

// Funcion que se ejecuta cuando recibe una peticion desde el maestro

void requestEvent()
{
  Wire.write("Hola maestro");   // Responde a la peticion del maestro de enviarle 12 bytes
}