Varias direcciones en un mismo bus
Conecta dos esclavos a un mismo bus I2C con direcciones distintas, y pide datos a cada uno por separado.
Qué vas a construir
Un maestro y dos esclavos en el mismo bus. Cada esclavo tiene su propia dirección (8 y 9). El maestro pide datos a cada uno y muestra ambos valores.
Lo que aprendes
- Por qué cada dispositivo de un bus necesita una dirección única.
- Cómo pedir datos a varios dispositivos en un mismo ciclo.
- Cómo detectar cuál dispositivo respondió y cuál no.
Idea clave
Todos los dispositivos del bus escuchan los mismos cables. Si dos tienen la misma dirección, responden a la vez y los datos se mezclan. Por eso la dirección es el “nombre” del dispositivo en la red.
Materiales en Tinkercad
- Un Arduino Uno como maestro
- Dos Arduino Uno como esclavos, o un Arduino Uno con dos programas distintos según el circuito que prefieras
- Un potenciómetro de 10 kΩ en cada esclavo
- Cables
Paso 1: Conecta el bus
Todos los dispositivos comparten:
- A4 (SDA)
- A5 (SCL)
- GND
Cada esclavo tiene su potenciómetro conectado a A0, como en Pedir y responder datos por I2C.
Paso 2: Código de cada esclavo
Usa el mismo programa en los dos esclavos. Solo cambia la dirección:
#include <Wire.h>
const int DIRECCION = 8; // en el segundo esclavo, cambia esto a 9
int valor = 0;
void setup() {
Wire.begin(DIRECCION);
Wire.onRequest(responder);
}
void loop() {
valor = analogRead(A0) / 4;
delay(100);
}
void responder() {
Wire.write(valor);
}
Paso 3: Código del maestro
#include <Wire.h>
int pedir(int direccion) {
if (Wire.requestFrom(direccion, 1) == 0) {
return -1; // nadie respondió
}
if (Wire.available()) {
return Wire.read();
}
return -1;
}
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
int a = pedir(8);
int b = pedir(9);
Serial.print("Esclavo 8: ");
Serial.print(a);
Serial.print(" Esclavo 9: ");
Serial.println(b);
delay(1000);
}
requestFrom() devuelve cuántos bytes llegaron. Si devuelve 0, el esclavo no respondió, y el maestro muestra -1.
Paso 4: Ejecuta la simulación
Gira el potenciómetro de cada esclavo por separado. El monitor del maestro debe mostrar valores distintos para cada dirección.
Cómo sabes que lo lograste
- El maestro muestra dos valores, uno por cada dirección.
- Al girar un potenciómetro, cambia solo el valor de ese esclavo.
- Si desconectas un esclavo, el maestro muestra
-1para su dirección.
Qué salió mal
Los dos valores son iguales. Los dos esclavos tienen la misma dirección. Revisa que uno tenga DIRECCION = 8 y el otro DIRECCION = 9.
Uno de los esclavos nunca responde. Confirma que su Wire.begin(DIRECCION) usa la dirección que pide el maestro.
Siguiente clase
En la siguiente clase vas a detectar cuándo un envío falla y a reintentarlo, en lugar de asumir que siempre llega.