Archivos Mensuales: julio 2014

Comunicación I²C

I²C (Inter-Integrated Circuit) es un bus de comunicación serie muy utilizado para la comunicación entre circuitos integrados, uno de sus usos mas comunes es la comunicación entre un microcontrolador y sensores periféricos. I²C es un bus multi-maestro, es decir permite que haya múltiples maestros y múltiples esclavos en el mismo bus. El bus I²C utiliza dos líneas para transmitir la información: una para los datos (SDA) y otra para la señal de reloj(SCL) y una tercera de referencia (masa). La misma línea de datos envía la información en las dos direcciones (half duplex), por lo que es necesario un control de acceso al bus y un direccionamiento de cada elemento. Así cada dispositivo tiene una dirección de 7 bits, es decir se pueden tener hasta 128 dispositivos conectados al mismo bus, hay que tener en cuenta que existen versiones extendidas de I2C con direccionamiento a 8,10 y 12 bits.

Las líneas SDA y SCL están independientemente conectadas a dos resistores Pull-Up que se encargaran de que el valor lógico siempre sea alto a no ser que un dispositivo lo ponga a valor lógico bajo. Aunque es cierto que se pueden conectar sin las pull-up y funciona, para evitar posibles errores, lo mejor es asegurarse poniendo las pull-up.

Comunicacion_I2C_Teorico

Estructura de la Comunicación  I2C.

  • Bit de Start: Este bit provoca un cambio de 1 a 0 cuando SCL esta a nivel alto. (Master)
  • Dirección: El primer byte enviado empieza con 7 bits de dirección, el cual indica a quien enviamos o solicitamos el dato. (Master)
  • R/W (Leer/Escribir): El siguiente bit indica si vamos a realizar una operación de lectura o escritura. (Master)
  • ACK: Este bit esta presente al final de cada byte que enviamos y nos permite asegurarnos que el byte ha llegado a su destino. De este modo el que envía deja el bit a 1 y si alguien ha recibido el mensaje fuerza ese bit a 0. De esta manera confirma que le ha llegado el byte y la transmisión puede continuar. (Slave)
  • Byte de Datos: Aquí ponemos el dato que queramos escribir o leer. (Master/ Slave)
  • Se espera un ACK del receptor. (Master/ Slave)
  • Se repiten los dos últimos pasos tantas veces como sea necesario.
  • Bit de Stop. Este bit provoca el paso de 0 a 1 cuando la línea SCL se encuentra en alto. Esto termina la transmisión y deja el bus libre para que otro puede empezar a transmitir. (Master)

ProtocoloI2C

Pines en Arduino.

Arduino Uno                        Pin analógico 4(SDA) y Pin analógico 5(SCL).

Arduino Mega                      Pin 20 (SDA) y Pin 21(SCL).

Arduino Leonardo              Los pines I2C están pintados al lado de AREF.

En Arduino para usar el bus I2C es necesario la librería <Wire.h>, algunas de sus funciones son:

  • begin() Inicia el bus I2C y nos define como maestros.
  • begin(direccion) Inicia el bus I2C con la dirección de 7 bits de esclavo (opcional); si no se específica, se configura como maestro.
  • beginTransmission(direccion) Comienza una transmisión a un dispositivo I2C esclavo con la dirección dada.
  • endTransmission() Finaliza la comunicación con un STOP y deja el bus libre.
  • send(value) Envía datos desde un esclavo (un byte) en respuesta a una petición de un maestro, o prepara los bytes para transmitir de un maestro a un esclavo (entre llamadas a beginTransmission() y endTransmission()).
  • send(string) Envía datos desde un esclavo(una cadena) ……
  • send(data, quantity) Envía datos desde un esclavo (un vector de datos) ……. quantity: el número de bytes de datos para transmitir (byte)
  • write(value) Escribe los datos de un dispositivo esclavo(un byte) en respuesta a una petición de un maestro, o colas de bytes para la transmisión de un maestro a esclavo del dispositivo (entre llamadas a beginTransmission () y endTransmission ()).
  • write(string) Escribe los datos de un dispositivo esclavo (una cadena) ……
  • write(data, length) Escribe los datos de un dispositivo esclavo (un vector de datos) ……… length: el número de bytes a transmitir
  • onReceive(funcion) Registra una función que será llamada cuando un dispositivo esclavo reciba una transmisión desde un maestro.
  • onRequest(funcion) Registra una función que será llamada por el dispositivo esclavo cuando un maestro solicite datos.

Si quieres saber algunos comandos más, visita la página http://arduino.cc/en/pmwiki.php?n=Serial/Write

Ahora vamos a implementar estos conceptos a Arduino. En el ejemplo he utilizado dos placas Arduino( Duemilanove y Mega 2560). He realizado unas uniones con unos cables como se observa en el dibujo

Pines Duemilanove                       Pines Mega 2560

Pin 4                                      Pin 20

Pin 5                                      Pin 21

Pin + 5 v                               Pin + 5 v

Pin GND                               Pin GND

Las líneas SDA y SCL están independientemente conectadas a dos resistores Pull-Up de 10K que se encargaran de que el valor lógico siempre sea alto a no ser que algunos de los Arduinos lo ponga a valor lógico bajo. Aunque es cierto que se pueden conectar sin las pull-up y funciona, para evitar posibles errores, lo mejor es asegurarse poniéndolas.

Transmito un bit con el Arduino Mega y al recibirlo el Arduino Duemilanove realiza una de las tres acciones siguientes:

  • Si recibe un 1, enciende la patilla azul del Led RGB
  • Si recibe un 2, enciende la patilla rojo del Led RGB
  • Si recibe un 3, enciende la patilla verde del Led RGB

Esquema Eléctrico:

Comunicacion_I2C_TeoricoEsquema Práctico:

Comunicacion_I2C_Practico_bb

Código del Programa Maestro:

Master_I2C_Codigo

Código del Programa Esclavo:

Slave_I2C_Codigo

Fotos:

Conjunto_Arriba_I2C

Vista Superior

Conjunto_Frontal_I2C

Vista Frontal

Master_I2C

Detalle del Master

Slave_I2C

Detalle del Slave

Detalle_Resistencias_Bus_I2C

Detalle de las resistencias pull-up

Código fuente:

Maestro       Comunicación_Master_I2C.ino

Esclavo        Comunicación_Slave_I2C-ino

Ficha del Proyecto:

Comunicacion_I2C_Ficha_27

Vídeo resumen:

Anuncios