Puede resultar práctico, sobre todo en proyectos de domótica, la comunicación entre varios dispositivos. Una de las técnicas más utilizadas es el protocolo I2C (o TWI). El protocolo I2C es un método que permite conectar varias tarjetas «Master» y varias tarjetas «Slave» y comunicar hasta 128 dispositivos. Permite conexiones asíncronas entre varios componentes para compartir información a través de un «bus común». Habíamos visto la comunicación a través del puerto Serie (llamado UART) que se utiliza para enviar el código al Arduino por un ordenador o para conectar dos dispositivos en particular en Bluetooth.
Equipo
- Ordenador
- Arduino UNO x2 o más
- Cable puente M/M x3 veces el número de tarjetas
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
- Wire.begin () inicializa la dirección del dispositivo. Function argument may be empty for master devices
- Wire.write () allows you to send bytes.
- Wire.requestFrom () handles the request receive function
- Wire.beginTransmission () starts transmitting data and defines the receiver.
- Wire.endTransmission ends data transmission
- Wire.onRequest () handles the request receive function
- Wire.onRecieve () manages the data reception function
Diagrama de conexión del bus I2C entre placas Arduino
Con el protocolo I2C, también es posible la comunicación entre diferentes sistemas (sensores, pantalla LCD, Raspberry Pi, etc.). Un ejemplo interesante es la comunicación entre varias placas Arduino. Para ello, tenemos que escribir al menos dos programas, uno para la tarjeta «Ama» (Master) y otro para las tarjetas «Esclavas».
Una comunicación I2C se define por un bus de dos hilos (a veces llamado TWI, Two Wire Interface) y una dirección. Los pines utilizados por la comunicación I2C suelen ser fijos para cada dispositivo. Uno en el que se envían los datos (SDA Serial Data Line) y en el otro el reloj de sincronización (SLC Serial Clock Line).
Pines I2C / TWI:
En este ejemplo utilizamos una placa Arduino Uno, por lo que los pines A4 y A5.
Para que las dos tarjetas se comuniquen entre sí, deben estar conectadas correctamente (A4 con A4 y A5 con A5) y no olvidar conectar las tierras (GND) como se muestra en el siguiente esquema.
Precaución: Si los pines A4 y A5 se conectan a los pines de una tarjeta no alimentada, el código se congelará en el momento de la transmisión.
En general, una tarjeta enviará información (Writer) y otra la recibirá (Reader).
Código de configuración del bus I2C
La librería Wire.h permite definir fácilmente la comunicación serie en el bus I2C. Las funciones son similares a las de la librería Serial.
Code of the «Master» card
«Slave» card code
Open the slave card serial monitor before the master card monitor.
In the serial monitor of the «Master» card:
In the serial monitor of the «Slave 1» card:
We can see that the two cards are exchanging information. Es muy fácil extender este ejemplo a varias tarjetas Arduino (Leonardo, Mini, etc.) adaptando el cableado y la dirección de los componentes en el código «Slave».
Código para identificar los dispositivos conectados al bus I2C
Una buena prueba para saber si tus dispositivos se comunican bien entre sí es utilizar el código de abajo (I2CScanner) ) que devuelve todas las direcciones de los dispositivos conectados a la tarjeta Master.