Saltar al contenido
Control Automático Educación

Bus de Comunicación I2C con Arduino

Hola controleros y controleras en el día de hoy vamos a aprender como funciona la comunicación I2C con Arduino, y a modo de Ejemplo vamos a conectar una Interfaz I2C LCD para conectar la pantalla LCD a través de este protocolo pero puedes usarlo para cualquier otro periférico.

Adicionalmente podrás descargar un código totalmente gratis para que puedas reconocer la dirección del BUS I2C de cualquier periférico.

Antes de comenzar, te hago la invitación para que veas nuestro CURSO GRATIS DE ARDUINO.

Y puedes suscribirte al canal de YouTube si deseas seguir aprendiendo a programar microcontroladores como por ejemplo el Arduino.

I2C Arduino

Puedes ver el video que preparé para ti para que puedas entender como trabajar con el protocolo de comunicación I2C usando la plataforma de Arduino.

¿Qué es el Bus de Comunicación I2C en Arduino?

El protocolo del bus de comunicación I2C (Inter-integrated Circuit)  es un protocolo que permite controlar varios dispositivos conectados únicamente a dos hilos. Estos dos hilos corresponden a la línea SDA encargada de transmitir los datos y la línea SCL encargada de enviar los sincronismos de reloj.

A continuación, podemos ver un esquema de conexión de varios dispositivos que usan la comunicación i2c donde vemos que únicamente emplean esas dos líneas y claro, la alimentación VCC y GND.

Conexión del protocolo I2C con Arduino
Conexión del protocolo I2C con Arduino

Dentro de ese bus de comunicación I2C, pueden existir varios maestros y esclavos o un maestro y varios esclavos. La clave es que cada uno de esos dispositivos poseen una dirección única, por lo cual es posible hacer comunicación usando solo las dos líneas.

Como podemos ver, ambas líneas SDA y SCL son líneas de colector abierto, por lo que siempre se debe colocar dos resistencias a positivo (PULLUP) para garantizar el estado alto en ambas líneas.

En una ENTRADA anterior de este sito WEB explicamos detalladamente el funcionamiento del protocolo I2C que puede aplicarse a cualquier microcontrolador. Esas serán las bases para que aprendas a utilizar el I2C Arduino y entiendas el funcionamiento que hay debajo de esto. Sin embargo, te resumo el funcionamiento del I2C en el siguiente video:

Como encontrar la Dirección I2C

Cada dispositivo que usa el protocolo de comunicación I2C tiene una dirección dentro del bus de comunicación. Esta dirección muchas veces puede ser establecida físicamente en el circuito colocando algunos pines a positivo y negativo, o puenteando algunas entradas. Todo eso estará disponible siempre en el datasheet del dispositivo que queramos conectar via I2C con Arduino.

Sin embargo, si no es posible obtener el datasheet, podemos averiguar la dirección I2C del dispositivo programando el CÓDIGO DE ARDUINO QUE TE DEJO AL FINAL DE ESTE POST y verificando la dirección en el Serial Monitor, tal y como se muestra en el siguiente video.

Salidas Digitales en Arduino

EEPROM Interna PIC

Memoria EEPROM del PIC

PINES I2C de Arduino

La conexión de cualquier dispositivo I2C debe respetar los siguientes pines dependiendo de la placa que tengas

Adaptador LCD a I2C Arduino Uno, Nano, Mini. Arduino Mega , DUE Arduino Leonardo
  GND GND GND GND
  VCC 5V 5V 5V
  SDA A4 20 2
  SCL A5 21 3

Para usar el bus I2C en Arduino, el IDE Standard de Arduino nos proporciona la librería (library) conocida como: “Wire.h”, que contiene las funciones necesarias para controlar el hardware integrado.

Existen otras librerías más avanzadas que Wire.h para manejar el bus I2C en Arduino, como por ejemplo I2Cdevlib o I2C library.

