I2C Arduino



El bus de comunicación I2C 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 i2c donde vemos que únicamente emplean esas dos líneas y claro, la alimentación vcc y tierra.

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

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 I2CArduino Uno, Nano, Mini.Arduino Mega , DUEArduino Leonardo
  GNDGNDGNDGND
  VCC5V5V5V
  SDAA4202
  SCLA5213

Para usar el bus I2C en Arduino, el IDE Standard proporciona la librería “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, 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 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.

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
}




























No hay comentarios:

Publicar un comentario