Article

GPIO, I2C, SPI, UART : les 4 protocoles du Raspberry Pi expliqués

GPIO, I2C, SPI, UART : les quatre protocoles de communication du Raspberry Pi expliques avec cablage, cas d'usage et tableau de decision.

Par Rémi Favreau — 2 mai 2026

Sur les quarante broches du GPIO du Raspberry Pi, on retrouve quatre types de communication distincts. Comprendre lequel est fait pour quoi évite la majorité des erreurs de câblage et d’achat de composants incompatibles. Quand un débutant en atelier me dit « mon capteur ne marche pas », la première question que je pose est toujours : « c’est du I2C, du SPI, ou du GPIO direct ? », et la réponse est rarement la bonne au premier essai.

GPIO simple : tout ou rien

Le cas le plus basique. Une broche GPIO configurée en sortie peut être à 3,3V (HIGH) ou à 0V (LOW). Configurée en entrée, elle lit l’état d’un interrupteur, d’un bouton poussoir, ou de la sortie binaire d’un capteur (« objet détecté » ou « rien »). C’est avec ça qu’on allume une LED, qu’on lit un bouton, qu’on déclenche un relais.

PWM (Pulse Width Modulation) : variante du GPIO simple. Au lieu d’être en permanence à HIGH ou LOW, la broche alterne entre les deux à haute fréquence. Le rapport entre le temps HIGH et le temps total (le « rapport cyclique ») détermine la valeur moyenne de sortie. À 50 % de rapport cyclique, une LED brille à mi-intensité, un moteur tourne à mi-vitesse. Sur Pi 4 et antérieurs, le SoC expose le PWM matériel sur GPIO 12, 13, 18 et 19, répartis sur deux canaux indépendants (PWM0 et PWM1) — donc 4 broches utilisables mais seulement 2 signaux distincts. Sur Pi 5 (BCM2712), 4 canaux PWM indépendants sont disponibles. Au-delà, c’est du PWM logiciel (moins précis, plus gourmand en CPU). Le tutoriel L298N utilise le PWM pour le contrôle de vitesse des moteurs.

I2C : le bus universel des capteurs

I2C (prononcé « I-deux-C ») est un bus de communication qui permet de connecter jusqu’à 112 périphériques sur seulement deux fils : SDA (data) et SCL (clock). En théorie l’adressage 7 bits offre 128 adresses, mais 16 sont réservées par la spécification (0x00-0x07 et 0x78-0x7F), d’où la limite pratique de 112. Chaque périphérique a une adresse unique (par exemple 0x76 pour un BME280, 0x68 pour un MPU6050). Le Pi envoie l’adresse sur le bus, seul le périphérique qui se reconnaît répond.

Quand l’utiliser : capteurs de température/humidité/pression (BME280), centrales inertielles (MPU6050, BNO055), écrans OLED (SSD1306), horloges temps réel (DS3231), multiplexeurs de servos (PCA9685). La majorité des capteurs environnementaux et des centrales inertielles bas-débit parlent I2C (les capteurs haute fréquence comme les caméras ou les ToF utilisent plutôt SPI ou MIPI).

Vitesses : 100 kHz (mode standard) ou 400 kHz (mode fast). Le standard prévoit aussi Fast-mode Plus à 1 MHz, mais sur Raspberry Pi on utilise quasi exclusivement standard ou fast. Largement suffisant pour des données de capteur (quelques octets par seconde). Insuffisant pour du streaming vidéo ou de l’audio.

Câblage sur Pi : SDA = GPIO 2 (pin 3), SCL = GPIO 3 (pin 5), + VCC (3,3V) et GND. Activer I2C via sudo raspi-config > Interface Options > I2C. Vérifier la détection avec sudo i2cdetect -y 1. L’article sur les 5 capteurs détaille les exemples I2C avec gpiozero et les bibliothèques Adafruit CircuitPython.

SPI : le bus rapide pour écrans et ADC

SPI est un bus de communication plus rapide que l’I2C mais qui demande plus de fils. Quatre fils minimum : MOSI (Master Out Slave In), MISO (Master In Slave Out), SCLK (clock), et un CS (Chip Select) par périphérique. Le Pi peut faire du SPI à plusieurs MHz, ce qui en fait le bus de choix pour les écrans TFT, les convertisseurs analogique-numérique (ADC comme le MCP3008), et les lecteurs de cartes SD.

Quand l’utiliser plutôt que l’I2C : si tu as besoin de débit (écran LCD couleur, transfert de gros blocs de données), si tu veux du full-duplex (lecture et écriture simultanées), ou si le composant que tu as acheté n’a pas d’option I2C.