Interfaz LCD via I2C

A modo de ejemplo, vamos a usar uno de los módulos más populares que utilizan la comunicación I2C, y es el modulo de interfaz LCD via I2C.

La ventaja de usar este módulo es que podremos conectar un LCD utilizando únicamente dos líneas del Arduino y la alimentación.

lcd i2c arduino

Si viste la entrada de I2C PIC o viste el video de este post, ya sabrás que cada dispositivo tiene una dirección única dentro del protocolo, en este caso el LCD I2C de Arduino tiene tres pines los cuales sirven para establecer físicamente su dirección.

Pines A0, A1 y A2. Puenteando estos pines por medio de soldadura podremos definir la dirección del periférico. Estos tres pines corresponden a los bits menos significativos de la dirección I2C del módulo. La dirección 0x3F en binario sería: 0|0|1|1|1|A2|A1|A0 y la dirección 0x27: 0|0|1|0|0|A2|A1|A0.

Pines I2C Interfaz LCD
Pines interfaz I2C LCD

O también podemos emplear el código anterior para saber su dirección.

LCD con Arduino I2C

Podemos encontrar infinidad de librerías para la manipular el LCD I2C Arduino. En este caso vamos a usar la librería LiquidCrystal_I2C que posee funciones similares a la propia librería del Arduino IDE.

LiquidCrystal_I2C  lcd(lcd_Addr, lcd_cols, lcd_rows)

Función constructor, crea un objeto de la clase LiquidCrystal_I2C, con dirección, columnas y filas indicadas.

lcd.init()

Inicializa el modulo adaptador LCD a I2C, esta función internamente configura e inicializa el I2C y el LCD.

lcd.clear()

Borra la pantalla LCD y posiciona el cursor en la esquina superior izquierda (posición (0,0)).

lcd.setCursor(col, row)

Posiciona el cursor del LCD en la posición indicada por col y row(x,y);

lcd.print()

Escribe un texto o mensaje en el LCD.

lcd.scrollDisplayLeft()

Se desplaza el contenido de la pantalla (texto y el cursor) un espacio hacia la izquierda.

lcd.scrollDisplayRight()

Se desplaza el contenido de la pantalla (texto y el cursor) un espacio a la derecha.

lcd.backlight();

Enciende la Luz del Fondo del LCD

lcd.noBacklight();

Apaga la Luz del Fondo del LCD

Ejemplo LCD I2C Arduino

Vamos a montar el siguiente circuito y verificar el funcionamiento de un display conectado a través de la comunicación I2C

Interfaz I2C LCD

A continuación te muestro como puedes simular el protocolo de comunicación I2C de arduino con Proteus. En el esquema del proteus puedes ver como está conformado internamente el módulo LCD-I2C.

Arduino Proteus I2C LCD
Circuito del Arduino en Proteus con Interfaz I2C LCD

A continuación te dejo el código de Ejemplo del LCD I2C junto con el código para determinar la dirección I2C de cualquier dispositivo de Arduino para que lo descargues totalmente grátis.

>> DESCARGAR CÓDIGO Y CIRCUITO EN PROTEUS <<

Código Interfaz LCD I2C

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

//Crear el objeto lcd  dirección  0x3F y 16 columnas x 2 filas
LiquidCrystal_I2C lcd(0x27,16,2);  //

void setup() {
  // Inicializar el LCD
  lcd.init();
  
  //Encender la luz de fondo.
  lcd.backlight();
  
  // Escribimos el Mensaje en el LCD en una posición  central.
  lcd.setCursor(10, 0);
  lcd.print("CURSO DE ARDUINO");
  lcd.setCursor(1, 1);
  lcd.print("https://controlautomaticoeducacion.com");
}

void loop() {
  //desplazamos una posición a la izquierda
  lcd.scrollDisplayLeft(); 
  delay(500);
}

Código para determinar dirección I2C

#include <Wire.h>              


void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.