El I2C, la comunicación no-millenial de Arduino
¡Aloha maleante! Hoy no me voy andar con rodeos: Vamos a hablar del I2C. ¿Te suena? El I2C es muy utilizado para la comunicación entre dispositivos e integrados como son las pantallas OLED, tablets, acelerómetros, etc…
Vamos, que es una comunicación bastante común en el mundillo electrónico, así que habrá que ver cómo se utiliza esto y de dónde ha salido. Bueno, salir ha salido de Philips, que la creó en los años 80, llamándola Inter-Integrated Circuit.
IIC, que poco a poco mudó su nombre a I2C… Somos de un cómodo…
Los 4 elementos del I2C: Tierra, Aire, Agua y Fuego
El I2C es un protocolo de comunicación que se basa en 4 hilos. Uno de estos cables es el Vcc que serán 5 Voltios. El otro es GND, que es masa, 0 Voltios.
El tercer cable es el Serial Data, también llamado SDA. El SDA es el hilo utilizado para transmitir los datos. Así dos componentes se pueden pasar información utilizando este hilo.
El cuarto, y último, hilo es el de Serial Clock o SCL. Este hilo contiene la señal de reloj, que es la que indica cuando hay que leer los datos del SDA para que tengan sentido para todos.
Y claro, aquí es cuando llega el Juego de Tronos del I2C. ¿Quién decide cuándo se lee? El master o maestro. En este tipo de comunicaciones tendremos un maestro que va marcando el ritmo de la comunicación y el resto de dispositivos o integrados serán esclavos y leerán cuando así lo marque el maestro.
Ruedan cabezas con tanto maestro suelto…
Aunque no lo parezca, este Juego de Tronos tiene una serie de implicaciones. La más inmediata es que todos los dispositivos tienen que tener un identificador para saber quién es quién. Esto se hace mediante una dirección de 7 bits, lo que nos deja 128 posibles direcciones.
La otra es más relevante: No hay una velocidad de comunicación. Así como en la comunicación serie o bluetooth definimos una comunicación, como podría ser 9600 o 115200 de baudrate, aquí ese problema desaparece.
Esto es porque es el master el que va dirigiendo el reloj a su antojo y el que marca cuándo se debe de actuar.
¿Qué pasaría si el maestro muere? ¿Hay relevo generacional? Pues sí, porque aunque solo puede haber un maestro, el maestro puede ser sustituido en cualquier momento. Eso sí, el antiguo maestro sufrirá un downgrade y será tratado como esclavo ahora…
Información básica sobre Proteción de datos
Responsable ➥ Sergio Luján Cuenca
Finalidad ➥ Gestionar el envío de correos electrónicos con artículos, noticias y publicidad. Todo relacionado con los temas de rufianenlared.com
Legitimación ➥ Consentimiento del interesado
Destinatarios ➥ Estos datos se comunicarán a MailRelay para gestionar el envío de los correos electrónicos
Derechos ➥ Acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la política de privacidad
Plazo de conservación de los datos ➥ Hasta que se solicite la supresión por parte del interesado
Información adicional ➥ Puedes encontrarla en la política de privacidad y el aviso legal
Resistencias de pull-up por en medio…
Así como detalle, las líneas SCL y SDA tienen algo extraño y es que ambas se conectan a la línea de Vcc (los 5 Voltios) mediante una resistencia de 1KOhm.
Esto parece muy extraño pero tal vez te suene mejor si te digo que es una resistencia de pull-up. Tal y como vimos en su día, una resistencia de pull-up tira de la señal por lo que en estado normal o LOW se encuentra a Vcc (5 Voltios) de tensión y en estado HIGH se encuentra a 0 Voltios. Justo a la inversa de lo que estamos acostumbrados.
Estas resistencias pueden venir ya dentro de los componentes que conectamos así que hay que fijarse bien en eso antes de empezar a poner resistencias en el cableado en sí.
Con ese bum bum, I2C en Arduino al galope
Una cosa que aún no te he dicho es que: ¡Tu Arduino tiene I2C incluido! Si tienes un Arduino UNO puedes fijarte que en los pines analógicos 4 y 5 puedes encontrar SCL y SDA. En el caso del Mega esto pasa en el pin 20 y 21.
Una vez con esto y suponiendo que el dispositivo con el que nos vamos a comunicar incluye las resistencias de pull-up, lo que haremos será utilizar la librería Wire de Arduino (Estoy seguro de que alguna vez has leído sobre ella o la has visto escrita en los ejemplos de Arduino 😉 )
Para utilizar la comunicación por I2C, necesitaremos inicializar esta comunicación con:
#include <Wire.h> void setup() { Wire.begin(); }
Como ves, no contiene ningún número entre paréntesis como el Serial.begin() ya que no tiene una velocidad definida. A la hora de escribir tendremos que empezar la transmisión:
Wire.beginTransmission(44); Wire.write(byte(0x00)); Wire.endTransmission();
El 44 que ves se refiere al número de dispositivo. Este número va de 0 a 128 y es el identificador del dispositivo al que le enviamos el mensaje. Luego escribimos el valor que queremos y cerramos la transmisión.
En el juego de maestros y esclavos también entra el pedirle información al esclavo y que el esclavo esté totalmente atento:
Wire.requestFrom(44, 5); Wire.onReceive(receiveEvent);
Como ves, la primera orden la mandaría el maestro para pedirle al esclavo número 44, 5 bytes de información. La segunda la realizaría el esclavo al inicio, en el setup, para estar en modo recepción de órdenes.
Sonaba la canción de terminar…
Y nada, parece que es hora de ir cerrando esto por hoy. Si necesitas profundizar en cómo se envían los mensajes, cómo son sus cabeceras, cómo se activa la comunicación y cómo se para.. He encontrado este artículazo que parece tener la solución a todas tus dudas.
Para otras dudas puedes preguntarme en los comentarios. Si no hay dudas, pon esta canción a todo trapo, préndelo todo… ¡Fuegote!
Como siempre das en el clavo con los temas que tratas. Gracias por tus enseñanzas.
Tengo una duda, o un problema: ¿con este tipo de comunicación, un nodemcu ESP8266 ESP012 puede ser esclavo de un Arduino Mega? ¿O de cualquier Arduino?
Estuve la otra tarde intentándolo y no lo conseguí, y por lo visto por internet no es posible. Al final me tuve que decantar por comunicación Serial.