Câblage sur Pi : MOSI = GPIO 10, MISO = GPIO 9, SCLK = GPIO 11, CE0 = GPIO 8, CE1 = GPIO 7. Activer via sudo raspi-config > Interface Options > SPI. Le bus SPI0 expose nativement deux chip selects matériels (CE0 et CE1), mais le Pi 4 et le Pi 5 disposent de plusieurs contrôleurs SPI auxiliaires (SPI1 à SPI6) activables via dtoverlay si tu as besoin de piloter plus de périphériques.

UART : la liaison série point-à-point

UART (Universal Asynchronous Receiver/Transmitter) est la forme la plus simple de communication série : deux fils, TX (émission) et RX (réception), pas d’horloge partagée (d’où « asynchrone »). Les deux appareils doivent être configurés à la même vitesse (baud rate), typiquement 9600 ou 115200 baud.

Usages courants : modules GPS (qui envoient des trames NMEA en série), modules Bluetooth externes (HC-05/HC-06), communication Pi-Arduino (quand le Pi fait le « gros cerveau » et l’Arduino le « petit cerveau temps réel »), et terminal de debug (console série accessible via un câble USB-série FTDI quand le réseau ne marche pas).

Câblage : TX du Pi (GPIO 14) vers RX de l’autre appareil, et RX du Pi (GPIO 15) vers TX de l’autre. Les fils sont croisés (TX→RX, RX→TX). Erreur classique : connecter TX→TX, ce qui ne fonctionne évidemment pas. Activer via sudo raspi-config > Interface Options > Serial Port (activer le hardware serial, désactiver la console de login si tu veux l’utiliser pour des données).

Quel protocole pour quel usage ?

BesoinProtocolePourquoi
Allumer/éteindre un composantGPIO simple1 fil, 0 ou 1
Varier une intensité/vitesseGPIO PWM1 fil, rapport cyclique
Lire un capteur (T°, pression, IMU)I2C2 fils, bus partageable, adresses
Piloter un écran couleurSPI4+ fils, débit élevé
Communiquer avec un GPS ou ArduinoUART2 fils, série simple
Lire une valeur analogique (potentiomètre)SPI + ADC (MCP3008)Pi n’a pas d’entrée analogique native

La règle empirique : commence par I2C pour les capteurs, reste en GPIO simple pour les LEDs et relais, et n’ouvre le chapitre SPI ou UART que quand un composant spécifique l’exige. Le guide complet robotique DIY utilise les quatre protocoles dans des contextes différents, ce qui donne une vue d’ensemble pratique.

Questions fréquentes

Quelle est la différence entre I2C et SPI ?

I2C utilise 2 fils (SDA + SCL) et permet de connecter jusqu’à 112 périphériques par bus, mais reste limité à 100-400 kHz (1 MHz en Fast-mode Plus). SPI utilise au minimum 4 fils (MOSI, MISO, SCLK, CS) et tourne à plusieurs MHz, donc nettement plus rapide pour les écrans, les ADC ou les transferts de blocs. Règle pratique : I2C pour les capteurs lents et nombreux, SPI pour la vitesse ou le full-duplex.

Le Raspberry Pi peut-il lire un capteur analogique ?

Pas nativement, sauf le Raspberry Pi Pico (qui dispose d’un ADC 12 bits intégré). Les modèles Pi 1 à Pi 5 n’ont aucune entrée analogique. La solution standard est d’ajouter un ADC externe en SPI, le MCP3008 (10 bits, 8 canaux) étant le composant canonique. Le potentiomètre, le capteur de luminosité LDR ou le capteur d’humidité du sol passent donc tous par cet intermédiaire.

Combien de périphériques I2C peut-on brancher sur un Raspberry Pi ?

112 maximum sur un même bus I2C en adressage 7 bits. La spécification définit 128 adresses, mais 16 sont réservées (0x00-0x07 et 0x78-0x7F), d’où la limite pratique à 112. En réalité, au-delà de 10-15 périphériques sur un bus, la longueur cumulée des fils crée des problèmes de capacité parasite. Pour de gros déploiements, on multiplexe avec un TCA9548A (8 bus virtuels via 1 bus physique).

Comment activer I2C, SPI et UART sur un Raspberry Pi ?

Via la commande sudo raspi-config, puis le menu Interface Options. Active I2C, SPI ou Serial Port selon ton besoin. Pour l’UART, désactive aussi la console de login si tu veux utiliser le hardware serial pour des données. Un redémarrage est nécessaire après l’activation. Vérifie ensuite avec sudo i2cdetect -y 1 pour I2C et ls /dev/spi* /dev/serial* pour SPI/UART.

Ne manquez rien

Recevez nos meilleurs articles directement dans votre boite mail.

S'abonner

Articles connexes