Arduino gère le bus I2C avec deux lignes seulement : SDA pour les données et SCL pour l’horloge. Derrière cette apparente simplicité se cachent des règles électriques strictes, des limitations de vitesse, des questions de topologie de bus et des pièges qui saturent vite un projet, surtout dès que l’on empile plusieurs capteurs ou un expandeur type PCF8574.
En comprenant précisément comment circulent les trames, comment se règlent les résistances de pull-up, et comment s’adapter aux différents modes de vitesse, on transforme un bus capricieux en un outil fiable et reproductible. Les points suivants éclairent chaque aspect concret de la communication I2C sur Arduino, de la théorie jusqu’au diagnostic à l’oscilloscope.
| Élément I2C | Rôle | Valeurs typiques | Bonnes pratiques |
|---|---|---|---|
| SCL (Serial Clock) | Signal d’horloge synchronisant la communication | 100 kHz / 400 kHz / 1 MHz | Utiliser des résistances de pull‑up adaptées |
| SDA (Serial Data) | Ligne de données bidirectionnelle | 0 V / 5 V (ou 3.3 V selon la carte) | Limiter la longueur des câbles pour éviter le bruit |
| Adresse I2C | Identifie chaque périphérique sur le bus | 7 bits (standard) ou 10 bits | Scanner les adresses pour éviter les conflits |
| Résistances pull‑up | Maintiennent les lignes SDA et SCL à l’état haut | Entre 2.2 kΩ et 10 kΩ | Adapter la valeur selon la longueur et la vitesse |
| Longueur du bus | Impacte la stabilité du signal | Idéal : < 50 cm | Réduire la vitesse si câbles longs |
Principes de base de la communication I2C sur Arduino
Le bus I2C (Inter-Integrated Circuit) utilise deux lignes partagées par tous les composants : SDA (Serial Data) et SCL (Serial Clock). Sur Arduino, ces signaux reposent sur un schéma électrique simple, mais très normé, basé sur une liaison de type open-drain (ou open-collector) avec résistances de pull-up.
Chaque périphérique I2C possède une adresse unique sur le bus. L’Arduino agit en maître dans la majorité des projets, et les capteurs, mémoires, GPIO expanders ou afficheurs jouent le rôle d’esclaves. La communication suit une séquence start → adresse → lecture/écriture → stop, synchronisée par l’horloge SCL générée par le maître.
Les lignes SDA et SCL ne passent jamais directement à l’état haut par les composants, elles sont simplement tirées à la masse (niveau bas) ou laissées flottantes, l’état haut étant imposé par les résistances de pull-up reliées au +5 V ou +3,3 V. Ce principe garantit la coexistence de nombreux composants sans conflit actif sur le bus.
« Le bus I2C repose sur une philosophie simple : tout le monde écoute, un seul parle à la fois, et personne ne force jamais la ligne à l’état haut »
Sur Arduino, cette logique est gérée via la bibliothèque Wire, qui masque les détails bas niveau, mais ne corrige pas les erreurs physiques : mauvais câblage, valeurs de pull-up inadaptées ou surcharge capacitive.

Broches SDA et SCL selon les cartes Arduino
La position physique de SDA et SCL varie selon les cartes Arduino. Une lecture rapide du brochage évite de longs moments de debug lorsqu’un montage reste muet.
| Carte Arduino | Broche SDA | Broche SCL | Remarques spécifiques |
|---|---|---|---|
| Uno / Nano (ATmega328P) | A4 | A5 | Conflit possible avec entrées analogiques / capteurs |
| Mega 2560 | 20 | 21 | Lignes dédiées, plus pratiques pour projets complexes |
| ATmega328 en composant nu | Patte 27 | Patte 28 | Indispensable pour un montage sur plaque d’essai |
Sur une Arduino Uno, SDA et SCL partagent A4 et A5 avec les entrées analogiques. Un projet qui mesure des tensions sur A4/A5 ne peut pas utiliser simultanément l’I2C sur ces mêmes broches sans réflexion préalable. Sur une Mega 2560, les broches 20 (SDA) et 21 (SCL) restent dédiées au bus I2C, ce qui simplifie la conception d’architectures avec plusieurs périphériques.
Modes I2C : vitesses, timings et limites physiques
Le protocole I2C définit plusieurs modes de vitesse. Chaque mode impose des temps de niveau haut et bas pour le signal SCL, et une capacité maximale du bus. Respecter ces contraintes conditionne la stabilité de la communication.
Les différents modes de vitesse I2C
| Mode I2C | Vitesse maximale | tLOW min (SCL bas) | tHIGH min (SCL haut) | Capacité bus |
|---|---|---|---|---|
| Standard | ≤ 100 kbit/s | 4,7 μs | 4 μs | 400 pF |
| Fast | ≤ 400 kbit/s | 1,3 μs | 0,6 μs | 400 pF |
| Fast Plus | ≤ 1 Mbit/s | 0,5 μs | 0,26 μs | 550 pF |
| High-Speed | ≤ 3,4 Mbit/s | Spécifique | Spécifique | Variable |
| Ultra Fast | 5 Mbit/s | Spécifique | Spécifique | Variable |
Les valeurs de tLOW et tHIGH définissent le timing minimal pour un fonctionnement fiable. Un SCL trop rapide entraîne des fronts insuffisants pour que les composants détectent correctement les bits, surtout avec une capacité de bus élevée.
ArduinoArduino et domotique : automatiser sa maison pour pas cherLes projets avec plusieurs capteurs sur un même câble long se situent souvent en mode Standard (100 kbit/s) pour conserver une marge de stabilité suffisante. Les modes Fast et Fast Plus s’orientent plutôt vers des circuits imprimés compacts, avec de courtes longueurs de piste et une maîtrise fine des résistances.

