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
Damit alle Teilnehmer auf dem I2C-Bus pauschal benachrichtigt werden können, gibt es die Broadcast-Adresse „0“. Die Null ist also fest definiert als die Adresse für Broadcast-Nachrichten und sollte auch von keinem anderen Slave genutzt werden.
Standardmäßig reagiert ein Mikrocontroller aber nicht auf diese Adresse. Dies muss erst aktiviert werden indem Ihr das entsprechende Kontroll-Bit setzt. Dazu müsst Ihr lediglich folgende Zeile in die „setup()“ Funktion Eures Programmcodes einfügen.
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
Ein Ereignis auf dem I2C-Bus ruft immer einen Interrupt auf, welcher den regulären Ablauf Eures Mikrocontrollers unterbricht. Die Programmausführung hüpft also kurz aus dem Ablauf des regulären Programms in die Interrupt-Routine. Den Aufenthalt darin solltet Ihr aber so kurz wie möglich halten. Deswegen ist es „gängige Praxis“ innerhalb der Interrupt-Routine eine „Flag“ zu setzen. Diese „Flag“ ist eigentlich nur eine Boolsche Variable, welche dort auf „true“ gesetzt wird. Zurück in dem Haupt-Programmablauf Eures Mikrocontrollers könnt Ihr nun regelmäßig prüfen ob diese Variable gesetzt ist.
Si es así, ahora puede leer los datos o comandos recibidos y reaccionar en consecuencia.
Übrigens: Ihr solltet innerhalb der Interrupt-Routinen auch keine „Serial.print…“ oder ähnliche Zeit-fressenden Befehle nutzen.
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é. 🙂