Icono del sitio Programar fácil con Arduino

I2C cómo conectar dos Arduino mediante este protocolo

En este ejemplo voy a explicar de forma muy sencilla cómo podemos conectar dos Arduinos por I2C. Esto puede ser muy útil para conectar por ejemplo un Arduino UNO o MEGA y una Arduino MKR1000.

Si comparamos los precios entre un shield WiFi y un Arduino MKR1000, la diferencia es muy grande. Por lo tanto es más interesante comprar un Arduino MKR1000 y utilizarlo como master. Para que te hagas una idea te voy a explicar como sería el conjunto del sistema.

Esto nos permite, por ejemplo, tener más salidas disponibles disponibles y como, no solo podemos conectar un solo Arduino por I2C, la escalabilidad está asegurada con este protocolo. Antes de continuar veamos a grandes rasgos como funciona la comunicación I2C.

I2C(Inter-Integrated Circuit)

Lo primero hay que decir que estamos hablando de una comunicación estándar. Siempre que oigas esto es algo bueno. Seguramente que organizaciones independientes de los fabricantes velan para que los equipos y dispositivos se puedan entender entre ellos sea cual sea su marca. I2C es una comunicación de este tipo.

Fue diseñado para facilitar la comunicación entre diferentes tipos de dispositivos entre los que se encuentran los microcontroladores.

La comunicación se realiza a través de un bus. Un bus no es más que un cableado al que se conectan dispositivos de una determinada forma. Pero la comunicación no puede ser anárquica, debe seguir las normas que dictamina el protocolo de comunicación, en este caso el I2C.

La primera norma es que debe haber uno o varios maestros (aconsejable utilizar un único maestro por su complejidad) y uno o varios esclavos, hasta 112. Los maestros son los que determinan los tiempos y a que esclavo se dirigen los datos. Los esclavos son los que reciben la señal de reloj y los datos.

Se trata de una comunicación síncrona es decir, el maestro dirá «ehhhhh esclavo 1 aquí van los datos». El esclavo 1 leerá los datos hasta que el maestro diga «ya he terminado de enviarte datos esclavo 1». Así sería la comunicación síncrona de forma muy resumida.

Por otro lado está la señal de reloj. Esto permite sincronizar la comunicación entre los dispositivos conectados al bus y además determinará la velocidad. La velocidad máxima que pueden alcanzar en Arduino es de 100 kbits por segundo. Pongamos un ejemplo. Si una letra se codifica con 8 bits = 1 byte, cada segundo podremos enviar, aproximadamente este texto: hola mundo!!

Lo más importante en la comunicación I2C es conocer las señales es decir, las conexiones que tenemos que hacer en Arduino. Hay 3 señales:

En el caso de tener varios esclavos deben compartir las líneas de reloj y de datos entre ellas es decir, conectar las señales SDA y SCL juntas. Además, como ya he dicho, todos los dispositivos deben compartir la toma de tierra GND.

Y esto es todo lo que necesitamos saber del I2C.

Conectar dos Arduinos

Ahora llega lo interesante, vamos a conectar dos Arduinos. Es muy simple, solo tenemos que conocer que pin es el SDA y que pin es el SCL puesto que el GND todos lo conocemos. Te dejo a continuación una lista de diferentes modelos con los pines que corresponden a cada señal.

Como ejemplo voy a conectar dos Arduino UNO. El esquema sería el siguiente.

Como ves es muy simple, solo necesitamos 3 cables y conectar los pines A4, A5 y GND. Vamos a probar algo un poco más complejo. Incorporemos al esclavo 5 LEDs que manejaremos desde el maestro.

Código

Vamos a tener que cargar dos códigos, un código al que hace de master y otro código al que hace de esclavo (slave). En los dos casos haremos uso de la librería Wire, que nos proporcionará todos los métodos y propiedades para poder utilizar el protocolo I2C de una forma sencilla.

Empecemos con el código del master.  El objetivo de la aplicación es encender los LEDs conectados a los pines 0, 1, 2, 3, 4 con un retardo de un segundo.

El código del esclavo es diferente. Lo primero que hay que destacar es que tendremos un evento que se disparará cuando reciba un dato del  dispositivo master. La primera parte leerá un entero (int) y la segunda parte leerá un carácter (char). Dependiendo de si el carácter es H o L pondrá en estado alto (H) o bajo (L).

Y esto es todo. Si quieres replicarlo con otros modelos sería exactamente igual teniendo en cuenta los pines correspondientes al SDA y SCL.

Salir de la versión móvil