I2C entre Arduinos

Tal vez a veces queremos compartir la carga de trabajo de un Arduino con otro. O tal vez queremos más pines digitales o analógicos. El circuito integrado o I2C (pronunciado I cuadrado C) es la mejor solución.

I2C es un protocolo interesante. Por lo general, se usa para comunicarse entre componentes en placas base en cámaras y en cualquier sistema electrónico incorporado.

Aquí, haremos un bus I2C con dos Arduinos. Programaremos un Arduino maestro para ordenarle al otro Arduino esclavo que parpadee su LED incorporado una o dos veces dependiendo del valor recibido.

Para construir esto necesitamos los siguientes "ingredientes":

  • 2 arduinos
  • Cables de salto
Este instructivo y muchos más se pueden encontrar en mi libro de cocina de desarrollo Arduino disponible aquí. :RE

Paso 1: Cómo conectarlos

Siga estos pasos para conectar dos Arduino UNO utilizando I2C:

  1. Conecte los pines A4 y A5 en un Arduino a los mismos pines en el otro.
  2. La línea GND tiene que ser común para ambos Arduinos. Conéctelo con un puente.

También tenemos una implementación esquemática y una "placa de pruebas", ambas fáciles de seguir. Afortunadamente, es una implementación simple.

Recuerde nunca conectar Arduinos de 5 V y 3, 3 V juntos. No lo hará
lastimó al Arduino de 5V, ¡pero ciertamente molestará a su hermano de 3.3V!

Paso 2: Código

El siguiente código se divide en dos partes: el código maestro y el código esclavo, que se ejecutan en dos Arduinos diferentes. Primero, echemos un vistazo al código maestro :

 // Incluye la biblioteca Wire requerida para I2C 
#include int x = 0; void setup () {// Inicie el bus I2C como Master Wire.begin (); } void loop () {Wire.beginTransmission (9); // transmitir al dispositivo # 9 Wire.write (x); // envía x Wire.endTransmission (); // deja de transmitir x ++; // Incrementa x si (x> 5) x = 0; // `reset x una vez que obtiene 6 delay (500); }

Y aquí está el código esclavo que interpreta los caracteres enviados desde el maestro:

 // Incluye la biblioteca Wire requerida para I2C 
#include int LED = 13; int x = 0; void setup () {// Define el pin del LED como Output pinMode (LED, OUTPUT); // Inicie el bus I2C como esclavo en la dirección 9 Wire.begin (9); // Adjunte una función para activar cuando se recibe algo. Wire.onReceive (recibir evento); } void recibirEvento (int bytes) {x = Wire.read (); // lee un carácter del I2C} void loop () {// Si el valor recibido es 0 parpadea el LED durante 200 ms if (x == '0') {digitalWrite (LED, HIGH); retraso (200); digitalWrite (LED, BAJO); retraso (200); } // Si el valor recibido es 3 parpadeos de LED durante 400 ms if (x == '3') {digitalWrite (LED, HIGH); retraso (400); digitalWrite (LED, BAJO); retraso (400); }}

Archivos adjuntos

  • I2C_master.ino Descargar
  • I2C_slave.ino Descargar

Paso 3: desglose del código

Primero, veamos al maestro . Necesitamos incluir la biblioteca Wire.h requerida:

 #incluir 

Luego, en la función de configuración, comenzamos el bus I2C usando la función Wire.begin () . Si no se proporciona ningún argumento en la función, Arduino comenzará como maestro.

Por último, enviamos un carácter x, que está entre 0 y 5. Utilizamos las siguientes funciones para
comience una transmisión al dispositivo con la dirección 9, escriba el carácter y luego detenga la transmisión:

 Wire.beginTransmission (9); // transmitir al dispositivo # 9 Wire.write (x); // envía x Wire.endTransmission (); // deja de transmitir 

Ahora exploremos el código esclavo de Arduino . También incluimos la biblioteca Wire.h aquí, pero ahora comenzamos el bus I2C usando Wire.begin (9) . El número en el argumento es la dirección que queremos usar para el Arduino. Todos los dispositivos con la dirección 9 recibirán la transmisión.

Ahora tenemos que reaccionar de alguna manera cuando recibimos una transmisión I2C. La siguiente función agrega una función de activación cada vez que se recibe un carácter. Mejor dicho, cada vez que el Arduino recibe un personaje en I2C, ejecutará la función que le indicamos que ejecute:

 Wire.onReceive (recibir evento); 

Y esta es la función. Aquí, simplemente almacenamos el valor del carácter recibido:

 void recibirEvento (int bytes) {x = Wire.read (); } 

En loop (), simplemente interpretamos que ese carácter parpadea el LED incorporado a diferentes velocidades dependiendo del carácter recibido.

Paso 4: Más sobre I2C

Para analizar brevemente la teoría, I2C requiere dos líneas digitales: la línea de datos en serie ( SDA ) para transferir datos y la línea de reloj en serie ( SCL ) para mantener el reloj. Cada conexión I2C puede tener un maestro y varios esclavos. Un maestro puede escribir a los esclavos y solicitar a los esclavos que proporcionen datos, pero ningún esclavo puede escribir directamente al maestro ni a otro esclavo. Cada esclavo tiene una dirección única en el bus, y el maestro necesita saber las direcciones de cada esclavo al que desea acceder.

Cada bus I2C puede admitir hasta 112 dispositivos . Todos los dispositivos necesitan compartir GND . La velocidad es de alrededor de 100 kb / s, no muy rápida pero sí respetable y bastante utilizable. Es posible tener más de un maestro en un autobús, pero es realmente complicado y generalmente se evita.

Muchos sensores utilizan I2C para comunicarse, generalmente unidades de medición inerciales, barómetros,
sensores de temperatura y algunos sonares. Recuerde que I2C no está diseñado para cables largos . Dependiendo del tipo de cable utilizado, 2 metros ya pueden causar problemas.

I2C es un protocolo de transmisión complicado, pero es muy útil. Todos los Arduinos lo implementan, con algunas diferencias en las asignaciones de pines:

Tablero I2C pines

Uno, Pro Mini A4 (SDA), A5 (SCL)

Mega, debido 20 (SDA), 21 (SCL)

Leonardo, Yun 2 (SDA), 3 (SCL)

Paso 5: conectar más dispositivos

Si necesitamos conectar más de dos dispositivos en un bus I2C, solo tenemos que conectar todas las líneas SDA y SCL juntas. Necesitaremos que la dirección de cada esclavo sea dirigida por el maestro Arduino.

Aquí hay un video de una implementación personal usando 1 maestro y 3 esclavos.

Puede encontrar más temas relacionados con las comunicaciones de Arduino, como Wireless Serial, tarjetas SD o Ethernet en mi libro de cocina de desarrollo Arduino disponible aquí. :RE

Artículos Relacionados