🛠 Scanner le bus I²C de l'UNO (A4/A5)
Objectifs
Maîtriser le bus I²C standardisé par les connecteurs R3 : SDA sur A4, SCL sur A5, et les broches SDA/SCL dédiées ajoutées à côté de AREF sur l'UNO R3 (avec IOREF et 3,3 V — c'est cet ajout qui a défini le standard des shields). Vous allez écrire un scanner d'adresses, outil de diagnostic indispensable avant tout driver de capteur.
Matériel
- 1 Arduino UNO R3 + câble USB-B
- 1 ou plusieurs modules I²C (OLED SSD1306 adresse 0x3C, capteurs, PCF8574...)
- Fils : SDA→A4 (ou broche SDA près de AREF), SCL→A5, VCC 5 V ou 3,3 V (attention : le 3,3 V de l'UNO est limité à 50 mA), GND
- Les modules sérieux apportent leurs propres pull-up ; sans elles, le bus ne fonctionne pas (I²C est en collecteur ouvert).
Code complet
// 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);
}
Vérification attendue
Chaque module branché apparaît avec son adresse (OLED : 0x3C, PCF8574 : 0x20/0x27, etc.). Test de diagnostic : débranchez SCL — le scan ne trouve plus rien ; inversez SDA/SCL sur un shield — rien non plus. C'est votre multimètre du bus.
Erreurs fréquentes
- Oublier les pull-up (4,7–10 kΩ vers 3,3 V ou 5 V) : lignes qui flottent, ACK aléatoires ou absents. Beaucoup de modules les intègrent (pont JP1 sur certains), d'autres non.
- Alimenter un périphérique 3,3 V depuis le 5 V : l'ATmega est en 5 V, un périphérique 3,3 V qui back-alimente le bus peut tirer au-delà des 50 mA de la broche 3,3 V.
- Confondre adresse 7 bits et 8 bits : les datasheets donnent parfois l'adresse en écriture (0x78) là où Wire veut 0x3C.
- Deux périphériques sur le même bus avec la même adresse : le scan n'en voit qu'un, le second est muet — changez l'adresse (broches A0 sur bon nombre de modules).
- Brancher l'I²C sur d'autres broches que A4/A5 (ou les broches dédiées R3) : Wire sur l'UNO est câblé en dur sur le port C de l'ATmega328P.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino