Aller au contenu
Académie JediSith · Communication

Le bus I2C

En une phrase : l'I2C permet à l'ESP32 de discuter avec plusieurs appareils (écrans, capteurs…) sur seulement deux fils, en appelant chacun par son adresse.

L'image à retenir

Imagine le canal radio d'une escadrille. Un seul chef d'escadrille (l'ESP32) et plusieurs pilotes (l'écran, un capteur…), tous sur la même fréquence. Personne ne parle sans y être invité : le chef appelle « Rouge 5, à vous ! », seul Rouge 5 répond, les autres écoutent en silence. Et c'est le chef qui donne le rythme de la conversation.

Sur le bus I2C, c'est pareil : un fil pour les paroles (SDA), un fil pour le rythme (SCL), et un indicatif pour chaque appareil : son adresse.

À quoi sert l'I2C ?

Rôle Exemple
Afficher notre écran OLED (adresse 0x3C), d'autres petits écrans
Mesurer un capteur de mouvement (accéléromètre, gyroscope), de température, de distance, de lumière
Économiser les broches dix appareils sur le même bus n'utilisent toujours que deux broches de l'ESP32
Ajouter des broches des modules « extenseurs » qui donnent 16 sorties de plus, ou 16 sorties PWM pour des servos

Son nom vient de Inter-Integrated Circuit, « entre circuits intégrés » : il a été inventé en 1982 par Philips pour que les puces d'un même appareil (une télé, une radio) se parlent avec très peu de fils. On le prononce « I-deux-C » ou « I-carré-C ».

Plus en profondeur

Deux fils, deux rôles

Fil Nom complet Son rôle Sur notre ESP32
SDA Serial Data les données, un bit après l'autre D21
SCL Serial Clock l'horloge : à chaque « tic », un bit est lu D22

Plus, bien sûr, la masse commune (GND) et l'alimentation des appareils.

