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 :
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 :
- Départ (START) : SDA descend alors que SCL est haut. Tout le monde tend l'oreille.
- L'adresse : 7 bits, suivis d'un 8ᵉ bit qui dit « je vais écrire » (0) ou « je veux lire » (1).
- 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.
- Les données, octet par octet, chacun suivi d'un ACK.
- Fin (STOP) : SDA remonte alors que SCL est haut. Le bus est libre.
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¶
- 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 ?
- 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. - La vitesse : dans le programme holo-écran, mesure le temps d'un
ecran.display()avecmillis()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¶
- L'écran OLED : notre holo-écran, à l'adresse 0x3C.
- Mission 1 bis · Câbler : SDA sur D21, SCL sur D22.
- Mission 1 bis · Le scanner : qui est sur le bus ?
- Mission 1 bis · Défi 2 : deux écrans, deux bus.
- Missions 2 à 6 · L'holo-écran : chaque mission a sa version avec l'écran, par exemple le poste de commandement de la base.
- Les broches de l'ESP32 : D21 et D22, les broches I2C par défaut.
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.