I2C es el protocolo o tecnología de bus a través del cual un microcontrolador puede comunicarse con muchos sensores o actuadores. Gracias al software adecuado, también es posible conectar diferentes microcontroladores entre sí y comunicarse. Por lo general, solo hay un maestro por bus I2C que puede solicitar o enviar datos a un esclavo a través de la dirección correspondiente.
En uno de mis proyectos quería o quiero conectar varios microcontroladores entre sí. Para ello son adecuadas varias tecnologías de autobuses. Sin embargo, I2C es casi el único que es compatible directamente con casi todos los microcontroladores modernos sin requisitos de hardware adicionales. Así que la elección se centró rápidamente en I2C.
Mediante I2C se conectaron o se conectan varios microcontroladores entre sí. El maestro puede enviar fácilmente un comando a cada esclavo individual. Para hacer esto, simplemente envíe la dirección del esclavo y el comando deseado a través del bus. Todos los esclavos escuchan lo que sucede en el bus, pero sólo el esclavo con la dirección correspondiente responde al comando enviado. Hasta ahora, todo bien.
Pero ¿qué pasa si el amo quiere enviar una orden a todos los esclavos? ¿Por ejemplo, iniciar un comando de forma sincrónica en todos los esclavos? Si hay dos o tres esclavos, aún puedes informar a cada esclavo individualmente. La velocidad de procesamiento suele ser tan rápida que no se nota una gran diferencia de tiempo entre las ejecuciones de los esclavos individuales. Sin embargo, si utiliza este procedimiento con 100 esclavos, notará rápidamente que el último esclavo notificado comienza significativamente más tarde que el primer esclavo.
La solución a este problema es la dirección de transmisión I2C. Esta es una dirección que escuchan todos los esclavos del autobús. Para activar esto sólo tienes que configurar un bit de control. Al menos así funciona con Arduinos basados en procesadores Atmel. 🙂
En el siguiente artículo se describe cómo configurar este bit.
Habilite la transmisión I2C para esclavos I2C
Para que todos los participantes en el bus I2C puedan ser notificados de forma generalizada, existe una dirección de transmisión de "0". Por lo tanto, el cero está firmemente definido como la dirección para mensajes de difusión y no debe ser utilizado por ningún otro esclavo.
De forma predeterminada, un microcontrolador no responde a esta dirección. Primero debe activarse estableciendo el bit de control correspondiente. Todo lo que tienes que hacer es insertar la siguiente línea en la función “setup()” del código de tu programa.
TWAR = (dirección << 1) | 1; // habilitar la escucha en mensajes de difusión
Por ejemplo, en una función de inicialización I2C completa podría verse así
void init_i2c() { Wire.begin(dirección); TWAR = (dirección << 1) | 1; // habilitar la escucha en mensajes de difusión Wire.onReceive(i2c_receive_event); Serial.print(F("I2C: esclavo I2C inicializado en la dirección: ")); Serial.println(dirección); }
Información general sobre I2C e interrupciones
Un evento en el bus I2C siempre provoca una interrupción, que interrumpe el flujo regular de su microcontrolador. Por lo tanto, la ejecución del programa salta brevemente del flujo normal del programa a la rutina de interrupción. Sin embargo, debes mantener tu estancia allí lo más breve posible. Por eso es una "práctica común" establecer una "bandera" dentro de la rutina de interrupción. Esta "bandera" es en realidad sólo una variable booleana que se establece en "verdadero". De vuelta en el flujo del programa principal de su microcontrolador, ahora puede verificar periódicamente si esta variable está configurada.
Si es así, ahora puede leer los datos o comandos recibidos y reaccionar en consecuencia.
Por cierto: no debe utilizar “Serial.print…” ni comandos similares que consuman mucho tiempo dentro de las rutinas de interrupción.
Información adicional
http://forum.arduino.cc/index.php?topic=183699.0
http://www.gammon.com.au/forum/?id=10896&reply=1#reply1
Diviértete con el proyecto.
Espero que todo te haya funcionado como se describe. Si no es así, o si tiene alguna pregunta o sugerencia, hágamelo saber en los comentarios. Si es necesario, lo añadiré al artículo.
Las ideas para nuevos proyectos siempre son bienvenidas. 🙂
PS Muchos de estos proyectos, especialmente los proyectos de hardware, cuestan mucho tiempo y dinero. Por supuesto que hago esto porque lo disfruto, pero si crees que es genial que comparta la información contigo, me encantaría hacer una pequeña donación al fondo del café. 🙂