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.

Nivel: intermedioi2credes

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 -1 para 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.