Qu’est-ce que le bus I2C et comment fonctionne-t-il sur Arduino ?

Mise à jour du 3 juillet 2026 : utiliser l’I2C avec Arduino et Raspberry Pi aujourd’hui

Le bus I2C reste l’un des moyens les plus simples pour relier capteurs, écrans OLED, RTC, extensions GPIO ou convertisseurs à un projet Arduino, Raspberry Pi ou domotique. En 2026, le principe n’a pas changé, mais quelques bonnes pratiques évitent les pannes intermittentes : vérifier les niveaux logiques, l’adresse de chaque module et la qualité du câblage.

Les 3 points clés à retenir

  • Deux fils de données suffisent : SDA pour les données et SCL pour l’horloge, avec une masse commune entre toutes les cartes.
  • Chaque périphérique doit avoir une adresse unique sur le bus ; en cas de doublon, utilisez les broches de configuration du module, un multiplexeur I2C ou un second bus si disponible.
  • Attention aux tensions : un Raspberry Pi fonctionne en logique 3,3 V sur ses GPIO. Ne lui appliquez pas directement un signal I2C tiré à 5 V sans convertisseur de niveau adapté.

Verdict rapide

Pour un montage court avec quelques capteurs, l’I2C est généralement le meilleur choix : moins de fils que SPI, plus simple qu’une liaison série multiple, et largement supporté par les bibliothèques Arduino comme par Linux sur Raspberry Pi. Pour un câble long, un environnement électrique bruyant ou beaucoup de modules, mieux vaut réduire la vitesse du bus, soigner les masses et envisager une liaison plus robuste.

Checklist avant de brancher un module I2C

VérificationPourquoi c’est important
SDA, SCL et GND reliés correctementSans masse commune, la communication devient instable ou impossible.
Adresse I2C connueDeux modules à la même adresse peuvent bloquer le bus.
Niveau logique compatibleArduino 5 V et Raspberry Pi 3,3 V ne se mélangent pas toujours directement.
Résistances de pull-up adaptéesTrop de modules avec pull-up peuvent charger le bus ; pas assez de pull-up peut empêcher les fronts propres.
Test avec un scanner I2CSur Arduino, un sketch de scan confirme l’adresse ; sur Raspberry Pi, i2cdetect -y 1 aide à repérer les périphériques.

Sur Raspberry Pi : activation et diagnostic

Sur Raspberry Pi OS récent, activez l’I2C via sudo raspi-config puis installez les outils utiles avec sudo apt install i2c-tools. Le bus principal apparaît généralement sur /dev/i2c-1 et se teste avec i2cdetect -y 1. Les broches courantes sont GPIO 2 pour SDA et GPIO 3 pour SCL sur le connecteur 40 broches, mais vérifiez toujours le pinout de votre modèle avant câblage.

Questions fréquentes

Peut-on mettre Arduino et Raspberry Pi sur le même bus I2C ? Oui, à condition de partager la masse, d’éviter les conflits d’adresses et de respecter les niveaux logiques. Un convertisseur 3,3 V / 5 V est recommandé dès qu’un module tire le bus vers 5 V.

Pourquoi mon scanner I2C ne trouve rien ? Les causes les plus fréquentes sont SDA/SCL inversés, absence de masse commune, alimentation insuffisante, adresse différente de celle attendue ou interface I2C non activée côté Raspberry Pi.

Faut-il choisir I2C ou SPI ? I2C est pratique pour plusieurs petits capteurs avec peu de fils. SPI est souvent préférable pour les écrans rapides, cartes mémoire, convertisseurs performants ou besoins de débit plus élevé.

Note éditoriale : mise à jour par Vincent Vandegans, passionné de Raspberry Pi, Linux, domotique et projets DIY, afin de relier ce tutoriel Arduino aux usages actuels sur Raspberry Pi.

La solution la plus simple pour établir une communication entre votre board Arduino et les différents périphériques de la carte, ou des périphériques externes tels capteurs de température, d’humidité, accéléromètres ou gyroscopes par exemple, est l’utilisation du protocole I2C, compatible avec des milliers de composants existant et intégré à toutes les versions de carte Arduino. Pour la mise en place aisée de vos applications domotiques ou robotique sur mesure, trouvez tout d’abord les bases du fonctionnement du bus de communication I2C et l’algorithme permettant la communication d’une multitude de périphériques sur une seule ligne. Puis les aspects hardware et software à prendre en compte pour l’utilisation concrète d’I2C avec votre board Arduino sont abordés, dont le câblage des différents éléments de votre système et les principales fonctions à utiliser dans votre code.

