¡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.
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.
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.
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.
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
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.
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.
Mi nombre es Sergio Andres Castaño Giraldo, y en este sitio web voy a compartir una de las cosas que mas me gusta en la vida y es sobre la Ingeniería de Control y Automatización. El sitio web estará en constante crecimiento, voy a ir publicando material sobre el asunto desde temas básicos hasta temas un poco más complejos. Suscríbete al sitio web, dale me gusta a la página en Facebook y únete al canal de youtube. Espero de corazón que la información que comparto en este sitio, te pueda ser de utilidad. Y nuevamente te doy las gracias y la bienvenida a control automático educación.