Vitesses réellement utilisables sur Arduino
Du point de vue Arduino, la fréquence de SCL s’exprime généralement en kHz dans les configurations de la bibliothèque Wire.
- 100 kHz : valeur par défaut, correspondant au mode Standard.
- ≈ 200 kHz : fréquence maximale recommandée pour un fonctionnement stable sur de nombreux montages amateurs.
- 400 kHz : atteignable avec configuration avancée, mais plus sensible au câblage et aux interférences.
De nombreux composants, comme le PCF8574 (expandeur I/O très utilisé sur Arduino), recommandent une utilisation à 100 kHz. Une montée en fréquence au-delà de cette valeur impose de vérifier soigneusement les caractéristiques de chaque périphérique I2C ajouté au bus.
Résistances de pull-up : valeurs, calculs et impact sur le bus
Les résistances de pull-up conditionnent la forme des signaux SDA et SCL. Leur valeur influence directement le temps de montée (rise time) des signaux, donc la fiabilité des échanges à haute fréquence.

Ordres de grandeur des résistances minimales
Pour une alimentation à 5 V, on retient des valeurs minimales de pull-up indicatives :
| Mode I2C | Résistance pull-up minimale (5 V) | Temps de montée typique |
|---|---|---|
| Standard (≤ 100 kbit/s) | ≈ 1534 Ω | ≈ 1 μs |
| Fast (≤ 400 kbit/s) | ≈ 733 Ω | ≈ 300 ns |
| Fast Plus (≤ 1 Mbit/s) | ≈ 230 Ω | ≈ 120 ns |
Dans la pratique, sur Arduino, on utilise souvent des valeurs entre 2,2 kΩ et 10 kΩ par ligne, en fonction du nombre de périphériques, de la longueur des fils et de la présence éventuelle de pull-up intégrés à certains modules.
Des résistances trop élevées donnent des fronts de montée lents : SDA et SCL mettent du temps à atteindre le niveau haut, ce qui déforme les signaux à mesure que la fréquence augmente. À l’inverse, des résistances trop faibles augmentent le courant consommé à chaque front bas, sollicitent davantage les sorties des composants, et génèrent parfois des perturbations sur l’alimentation.
Capacité du bus et nombre de périphériques
Le bus I2C supporte une capacité maximale définie par la norme :
- Mode Standard / Fast : 400 pF.
- Mode Fast Plus : 550 pF.
Chaque périphérique, chaque longueur de câble, chaque piste de circuit imprimé ajoute de la capacité. Plus elle augmente, plus les signaux montent lentement, même avec des résistances de pull-up bien choisies. Un bus très chargé en modules empilés (shields, capteurs, plateaux de prototypage) se rapproche vite des limites, en particulier à 400 kHz.
Signaux SDA/SCL : séquences, timings et structure des trames
Pour comprendre un problème I2C, il suffit souvent de visualiser les signaux SDA et SCL. Leur comportement suit une logique stricte, avec des transitions parfaitement définies.
Séquence de base d’une communication
Une trame I2C suit généralement cette structure :
- Condition START : SDA passe à l’état bas alors que SCL reste haut.
- Octet d’adresse (7 bits d’adresse + 1 bit R/W).
- Bit d’acquittement (ACK/NACK) envoyé par l’esclave.
- Octets de données (écriture ou lecture) avec ACK après chaque octet.
- Condition STOP : SDA remonte à l’état haut alors que SCL reste haut.
Les données sur SDA restent stables pendant le niveau haut de SCL. Les changements d’état ont lieu lors des fronts bas à haut ou haut à bas de l’horloge, ce qui garantit un échantillonnage fiable par le maître ou l’esclave.
« Sur un oscilloscope, une trame I2C se lit comme une partition : les impulsions SCL rythment chaque bit, tandis que SDA raconte l’histoire, bit après bit »
Temps de montée et qualité du signal
Le temps de montée représente la durée nécessaire pour que SDA ou SCL passent de l’état bas à un niveau considéré comme haut logique. Il dépend directement du produit Rpull-up × Cbus. Un temps de montée long arrondit les fronts et peut conduire à des détections erronées des bits à haute vitesse.
Les valeurs typiques de temps de montée sont :
- Mode Standard : jusqu’à 1 μs.
- Mode Fast : environ 300 ns.
- Mode Fast Plus : environ 120 ns.
Un oscilloscope permet de vérifier si les fronts respectent ces valeurs. En cas de dépassement, réduire la longueur des câbles, ajuster les résistances de pull-up ou repasser à une fréquence de SCL plus modérée.
Configurer I2C sur Arduino : fréquence, adresses et code type
La bibliothèque Wire de l’IDE Arduino propose une interface directe pour initialiser le bus, définir la fréquence et lancer des échanges avec les périphériques I2C.
Initialisation de base du bus I2C
Sur un Arduino jouant le rôle de maître :
- Wire.begin() : configuration de SDA et SCL, activation interne des pull-ups (à ne pas confondre avec les résistances externes).
- Wire.setClock(frequency) : réglage de la fréquence SCL (par exemple 100000 pour 100 kHz).
Pour un montage standard avec des capteurs et un PCF8574, une configuration type s’oriente vers 100 kHz, conformément aux recommandations de nombreux fabricants de composants I2C d’entrée de gamme.
Gestion des adresses et collisions
Chaque périphérique I2C possède une adresse 7 bits, soit 128 possibilités. Certains modules offrent des broches d’adressage (A0, A1, A2) qui permettent de modifier l’adresse matérielle. Il devient ainsi possible de placer plusieurs exemplaires du même composant sur un seul bus, à condition d’attribuer des adresses distinctes.
Une collision d’adresses entraîne des comportements aléatoires : réponses incohérentes, refus d’ACK, ou lecture de données d’un composant au lieu d’un autre. Un simple balayage des adresses au démarrage permet de vérifier la présence effective des périphériques attendus.
Cas particulier : PCF8574, courants et besoin de driver
Le PCF8574 est un expandeur très répandu pour ajouter des entrées/sorties numériques via I2C. Il remplace un bloc de broches GPIO physiques par des lignes I2C, ce qui libère de la place sur Arduino. Toutefois, ses sorties imposent des limites strictes en courant.
Limites de courant du PCF8574
Les caractéristiques typiques sont :
- Courant maximal par sortie : environ 1 mA en sortie simple.
- Courant maximal en inversion : autour de 25 mA pour l’ensemble, selon la configuration.
Ces valeurs suffisent pour piloter des LED avec résistance de limitation, des entrées logiques ou des relais via un étage de commande, mais restent insuffisantes pour alimenter directement des charges plus gourmandes.
Pour des courants plus élevés, un circuit de type UDN2982 ou un transistor/mosfet externe prend le relais pour commander des moteurs, des bandes LED ou des bobines de relais. Le PCF8574 se limite alors à fournir un simple signal logique bas niveau.
« Le PCF8574 se comporte comme une extension de broches, pas comme un driver de puissance : il adresse, il commande, mais il ne fournit pas le courant »
Problèmes fréquents sur SDA/SCL et symptômes associés
Les ennuis I2C suivent souvent les mêmes schémas. Identifier rapidement le type de dysfonctionnement permet de corriger le câblage ou la configuration avant de remettre en cause tout le projet.
Sources d’erreurs récurrentes
- Conflit de broches sur Arduino Uno : utilisation simultanée d’A4/A5 comme entrées analogiques et lignes SDA/SCL.
- Mauvaises valeurs de résistances de pull-up : trop élevées (signaux lents) ou trop faibles (surconsommation, perturbations).
- Bruits et interférences : câbles longs non torsadés, proximité de moteurs, de relais ou de convertisseurs DC-DC bruyants.
- Mauvais câblage : inversion SDA/SCL, GND absent ou VCC mal connecté.
- Charge capacitive élevée : trop de périphériques en parallèle, longueurs de fils cumulées, empilement de shields.
Les symptômes typiques incluent : blocages sporadiques, données incohérentes, absence d’ACK, lecture systématique de 0xFF ou 0x00, ou besoin de réinitialiser l’Arduino pour relancer la communication après une erreur.
Diagnostic du bus I2C : oscilloscope, mesures et vérifications
Un diagnostic rigoureux du bus I2C repose sur quelques étapes simples, même sans matériel de mesure sophistiqué. Avec un oscilloscope ou un analyseur logique, l’analyse devient plus précise.
Vérifications de base sans oscilloscope
- Contrôle du câblage : continuité de SDA, SCL, VCC et GND avec un multimètre.
- Test des résistances de pull-up : mesure de la résistance entre SDA et VCC, puis entre SCL et VCC, Arduino hors tension.
- Scan d’adresses : code Arduino qui parcourt les adresses I2C et signale celles qui répondent.
Ces simples vérifications éliminent une bonne partie des erreurs grossières. Si le problème persiste, l’oscilloscope apporte des informations précieuses sur la forme des signaux.
Utilisation d’un oscilloscope pour analyser SDA/SCL
Avec un oscilloscope, les points à contrôler sont les suivants :
- Fréquence de SCL : vérifier qu’elle reste ≤ 200 kHz pour une bonne marge de stabilité, surtout en présence de plusieurs modules.
- Forme des fronts : signal rectangulaire propre, sans oscillations excessives ni fronts trop arrondis.
- Stabilité de SDA pendant les niveaux hauts de SCL : absence de variations parasites pendant les instants d’échantillonnage.
- Présence des conditions START et STOP : transitions SDA/SCL conformes à la spécification I2C.
Les oscilloscopes modernes et nombreux analyseurs logiques proposent un décodage I2C intégré. Le signal est traduit en adresses et données lisibles, ce qui accélère le repérage des trames défaillantes, des erreurs d’ACK ou des adresses inexistantes.
« Quand le bus I2C se fige sans explication, un coup d’œil à l’oscilloscope montre souvent une ligne SDA coincée à l’état bas par un esclave en difficulté »
Intégrer I2C dans une architecture plus large de projet Arduino
Dans un projet complet, SDA et SCL s’insèrent dans un ensemble plus vaste : alimentation, masses, signaux de puissance, relais, moteurs, interfaces utilisateur, etc. Une réflexion globale sur le schéma électrique améliore la robustesse de tout le système.
ArduinoPiloter un relais 230 V avec Arduino en sécurité : 5 erreurs à éviterPour structurer proprement un projet, une approche consiste à raisonner comme pour un schéma électrique de maison : regroupement des fonctions, séparation des zones de puissance et de logique, identification claire des bus de communication comme l’I2C, le SPI ou l’UART.
Lorsque la surface de la carte augmente, ou lorsque plusieurs modules sont répartis dans un boîtier, la longueur des pistes et des câbles entre les éléments I2C peut rejoindre les problématiques d’un tableau électrique réparti sur une grande surface. Il devient utile de réfléchir à la disposition physique : rapprocher les capteurs I2C des contrôleurs, éviter les boucles de masse et éloigner autant que possible les lignes SDA/SCL des conducteurs véhiculant des courants élevés.
Outils logiciels et méthodologie de conception du bus I2C
La conception d’une architecture I2C gagne en clarté avec un outil de schéma adapté. Les mêmes réflexes que pour un logiciel de schéma électrique s’appliquent : nommage cohérent des nets, symboles standard, regroupement des signaux de bus, documentation des adresses.
Un schéma propre permet de :
- Visualiser clairement tous les composants reliés à SDA/SCL.
- Repérer immédiatement les pull-up doublées ou oubliées.
- Documenter les adresses, vitesses de bus et contraintes de chaque module.
- Préparer plus sereinement les tests et les mesures à l’oscilloscope.
En gardant une trace détaillée des choix de résistances, des vitesses configurées (100 kHz, 200 kHz ou 400 kHz) et des limites de chaque composant, on maintient un bus I2C stable et compréhensible, même plusieurs mois après la réalisation du montage initial.





