Todo sobre el bus I2C de Arduino

Arduino bus I2C

Con Arduino se pueden crear gran cantidad de proyectos como has podido comprobar si lees Hwlibre, programando el microcontrolador de una forma sencilla. Pero entre las conexiones analógicas y digitales de esta placa de hardware libre, se encuentran algunas qu aún siguen siendo algo desconocidas para muchos principiantes, como el verdadero potencial de las conexiones PWM, el SPI, los pines RX y TX del puerto serie, o el propio bus I2C. Por eso, con esta entrada podrás al menos conocer todo lo que necesitas del I2C.

Con el bus I2C se pueden conectar y usar bastantes dispositivos de terceros que disponen de este tipo de protocolo para comunicarse con la placa Arduino. Entre ellos, podrás conectar acelerómetros, displays, contador, brújulas, y muchos más circuitos integrados gracias a este invento de Philips.

¿Qué es I2C?

I2C hace referencia a Inter-Integated Circuit, es decir, circuito inter-integrado. Es un bus serie de comunicación de datos desarrollado en 1982 por la empresa Philips Semiconductors, lo que hoy en día es NXP Semiconductors tras deshacerse de esta sección. En un inicio se creó para las televisiones de esta marca, para comunicar varios chips internos de forma sencilla. Pero desde 1990 el I2C se ha extendido y es usado por muchos fabricantes.

Actualmente lo usan decenas de fabricantes de chips para múltiples funciones. Atmel, el creador de los microcontroladors de las placas Arduino, introdujo la designación TWI (Two Wired Interface) por motivos de licencia, aunque es idéntico a I2C. Pero en 2006, la patente original caducó y ya no está sujeto a derechos de autor, por lo que se ha vuelto a usar el término I2C (solo sigue protegiéndose el logo, pero no se restringe su implementación o uso del término).

Detalles técnicos del bus I2C

bus I2C

El bus I2C se ha transformado en un estándar en la industria, y Arduino lo ha implementado para la comunicación con los periféricos que lo necesiten. Solo necesita de dos líneas o cables para su funcionamiento, uno para la señal de reloj (CLK) y otro para el envío de datos serie (SDA). Eso resulta ventajoso frente a otras comunicaciones frente al bus SPI, aunque su funcionamiento es algo más complejo por la circuitería adicional necesaria.

En este bus, cada dispositivo conectado a él dispone de una dirección que se emplea para acceder a estos dispositivos de forma individual. Esta dirección es fija por hardware, modificando los últimos 3 bits mediante jumpers o DIPs de interruptores, aunque también se puede hacer por software. Cada dispositivo tendrá una dirección única, aunque puede que varios de ellos la tengan igual y que se necesite usar un bus secundario para no generar conflictos o cambiarla si es posible.

Además, el bus I2C tiene una arquitectura tipo Master-Slave, es decir, maestro-esclavo. Eso significa que cuando se inicia la comunicación por parte de un dispositivo maestro, éste podrá mandar o recibir datos de sus esclavos. Los esclavos no podrán iniciar la comunicación, solo lo puede hacer el maestro, y tampoco pueden hablar los esclavos entre sí de forma directa sin que intervenga el maestro.

Si tienes varios maestros en el bus, solo uno podrá ejercer de maestro simultáneamente. Pero no merece la pena, ya que el cambio de maestro demanda de una alta complejidad, por lo que no es frecuente.

Ten en cuenta que el maestro proporciona la señal de reloj para sincronizar todos los dispositivos del bus. Eso elimina la necesidad de que cada esclavo necesite tener su propio reloj.

El protocolo del bus I2C también prevé el uso de resistencias pull-up en las lineas de voltaje (Vcc) de alimentación, aunque con Arduino no se suelen usar estas resistencias pull-up porque las bibliotecas de programación como Wire activa las internas con valores de 20-30 k. Eso puede resultar demasiado blando para algunos proyectos, po tanto, los flancos de subida de la señal serán menos rápidos, por lo que se pueden usar velocidades menores y distancias de comunicación inferiores. Para corregir eso es posible que necesites poner resistencias externas pull-up de 1k a 4k7.

Señal

I2C señal

 

La trama de comunicación de la que consta una señal del bus I2C se compone de los bits o estados (los empleados en Arduino, ya que el estándar I2C permite otros):

  • 8 bits, 7 de ellos de dirección del dispositivo esclavo al que se quiere acceder para enviar o recibir datos de él. Con 7 bits se pueden crear hasta 128 direcciones diferentes, por lo que se podría acceder teóricamente a 128 dispositivos, pero solo se puede acceder a 112, ya qu 16 se reservan para usos especiales. Y el bit adicional que indica si se quiere enviar o recibir información del dispositivo esclavo.
  • También existe un bit de validación, si no está activo la comunicación no será válida.
  • Luego vendrían los bytes de datos que se quieren enviar o recibir por los esclavos. Cada byte, como sabes, está compuesto por 8-bits. Ten en cuenta que por cada 8-bit o 1 byte de datos enviados o recibidos se necesitan 18 bits adicionales de validación, dirección, etc., lo que significa que el bus está muy limitado en cuanto a velocidad.
  • Un bit final de validación de la comunicación.

Además, la frecuencia de reloj para las transmisiones es de 100 Mhz de forma estándar, aunque existe un modo más rápido a 400 Mhz.

Ventajas y desventajas del bus I2C

Las ventajas son:

  • Sencillez al solo usar dos líneas.
  • Dispone de mecanismos para saber si la señal ha llegado frente a otros protocolos de comunicación.

Las desventajas son:

  • Velocidad de transmisión bastante baja.
  • No es un full duplex, es decir, no puede enviar y recibir de forma simultánea.
  • No usa paridad ni otro tipo de mecanismo de verificación para saber si los bits de datos que se reciben son correctos.

 

 

I2C en Arduino

Arduino bus I2C

En Arduino, según el modelo, los pines que se pueden habilitar para usar este bus I2C varían. Por ejemplo:

  • Arduino UNO, Nano, Mini Pro: se usa el A4 para SDA (datos) y A5 para SCK (reloj).
  • Arduino Mega: pin 20 para SDA y 21 para SCK.

Recuerda que para usarlo debes hacer uso de la biblioteca Wire.h para tus códigos de Arduino IDE, aunque existen otras como I2C y I2Cdevlib. Puedes leer los documentos de estas bibliotecas o nuestros artículos sobre los proyectos que te interesen para obtener códigos de cómo se programaría.

¿Cómo saber la dirección de un dispositivo para usarla con I2C?

Solo una última advertencia, y es que cuando compras ICs de fabricantes europeos, japoneses o americanos, te indican la dirección que debes usar para el dispositivo. En cambio, los chinos a veces no te la detallan o no es la correcta, por lo que no funcionará. Eso se puede solucionar fácilmente con un escáner de direcciones para saber a qué dirección te debes referir en tu sketch.

La comunidad de Arduino ha creado este código para escanear la dirección e identificarla de forma sencilla. Aunque te muestro el código aquí mismo:


#include "Wire.h"
 
extern "C" { 
    #include "utility/twi.h"
}
 
void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0;
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}
 
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " Encontrado!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}
 
 
const byte start_address = 8;
const byte end_address = 119;
 
void setup()
{
    Wire.begin();
 
    Serial.begin(9600);
    Serial.print("Escaneando bus I2C...");
    scanI2CBus( start_address, end_address, scanFunc );
    Serial.println("\nTerminado");
}
 
void loop() 
{
    delay(1000);
}


Sé el primero en comentar

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.