Saltar al contenido

Bus de Comunicación I2C con Arduino

¡Bienvenidos controleros y controleras! Hoy te voy a guiar a través del protocolo de comunicación I2C en Arduino. Aprenderás no solo cómo funciona este popular bus de datos, sino también cómo implementarlo fácilmente en tus proyectos, como la conexión de un LCD vía I2C. Este tutorial es perfecto para aquellos que desean comprender en detalle cómo funcionan los pines SDA y SCL en el Arduino Uno, Nano, y otras placas. Además, al final, podrás descargar un código gratuito para detectar la dirección del bus I2C de cualquier 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 bus de comunicación I2C (Inter-Integrated Circuit) es esencial en proyectos con Arduino debido a su capacidad para conectar múltiples dispositivos usando solo dos hilos: SDA (Serial Data) y SCL (Serial Clock). La línea SDA se encarga de enviar y recibir datos, mientras que SCL sincroniza esta transferencia con pulsos de reloj. En esta sección, exploraremos cómo estos dos pines trabajan en conjunto en placas como el Arduino Uno y cómo puedes usarlos para conectar periféricos como sensores, memorias, y pantallas LCD.

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

En un bus I2C, puedes tener múltiples dispositivos conectados como maestros o esclavos, pero cada dispositivo debe tener una dirección única para que la comunicación sea efectiva. Por ejemplo, al conectar un sensor de temperatura y un LCD a un Arduino Uno, ambos dispositivos compartirán los pines SDA y SCL (A4 y A5 en Arduino Uno), pero serán identificados de manera única mediante sus direcciones I2C. Recuerda que, para que el bus funcione correctamente, es vital que ambas líneas tengan resistencias pull-up para mantener el nivel lógico alto cuando no hay comunicación activa

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.

Relevador Arduino

Relevador con Arduino

Display LCD con PIC

LCD con PIC

PINES I2C de Arduino

Cuando trabajas con I2C en Arduino, es crucial conectar correctamente los dispositivos a los pines adecuados según la placa que utilices. Por ejemplo, en un Arduino Uno, los pines I2C son A4 (SDA) y A5 (SCL), mientras que en un Arduino Mega, son 20 (SDA) y 21 (SCL). Estos pines son la clave para una comunicación exitosa entre tu Arduino y los periféricos como memorias EEPROM, sensores, y módulos LCD. A continuación, te mostramos una tabla con los pines I2C de las placas más comunes, así como una breve explicación sobre cómo funcionan estos pines en cada caso.

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

Para mostrarte cómo funciona la comunicación I2C en la práctica, conectaremos un LCD a un Arduino Uno usando la interfaz I2C. Esto no solo libera los pines digitales, sino que también simplifica el cableado, ya que solo necesitas conectar SDA y SCL junto con la alimentación. Con librerías como LiquidCrystal_I2C, puedes controlar fácilmente la pantalla, ajustar la retroiluminación, y desplazar el texto, todo a través de estos dos pines. Sigue leyendo para aprender cómo identificar la dirección I2C de tu LCD y usarla en tu código Arduino.

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

Para finalizar, te dejo el código de ejemplo que te permitirá conectar y controlar un LCD vía I2C usando tu Arduino Uno, Nano, o cualquier otra placa compatible. Además, incluye un escáner I2C para que puedas identificar la dirección de cualquier dispositivo que conectes a tu Arduino. Este código es completamente gratuito y está diseñado para que puedas integrarlo fácilmente en tus proyectos de comunicación I2C.

>> 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.