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.
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
8en 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.