Comunicación I2C entre dos Arduinos

Conecta dos Arduino Uno con I2C, un bus de dos cables, y envía datos del maestro al esclavo.

Nivel: intermedioi2ccomunicacionredes

Qué vas a construir

Dos Arduino Uno conectados por I2C. Uno actúa como maestro y decide cuándo enviar. El otro es el esclavo y recibe los datos en una dirección fija.

Lo que aprendes

  • Qué es un bus y por qué I2C usa solo dos cables para hablar con varios dispositivos.
  • Qué hacen SDA y SCL.
  • Qué es una dirección de dispositivo.
  • La diferencia entre maestro y esclavo.

Idea clave

Con el enlace de Dos Arduinos que se hablan solo podías conectar dos dispositivos. Con I2C, un solo par de cables puede unir a varios, y cada uno responde solo cuando lo llaman por su dirección. Por eso las redes reales se construyen con buses compartidos.

Materiales en Tinkercad

  • Dos Arduino Uno R3
  • Cables

Paso 1: Conecta el bus

En el Arduino Uno, los pines I2C son:

  • A4 = SDA (datos)
  • A5 = SCL (reloj)
Maestro Esclavo
A4 (SDA) A4 (SDA)
A5 (SCL) A5 (SCL)
GND GND

En hardware real, SDA y SCL necesitan resistencias pull-up de 4.7 kΩ hacia 5V. Revisa si Tinkercad las incluye en el circuito; si no, agrégalas para que el bus funcione.

Paso 2: Código del esclavo

#include <Wire.h>

void setup() {
  Wire.begin(8);                 // dirección 8 en el bus
  Wire.onReceive(recibir);       // se ejecuta cuando llega un mensaje
  Serial.begin(9600);
}

void recibir(int cantidad) {
  while (Wire.available()) {
    int valor = Wire.read();
    Serial.print("Recibido: ");
    Serial.println(valor);
  }
}

void loop() {
  // el esclavo espera; no necesita hacer nada más
}

Paso 3: Código del maestro

#include <Wire.h>

void setup() {
  Wire.begin();                  // el maestro no tiene dirección
  Serial.begin(9600);
}

void loop() {
  Wire.beginTransmission(8);     // habla con el esclavo 8
  Wire.write(25);                // envía el valor 25
  Wire.endTransmission();
  delay(1000);
}

Paso 4: Ejecuta la simulación

Abre el monitor serial del esclavo. Debe mostrar “Recibido: 25” cada segundo.

Cómo sabes que lo lograste

  • El esclavo muestra el valor que envía el maestro.
  • Cambias el valor en el maestro a 40 y el esclavo lo recibe.
  • Puedes explicar qué hace la dirección 8 en el código del maestro.

Qué salió mal

El esclavo no recibe nada. Revisa que SDA esté con SDA y SCL con SCL. Si los cruzas, el bus no funciona.

La comunicación falla de forma intermitente. Probablemente falten las resistencias pull-up. En hardware real, sin ellas el bus queda flotando.

El maestro no muestra error pero el esclavo no responde. Confirma que el esclavo usa Wire.begin(8) y el maestro llama a beginTransmission(8). Las dos direcciones deben coincidir.

Siguiente clase

En la siguiente clase el maestro va a pedir datos al esclavo, en lugar de enviárselos.