Communication avec les périphériques Arduino

Vous désirez pouvoir établir une communication entre votre board Arduino et les différents périphériques de la carte, voir des périphériques externes disponibles dans le commerce, tels des capteurs de température, d’humidité, des accéléromètres ou des gyroscopes, ou divers types d’actionneurs ? Pour cela la solution la plus simple est l’utilisation du bus I2C, directement intégré à votre carte; il existe en effet des milliers de composants disposant d’une interface I2C, et toutes les cartes Arduino sont basées sur des microcontrôleurs disposant de cette fonction.

Le protocole I2C

I2C, pour Inter Integrated Circuit , est un protocole de communication crée à la base par Philips en 1982 pour standardiser l’échange de données entre différents circuits intégrés d’un même système. Elle est aujourd’hui assurée par le fabricant NXP, spin-off de l’entreprise. Ce protocole est basé sur un bus de communication sériel, ce qui signifie qu’un seul câble est utilisé pour le transfert de données. En pratique, le bus I2C est constitué de deux câbles, un donc pour les données, nommé SDA (Serial Data) et l’autre faisant office d’horloge pour déterminer la fréquence de la communication, nommé SCL (Serial Clock). Dans la mesure où tous les périphériques sont connectés sur le même bus, comment donc faire pour qu’un seul des capteurs ne communique ses données en même temps et éviter une saturation de la ligne? Ceci est garanti par le protocole à proprement parler. Tout d’abord, il n’y a qu’un maître (le microcontrôleur de votre board Arduino), et une multitude d’esclaves (vos périphériques), chacun identifiés par une adresse unique. Seul le maître peut initier une communication. Le maître envoie tout d’abord l’adresse du périphérique dont il désire recevoir les données. L’esclave envoie un premier signal de confirmation (acknowledgement) pour signifier qu’il a bien reçu la demande. Puis le maître envoie l’adresse d’un registre interne du périphérique. Par exemple, pour un accéléromètre, on a trois registres stockant respectivement les données de l’accélération selon X, Y et Z. Un deuxième signal de confirmation est envoyé par le périphérique. Enfin c’est le périphérique qui émet cette fois le message, en transférant la valeur du registre qui a été sollicité. Il termine avec une dernière confirmation, après quoi le maître envoie un signal spécifique pour mettre fin à la communication. Le processus est similaire pour l’écriture sur un périphérique par le microcontrôleur, pour piloter un actionneur ou sauvegarder des données par exemple. Dans ce cas une commande spécifique est envoyée lors de l’adressage du registre et c’est le maître qui transmet les données. À noter que les deux lignes SDA et SCL sont liées à une résistance de pull-up. L’état 0 est donc l’état dominant. D’un point de vue hardware, vous n’aurez pas à implémenter ces résistances qui sont en place par défaut.[/vc_column_text][vc_column_text][/vc_column_text][/vc_column][vc_column width=”1/3″][vc_row_inner equal_height=”yes” content_placement=”top”][vc_column_inner][vc_column_text css=”.vc_custom_1549001272441{margin-bottom: 10px !important;}”]

[/vc_column_text][vc_column_text css=”.vc_custom_1549000737694{margin-top: 0px !important;margin-bottom: 10px !important;padding-top: 0px !important;padding-bottom: 0px !important;}”]

Arduino Uno – 20,90 €

[/vc_column_text][vc_btn title=”Acheter” color=”orange” align=”center” i_icon_fontawesome=”fa fa-cart-arrow-down” add_icon=”true” link=”url:https%3A%2F%2Famzn.to%2F2D5HX5h||target:%20_blank|rel:nofollow” css=”.vc_custom_1549000708662{margin-top: 0px !important;padding-top: 0px !important;}”][/vc_column_inner][/vc_row_inner][vc_empty_space][vc_separator][vc_empty_space][vc_row_inner equal_height=”yes” content_placement=”top”][vc_column_inner][vc_column_text css=”.vc_custom_1549001280715{margin-bottom: 10px !important;}”]

