Un écran couleur 240×240 reçoit plus de 100 000 pixels par image. Un capteur renvoie une température sur 16 bits. Une carte SD, des blocs de 512 octets.
Câbler un fil par bit serait impraticable : plus aucune broche disponible, une carte illisible, et des perturbations entre pistes.
Un bus série envoie les bits les uns après les autres, sur deux à quatre fils. On échange de la largeur contre du temps, et la puce est assez rapide pour que ça ne se voie pas.
UART : le plus simple. Deux fils, un seul interlocuteur, pas d’horloge partagée
I2C : deux fils, plusieurs composants distingués par une adresse
SPI : quatre fils, une horloge, le plus rapide des trois
Aucun n’est meilleur dans l’absolu : chacun échange de la vitesse contre des fils, ou des fils contre de la complexité. Le choix se fait par le besoin.
Le TX d’un appareil se branche sur le RX de l’autre, et réciproquement. Un câblage TX vers TX ne transmet rien, et c’est silencieux : aucun message d’erreur ne vous préviendra, vous verrez seulement un module qui « ne répond pas ».
Serial.begin(115200);// UART0, via l'USBSerial.printf("x=%d y=%d\n",x,y);
Le moniteur série est un UART. C’est aussi le bus des modules GPS, Bluetooth ou GSM, et le moyen le plus simple de faire dialoguer deux microcontrôleurs.
Sur la carte, une puce USB-série (CP2102 ou CH340) fait la traduction entre l’UART de l’ESP32 et le port USB du PC. C’est elle qui a besoin d’un driver sous Windows.
SDA et SCL sont en open-drain, comme au CM2 : les composants ne peuvent que tirer la ligne vers LOW, jamais vers HIGH. C’est précisément ce qui permet à plusieurs d’entre eux de partager le fil sans court-circuit.
Il faut donc deux résistances de pull-up (~4,7 kΩ) vers le 3,3 V. Sans elles, la ligne ne remonte jamais et rien ne communique.
La plupart des modules du commerce les intègrent déjà. Si vous en chaînez plusieurs, une seule paire suffit sur tout le bus : inutile de les cumuler.
Largement suffisant pour des capteurs ou un petit écran OLED monochrome. Bien trop lent pour un écran TFT couleur : à 400 kHz, une image de 240×240 pixels demanderait plus de deux secondes.
graph LR
M["ESP32-S3"] -->|"MOSI + SCK"| E1["Écran TFT"]
M -->|"MOSI + SCK"| E2["Carte SD"]
E1 -->|"MISO"| M
E2 -->|"MISO"| M
M -->|"CS1"| E1
M -->|"CS2"| E2
Les trois premiers fils sont partagés ; seul le CS distingue les esclaves. Un seul CS actif à la fois, les autres composants se mettent en haute impédance.
De quelques MHz à 80 MHz sur ESP32-S3 : c’est ce qui rend un écran TFT fluide.
Un User_Setup.h mal configuré donne un écran noir, pas une erreur de compilation. Si l’écran reste éteint alors que tout compile, c’est là qu’il faut regarder en premier : le pilote déclaré et les numéros de broches.
flowchart LR
B{"Besoin de<br/>vitesse ?"} -->|Oui| C["SPI<br/>écran, carte SD"]
B -->|Non| D{"Plusieurs<br/>composants ?"}
D -->|Oui| E["I2C<br/>capteurs, OLED"]
D -->|Non| F["UART<br/>debug, GPS, BT"]
Notre projet : UART pour le moniteur série, SPI pour l’écran. ↓ pour la page.
par image, soit 60 images par seconde. En dessous, l’œil voit saccader.
4 M
cycles CPU disponibles dans ces 16 ms, à 240 MHz. De quoi faire beaucoup.
Si une image prend plus de 16 ms à calculer, le jeu ralentit au lieu de sauter des images. Premier suspect en cas de lenteur : un delay() oublié, ou un redessin complet de l’écran au lieu des seules zones modifiées.
Dans la même séance, le mot état désigne deux choses : les données du jeu (position de la balle, score, ce sont des variables) et la phase du jeu (MENU, PARTIE, GAME_OVER, c’est la FSM). Gardez la distinction en tête pour ne pas les mélanger.
Réinitialiser le score ou effacer l’écran ne doit pas se répéter 60 fois par seconde. On l’exécute au moment de la transition, pas dans le case :
voidallerVers(EtatJeunouvel){etat=nouvel;entreeEtat=millis();// date d'entréeif(nouvel==PARTIE)initialiserPartie();if(nouvel==GAME_OVER)afficherGameOver();}
C’est l’action d’entrée (onEnter). Toutes les transitions passent par là.
FSM et millis() se combinent naturellement : c’est la transition temporisée. La date d’entrée dans l’état, mémorisée par allerVers(), sert de référence.