Lorsqu’on travaille avec des modules I²C (écrans LCD, capteurs, expandeurs d’Entrées / Sorties…), le scanner I²C classique est souvent le premier outil utilisé. Il permet de détecter les périphériques présents sur le bus en envoyant activement des requêtes.
Mais dans certains cas, on souhaite observer un bus existant, déjà en fonctionnement, sans intervenir, sans envoyer de trames, et sans risquer de perturber le système.
C’est exactement l’objectif de ce lecteur I²C passif pour Arduino UNO ou NANO.
Principe du lecteur I²C passif
Contrairement à un scanner I²C classique (basé sur la bibliothèque Wire), ce lecteur fonctionne en écoute seule :
- Il ne génère aucun START,
- Il n’envoie aucune adresse,
- Il ne répond jamais sur le bus,
- Il se contente d’observer les signaux SDA et SCL.
Il permet de voir ce qui se passe réellement sur le bus, sans intervenir, et sans risquer d’introduire des comportements indésirables.
Le programme détecte :
- les conditions START / STOP,
- le premier octet de chaque trame I²C,
- l’adresse I²C (7 bits) du périphérique,
- le bit R/W (lecture ou écriture).
Les informations sont ensuite affichées sur le moniteur série.
Câblage minimal
Le lecteur, basé sur un Arduino UNO, se connecte en parallèle du bus existant :
- SDA (A4) → ligne de données I2C
- SCL (A5) → ligne d’horloge I2C
- GND → masse
- Borne 2 reliée à SCL afin de permettre d’utiliser l’interruption matérielle
INT0, beaucoup plus rapide et fiable pour suivre l’horloge I²C.

Affichage des informations
Un mode résumé est proposé toutes les secondes :
—- SCAN I2C (2s) —-
0x27 W=120 R=45
Il indique :
- combien de fois chaque adresse a été utilisée,
- le nombre d’écritures (
W), - le nombre de lectures (
R).

Ce mode permet d’identifier rapidement :
- les adresses dominantes sur le bus,
- le ou les périphériques réellement actifs
On ne tiendra pas compte des adresses « fantômes » avec peu de données « W » ou « R ».
Dans le cas présent, les informations sont envoyées au module I2C ayant l’adresse 0x27.
Sur un bus I²C, le master est le dispositif qui contrôle la communication. C’est lui qui :
- lance les échanges (START),
- choisit le périphérique à contacter (adresse I²C),
- décide s’il écrit (W) ou lit (R),
- termine la communication (STOP).
Les autres dispositifs connectés au bus sont appelés slaves (ou périphériques) et répondent uniquement lorsqu’ils sont sollicités par le master. « W » et « R » indiquent le sens de l’échange entre les cartes I2C. Une même opération peut utiliser W puis R successivement.
« W » : le master envoie des données vers le périphérique.
Cela correspond par exemple à :
- l’envoi d’une commande,
- l’écriture dans un registre,
- la mise à jour d’un écran LCD,
- le changement de l’état de sorties (expandeur I/O).
Le périphérique reçoit les informations.
« R » : le master demande des données au périphérique.
Cela correspond par exemple à :
- la lecture d’une mesure (température, pression…),
- la lecture d’un registre interne,
- la récupération d’un état ou d’une valeur.
Le périphérique envoie alors les données au master.
Cas d’usage typiques
Ce lecteur est particulièrement utile pour :
- identifier l’adresse d’un module déjà intégré,
- comprendre le comportement d’un driver I²C,
- vérifier qu’un périphérique est réellement sollicité,
- détecter des conflits ou parasites sur le bus.
Limites à connaître
- Le lecteur n’est pas un analyseur logique,
- À très haute vitesse I²C, certaines trames peuvent être perdues,
- Les données complètes ne sont pas décodées (seulement l’adresse + R/W).
Matériel utilisé
La section Modélisme a créé une platine à connecter directement sur la carte Arduino UNO pour le scanner d’adresse I2C. La même platine peut être utilisée en reliant la borne 2 à la borne A5 (SCL).
Utilisation
L’utilisation de l’observateur I2C est simple et ne nécessite que quelques étapes.
Téléverser le programme Arduino
- Ouvrir l’IDE Arduino
- Charger le programme observateur I2C
- Sélectionner la carte Arduino Uno
- Choisir le port série correspondant
- Téléverser le programme dans l’Arduino
Une fois le téléversement terminé, l’Arduino « Observateur I2C » est prêt à observer le bus I2C.
Connecter l’observateur sur le bus i2C en respectant les polarités :
- SDA → ligne de données I2C
- SCL → ligne d’horloge I2C
- GND → masse
Ouvrir le moniteur série
- Ouvrir le moniteur série de l’IDE Arduino
- Régler la vitesse de communication à 9600 bauds
Les adresses des équipements observés sur le bus I2C s’affichent automatiquement dans le moniteur série.