[/vc_column_text][vc_column_text css=”.vc_custom_1549000952401{margin-top: 0px !important;margin-bottom: 10px !important;padding-top: 0px !important;padding-bottom: 0px !important;}”]

Starter Kit ELEGOO Carte Arduino UNO R3 52,99 €

[/vc_column_text][vc_btn title=”Acheter” color=”orange” align=”center” i_icon_fontawesome=”fa fa-cart-arrow-down” add_icon=”true” link=”url:https%3A%2F%2Famzn.to%2F2sVoYWi||target:%20_blank|rel:nofollow” css=”.vc_custom_1549000960436{margin-top: 0px !important;padding-top: 0px !important;}”][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

Utilisation d’I2C avec Arduino

La première chose à faire est d’identifier l’adresse des périphériques liés à votre carte, et l’adresse de leur divers registres internes. Vous trouverez ces informations dans la fiche technique de votre board. Ensuite, dans le cas d’une connexion de périphériques externes, indépendants ou montés sur d’autres cartes Arduino, il faut identifier les ports attribués aux lignes SDA et SCL de chaque carte ou composants et les relier entre eux. N’oubliez bien entendu pas de connecter chaque composants à l’alimentation (5V / GND ou 3V3 / GND). Il s’agira ensuite principalement de coder les échanges dans votre soft. Vous trouverez ci dessous les principales commandes: Wire.begin(); Initialisation de la communication I2C, à effectuer au début de votre programme. Wire.beginTransmission(Adresse de votre périphérique); Cette commande est à appeller à chaque fois pour initialiser une transmission avec le périphérique dont l’adresse est donnée en argument. Wire.write(Adresse du registre sollicité); Cette commande permet d’accéder à un registre du périphérique, et est à appeler avec d’écrire ou de lire des données. Wire.write(Byte à écrire); Écriture des données désirées dans le registre sollicité au préalable. Wire.requestFrom(Adresse de votre périphérique, n); Lecture de n bits du périphérique adressé, dans le registre sollicité au préalable. Wire.endTransmission(); Fin de la transmission. Cette commande doit être appelée à chaque fois, et avant l’envoi de toute nouvelle requête par I2C.[/vc_column_text][/vc_column][vc_column width=”1/3″][vc_row_inner equal_height=”yes” content_placement=”top”][vc_column_inner][vc_column_text css=”.vc_custom_1549001272441{margin-bottom: 10px !important;}”]

[/vc_column_text][vc_column_text css=”.vc_custom_1549000737694{margin-top: 0px !important;margin-bottom: 10px !important;padding-top: 0px !important;padding-bottom: 0px !important;}”]

Arduino Uno – 20,90 €

[/vc_column_text][vc_btn title=”Acheter” color=”orange” align=”center” i_icon_fontawesome=”fa fa-cart-arrow-down” add_icon=”true” link=”url:https%3A%2F%2Famzn.to%2F2D5HX5h||target:%20_blank|rel:nofollow” css=”.vc_custom_1549000708662{margin-top: 0px !important;padding-top: 0px !important;}”][/vc_column_inner][/vc_row_inner][vc_empty_space][vc_separator][vc_empty_space][vc_row_inner equal_height=”yes” content_placement=”top”][vc_column_inner][vc_column_text css=”.vc_custom_1549001280715{margin-bottom: 10px !important;}”]

[/vc_column_text][vc_column_text css=”.vc_custom_1549000952401{margin-top: 0px !important;margin-bottom: 10px !important;padding-top: 0px !important;padding-bottom: 0px !important;}”]

Starter Kit ELEGOO Carte Arduino UNO R3 52,99 €

[/vc_column_text][vc_btn title=”Acheter” color=”orange” align=”center” i_icon_fontawesome=”fa fa-cart-arrow-down” add_icon=”true” link=”url:https%3A%2F%2Famzn.to%2F2sVoYWi||target:%20_blank|rel:nofollow” css=”.vc_custom_1549000960436{margin-top: 0px !important;padding-top: 0px !important;}”][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row][vc_column width=”1/2″][/vc_column][vc_column width=”1/2″][/vc_column][/vc_row]
Publié dans le(s) catégorie(s) : Tutoriels

0 thoughts on “Qu’est-ce que le bus I2C et comment fonctionne-t-il sur Arduino ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *