Files
formation-arduino/modules/05-i2c-spi.qmd
T
ArtemiaandClaude Opus 5.5 372c5a3e1e Illustre les modules 4 à 6 (9 figures)
M4 : trame UART 8N1, câblage série croisé. M5 : bus I2C, trame I2C, bus SPI. M6 : tâches millis(), déroulé d'une ISR, modes de déclenchement, encodeur rotatif.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 15:15:43 +02:00

184 lines
6.4 KiB
Plaintext

---
title: "Module 5 — Bus I2C et SPI"
---
## Objectifs du module
- Comprendre les principes des bus I2C et SPI et leurs différences.
- Câbler et adresser un périphérique I2C (scanner de bus, résolution de conflits d'adresse).
- Afficher du texte et des formes sur un écran OLED SSD1306 (I2C).
- Lire les données d'un capteur de température/humidité BME280 (I2C).
## 1. Pourquoi un bus de communication ?
Les broches GPIO génériques permettent de dialoguer avec un seul composant à la fois, en définissant vous-même le protocole. Pour standardiser les échanges avec des composants variés (écrans, capteurs, mémoires), l'industrie utilise des bus normalisés : I2C et SPI sont les deux plus répandus dans l'écosystème Arduino/ESP32.
## 2. Le bus I2C
### 2.1 Principe
I2C (Inter-Integrated Circuit) utilise seulement deux fils partagés par tous les périphériques du bus :
- SDA (Serial Data) : ligne de données.
- SCL (Serial Clock) : ligne d'horloge, générée par le maître (l'ESP32-S3 dans notre cas).
Chaque périphérique possède une adresse unique (7 bits, soit 128 adresses possibles) qui permet au maître de s'adresser spécifiquement à lui sur le bus partagé.
![Bus I2C : deux fils partagés, un maître et plusieurs esclaves adressés](../schemas/svg/m05-bus-i2c.svg){#fig-m05-bus-i2c}
### 2.2 Broches I2C par défaut sur ESP32-S3
Le framework Arduino-ESP32 définit par défaut SDA sur GPIO8 et SCL sur GPIO9 (à vérifier selon votre carte), mais ces broches peuvent être réassignées via Wire.begin(sda, scl).
```cpp
#include <Wire.h>
void setup() {
Wire.begin(8, 9); // SDA, SCL — a adapter selon votre carte
}
```
## 3. Scanner de bus I2C
![Trame I2C : écriture d'un octet vers l'adresse 0x3C (ce que teste le scanner : l'esclave répond-il par un ACK ?)](../schemas/svg/m05-trame-i2c.svg){#fig-m05-trame-i2c}
Avant de câbler un module, il est très utile de vérifier qu'il est bien détecté et de connaître son adresse exacte :
```cpp
#include <Wire.h>
void setup() {
Wire.begin(8, 9);
Serial.begin(115200);
delay(500);
Serial.println("Scan du bus I2C...");
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
byte erreur = Wire.endTransmission();
if (erreur == 0) {
Serial.printf("Peripherique trouve a l'adresse 0x%02X\n", addr);
}
}
Serial.println("Scan termine.");
}
void loop() {
}
```
::: {.callout-note title="Conflit d'adresse"}
Si deux modules identiques (deux écrans OLED par exemple) doivent cohabiter sur le même bus, ils doivent avoir des adresses différentes. Certains modules disposent de pastilles de soudure (solder jumpers) permettant de changer leur adresse d'usine.
:::
## 4. Exercice : afficheur OLED SSD1306
### 4.1 Installation des bibliothèques
- Adafruit GFX Library (moteur graphique générique).
- Adafruit SSD1306 (pilote spécifique à l'écran).
### 4.2 Câblage
| Broche écran | Broche ESP32-S3 |
|----------------|-----------------------------|
| VCC | 3V3 |
| GND | GND |
| SDA | GPIO8 (ou broche SDA choisie) |
| SCL | GPIO9 (ou broche SCL choisie) |
### 4.3 Premier affichage
```cpp
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C // Adresse trouvee avec le scanner I2C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Wire.begin(8, 9);
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("Ecran non detecte !");
while (true);
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Bonjour !");
display.display();
}
void loop() {
}
```
## 5. Exercice : capteur de température/humidité BME280
Le BME280 est un capteur environnemental (température, humidité, pression) communiquant en I2C, très utilisé dans les projets de station météo.
### 5.1 Installation de la bibliothèque
Installer « Adafruit BME280 Library » depuis le gestionnaire de bibliothèques.
### 5.2 Lecture des mesures
```cpp
#include <Wire.h>
#include <Adafruit_BME280.h>
Adafruit_BME280 bme;
void setup() {
Serial.begin(115200);
Wire.begin(8, 9);
if (!bme.begin(0x76)) { // ou 0x77 selon le module
Serial.println("BME280 non detecte !");
while (true);
}
}
void loop() {
float temperature = bme.readTemperature();
float humidite = bme.readHumidity();
float pression = bme.readPressure() / 100.0F; // hPa
Serial.printf("T: %.1f C H: %.1f %% P: %.1f hPa\n", temperature, humidite, pression);
delay(2000);
}
```
## 6. Exercice combiné : mini station météo
Combinez écran OLED et capteur BME280 pour afficher en temps réel la température et l'humidité, avec rafraîchissement toutes les 2 secondes. Ajoutez un indicateur visuel sur la LED NeoPixel : bleu si température \< 18°C, vert entre 18 et 25°C, rouge au-delà.
## 7. Le bus SPI : présentation
SPI (Serial Peripheral Interface) est plus rapide que l'I2C mais utilise davantage de fils : MOSI (données maître→esclave), MISO (esclave→maître), SCK (horloge) et une ligne CS (Chip Select) dédiée par périphérique. Il est privilégié pour les composants nécessitant un débit élevé (écrans TFT couleur, cartes SD, certains modules radio).
![Bus SPI : lignes de données et d'horloge partagées, une ligne CS par périphérique](../schemas/svg/m05-bus-spi.svg){#fig-m05-bus-spi}
| Critère | I2C | SPI |
|---------------|-----------------------|--------------------------------|
| Nombre de fils | 2 (partagés) | 4 (+1 CS par périphérique) |
| Vitesse typique | 100 kHz - 1 MHz | Plusieurs MHz à dizaines de MHz |
| Adressage | Adresse logicielle | Ligne CS physique dédiée |
| Usage typique | Capteurs, petits écrans | Écrans rapides, cartes SD, radio |
::: {.callout-note title="Approfondissement SPI"}
Le câblage et l'utilisation détaillée du SPI (ex : écran TFT, carte SD) seront pratiqués dans un module dédié aux projets avancés, en fonction du matériel disponible pour la formation.
:::
## Checklist de fin de module
- [ ] J'ai exécuté le scanner I2C et identifié les adresses de mes modules.
- [ ] J'ai affiché du texte sur l'écran OLED.
- [ ] J'ai lu température et humidité depuis le BME280.
- [ ] J'ai réalisé la mini station météo combinant écran, capteur et LED NeoPixel.
- [ ] Je sais expliquer la différence entre I2C et SPI.