L'horloge, c'est le métronome de la conversation : le chef (l'ESP32) fait battre SCL, et à chaque battement, celui qui parle pose un bit sur SDA, que l'autre lit au même moment. Comme les deux suivent le même rythme, ils ne se perdent jamais.

Un chef, plusieurs appareils

Sur un bus I2C, il y a un contrôleur (on disait autrefois « maître ») et des cibles (autrefois « esclaves »). Tous sont branchés sur les deux mêmes fils, en parallèle :

ESP32le contrôleurD21D22SDASCL3,3 Vrésistances de tirage(déjà sur le module de l'écran)écran 10x3Cécran 20x3Dcapteur0x68chacun son adresse :deux appareils ne doivent pasavoir la même sur un même bus
Tous les appareils sont branchés sur les deux mêmes fils. Seul celui dont l'adresse est appelée répond. Les masses (GND), non dessinées, sont toutes reliées.

L'adresse : l'indicatif de chaque appareil

Chaque appareil a une adresse sur 7 bits : un nombre entre 0 et 127. Quelques-unes sont réservées, il en reste 112 utilisables (de 0x08 à 0x77). L'adresse est fixée par le fabricant ; certains modules permettent d'en choisir une deuxième (en déplaçant une petite résistance au dos, par exemple).

Appareil Adresse habituelle
Écran OLED SSD1306 0x3C (parfois 0x3D)
Capteur de mouvement MPU-6050 0x68 (ou 0x69)
Module d'horloge DS3231 0x68

Remarque : l'écran et le module d'horloge de ce tableau peuvent cohabiter, mais pas le capteur de mouvement et l'horloge, qui ont tous les deux 0x68 par défaut.

L'hexadécimal : compter en base 16

Les adresses s'écrivent presque toujours en hexadécimal, avec le préfixe 0x. Au lieu de compter avec 10 chiffres (0 à 9), on en utilise 16 : 0 à 9, puis A (10), B (11), C (12), D (13), E (14), F (15).

0x3C = 3 × 16 + C = 3 × 16 + 12 = 60

Pourquoi s'embêter ? Parce qu'un chiffre hexadécimal représente exactement 4 bits, et deux chiffres un octet (8 bits, de 0x00 à 0xFF, soit 0 à 255). Pour les électroniciens, c'est bien plus lisible que 00111100.

Décimal Binaire (bits) Hexadécimal
10 0000 1010 0x0A
15 0000 1111 0x0F
60 0011 1100 0x3C
120 0111 1000 0x78
255 1111 1111 0xFF

0x78 au dos de l'écran ?

Au dos de beaucoup d'écrans, on lit « 0x78 » ou « 0x7A » à côté d'une petite résistance. C'est la même adresse, mais décalée d'un bit (avec le bit lecture/écriture, voir plus bas) : 0x78 = 120 = 60 × 2. Pour le programme, c'est bien 0x3C.

Une conversation, bit par bit

Quand l'ESP32 veut parler à l'écran, la conversation suit toujours le même protocole :

  1. Départ (START) : SDA descend alors que SCL est haut. Tout le monde tend l'oreille.
  2. L'adresse : 7 bits, suivis d'un 8ᵉ bit qui dit « je vais écrire » (0) ou « je veux lire » (1).
  3. L'accusé de réception (ACK) : l'appareil appelé tire SDA vers 0 pendant un tic d'horloge, pour dire « présent ! ». Si personne ne répond, SDA reste à 1 : c'est un NACK.
  4. Les données, octet par octet, chacun suivi d'un ACK.
  5. Fin (STOP) : SDA remonte alors que SCL est haut. Le bus est libre.
SCLSDAl'écran répond01111000010l'adresse : 0111100 = 0x3CécrireACKdonnées…STARTSTOP
Un bit est lu sur SDA à chaque fois que l'horloge SCL est en haut. L'ESP32 envoie 0x3C puis « écrire » (0) ; l'écran répond « présent » (ACK) en tirant SDA vers le bas.

C'est exactement ce que fait le scanner de la mission 1 bis : il appelle les adresses une par une, et note celles qui répondent ACK.

Les résistances de tirage

Sur un bus I2C, les appareils ne savent faire qu'une chose avec les fils : les tirer vers 0. Quand personne ne tire, des résistances de tirage (pull-up, en anglais) les ramènent doucement vers le 3,3 V, c'est-à-dire à 1. C'est malin : si deux appareils parlent en même temps, ils ne peuvent pas se court-circuiter, au pire les deux tirent vers 0.

Bonne nouvelle : nos modules d'écran ont déjà leurs résistances de tirage soudées au dos. Rien à ajouter.

La vitesse

Le rythme de l'horloge se compte en hertz (battements par seconde) :

Mode Vitesse de l'horloge Utilisation
Standard 100 kHz la vitesse par défaut de Wire
Rapide (Fast mode) 400 kHz celle que choisit la bibliothèque de l'écran pendant l'envoi d'une image
Rapide plus 1 MHz quelques appareils seulement

Chaque octet coûte 9 tics d'horloge : 8 bits plus l'ACK.

Trois façons de parler dans l'atelier

Le ruban de LEDs La liaison série (USB) Le bus I2C
Fils de données 1 (DIN) 2 (TX et RX) 2 (SDA et SCL)
Combien d'appareils ? autant de LEDs qu'on veut, en file 2 : l'ESP32 et l'ordinateur jusqu'à une centaine, chacun son adresse
Dans quel sens ? ESP32 → LEDs seulement dans les deux sens dans les deux sens, le contrôleur décide
Comment on vise un appareil sa place dans la file pas besoin : ils ne sont que deux son adresse
Distance quelques mètres le câble USB courte : quelques dizaines de centimètres

Exemples de calculs

Calcul 1 · Combien d'octets pour une image ?

L'écran a 128 × 64 = 8 192 pixels. Chacun est allumé ou éteint : 1 bit suffit. 8 192 bits ÷ 8 = 1 024 octets. C'est la taille de l'« image en mémoire » que la bibliothèque prépare dans l'ESP32 (qui en a environ 520 000 : pas de souci de place).

Calcul 2 · Combien de temps pour envoyer une image ?

1 024 octets × 9 tics = 9 216 tics. À 400 kHz (400 000 tics par seconde) : 9 216 ÷ 400 000 ≈ 0,023 s, soit environ 23 ms. À 100 kHz, quatre fois plus : environ 92 ms.

Calcul 3 · Combien d'images par seconde au maximum ?

1 000 ms ÷ 23 ms ≈ 43 images par seconde au mieux (un peu moins en vrai, à cause des adresses et des pauses). Notre programme holo-écran redessine toutes les 40 ms, soit 25 images par seconde : ça laisse de la marge, et c'est déjà fluide pour l'œil.

Calcul 4 · Lire une adresse hexadécimale

0x68 = 6 × 16 + 8 = 96 + 8 = 104. Et dans l'autre sens : 61 = 3 × 16 + 13, donc 61 = 0x3D.

Mise en pratique

  1. Le scanner : branche l'écran et lance le scanner de la mission 1 bis. Note l'adresse trouvée. Débranche le fil SDA : que dit le scanner ?
  2. L'adresse en décimal : convertis l'adresse trouvée en décimal, puis vérifie avec Serial.println(0x3C);, qui affiche le nombre en décimal.
  3. La vitesse : dans le programme holo-écran, mesure le temps d'un ecran.display() avec millis() avant et après. Compare avec le calcul 2.

Les pièges

Piège Ce qui se passe La parade
SDA et SCL inversés le scanner ne trouve rien, mais rien ne casse SDA → D21, SCL → D22
Deux appareils avec la même adresse réponses mélangées, affichage brouillé changer l'adresse d'un des deux, ou utiliser le 2ᵉ bus (Wire1)
Des fils trop longs erreurs aléatoires, écran qui « saute » fils courts : quelques dizaines de centimètres au plus
Écrire l'adresse en décimal par erreur begin(..., 3C) ne compile pas, begin(..., 30) vise la mauvaise adresse toujours le préfixe 0x
Oublier la masse commune rien ne marche GND de l'appareil relié au GND de l'ESP32

Exercices

1. Combien vaut 0x3D en décimal ?

3 × 16 + D = 3 × 16 + 13 = 48 + 13 = 61.

2. Combien d'appareils peut-on brancher sur un bus I2C avec des adresses à 7 bits ?

7 bits donnent 2⁷ = 128 adresses, dont 112 utilisables (les autres sont réservées). En pratique, la longueur des fils limite bien avant.

3. Deux écrans identiques ont l'adresse 0x3C. Comment les utiliser ensemble ?

Deux solutions : changer l'adresse de l'un (souvent une petite résistance à déplacer au dos, pour passer en 0x3D), ou brancher le second sur le deuxième bus I2C de l'ESP32 (Wire1), comme dans le défi 2 de la mission 1 bis.

4. À 100 kHz, combien d'images par seconde au maximum pour notre écran ?

Une image prend environ 92 ms, donc 1 000 ÷ 92 ≈ 10 images par seconde. Voilà pourquoi la bibliothèque passe à 400 kHz pendant l'envoi.

5. Le scanner affiche « Appareil trouvé à l'adresse 0x3C » et « 0x68 ». Combien d'appareils sont branchés ?

Deux : l'écran (0x3C) et un autre appareil à l'adresse 0x68, sans doute un capteur de mouvement ou une horloge.

À retenir

  • L'I2C, c'est deux fils partagés : SDA (les données) et SCL (l'horloge), plus la masse commune.
  • Un contrôleur (l'ESP32) appelle des cibles par leur adresse (7 bits, écrite en hexadécimal : 0x3C = 60).
  • L'appareil appelé répond ACK : c'est ce qu'utilise le scanner.
  • Des résistances de tirage ramènent les fils au 3,3 V (déjà sur nos modules).
  • Vitesse : 100 kHz ou 400 kHz. Une image de l'écran = 1 024 octets ≈ 23 ms à 400 kHz.

Où ça sert dans l'atelier

Pour aller plus loin

  • 🇫🇷 I2C, sur Wikipédia : l'histoire, les vitesses, le protocole.
  • 🇫🇷 Système hexadécimal, sur Vikidia, pour s'entraîner à compter en base 16.
  • 🇬🇧 I2C, SparkFun : le protocole expliqué avec des chronogrammes.
  • 🇬🇧 Monochrome OLED Breakouts, Adafruit : le guide de la bibliothèque de l'écran.