🛠 Scanner le bus I²C de l'UNO (A4/A5)
Objetivos
Dominar el bus I²C estandarizado por los conectores R3: SDA en A4, SCL en A5, y los pines SDA/SCL dedicados añadidos junto a AREF en la UNO R3 (junto con IOREF y 3,3 V — es esta adición la que definió el estándar de los shields). Escribirás un escáner de direcciones, una herramienta de diagnóstico indispensable antes de cualquier driver de sensor.
Material
- 1 Arduino UNO R3 + cable USB-B
- 1 o varios módulos I²C (OLED SSD1306 dirección 0x3C, sensores, PCF8574...)
- Cables: SDA→A4 (o pin SDA cerca de AREF), SCL→A5, VCC 5 V o 3,3 V (atención: el 3,3 V de la UNO está limitado a 50 mA), GND
- Los módulos serios traen sus propias resistencias pull-up; sin ellas, el bus no funciona (I²C es de colector abierto).
Código completo
// Scanner I²C : interroge les adresses 8..127 et liste les réponses.
#include <Wire.h>
void setup {
Wire.begin; // maître, broches A4/A5 par défaut sur UNO
Serial.begin(115200);
Serial.println(F("Scanneur I2C — bus A4(SDA)/A5(SCL)"));
}
void loop {
uint8_t trouves = 0;
for (uint8_t addr = 8; addr <= 127; addr++) {
Wire.beginTransmission(addr);
uint8_t err = Wire.endTransmission;
if (err == 0) { // 0 = ACK reçu, périphérique présent
Serial.print(F("Périphérique à l'adresse 0x"));
Serial.println(addr, HEX);
trouves++;
} else if (err == 4) {
// Erreur sur la phase d'écriture : on ignore sans bloquer.
}
}
if (trouves == 0) Serial.println(F("Aucun périphérique — vérifiez SDA/SCL et les pull-up"));
Serial.println(F("--- nouvelle passe (Ctrl+Shift+M pour arrêter le moniteur) ---"));
delay(5000);
}
Verificación esperada
Cada módulo conectado aparece con su dirección (OLED: 0x3C, PCF8574: 0x20/0x27, etc.). Prueba de diagnóstico: desconecta SCL — el escaneo ya no encuentra nada; invierte SDA/SCL en un shield — tampoco. Es tu multímetro del bus.
Errores frecuentes
- Olvidar las resistencias pull-up (4,7–10 kΩ hacia 3,3 V o 5 V): líneas flotantes, ACK aleatorios o ausentes. Muchos módulos las integran (puente JP1 en algunos), otros no.
- Alimentar un periférico de 3,3 V desde los 5 V: el ATmega está a 5 V, un periférico de 3,3 V que realimenta el bus puede consumir más de los 50 mA del pin de 3,3 V.
- Confundir dirección de 7 bits y 8 bits: las hojas de datos a veces dan la dirección de escritura (0x78) donde Wire quiere 0x3C.
- Dos periféricos en el mismo bus con la misma dirección: el escaneo solo ve uno, el segundo está mudo — cambia la dirección (pines A0 en muchos módulos).
- Conectar I²C en pines distintos a A4/A5 (o los pines dedicados R3): Wire en la UNO está cableado físicamente al puerto C del ATmega328P.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino