12 juin 2022
Avoir un PC embarqué c’est bien, pouvoir communiquer facilement avec les microcontrôleurs de l’électronique, c’est mieux !
Pour cela, le Raspberry Pi propose plusieurs protocoles de communication :
Nous pourrions reprocher à l’I2C et au SPI de ne pas permettre de communications asynchrones. C’est en partie pour cela quoi nous nous sommes intéressés à l’UART.
Si ces trois protocoles sont des protocoles de communication de type série, l’UART est souvent considéré comme LE protocole série. C’est l’un des protocoles de type série les plus simples.
Sur le Raspberry Pi (la carte), il y a deux types de liaisons UART :
Le PL011 est un UART complet, tandis que le mini UART est limité sur plusieurs points. Les plus importants c’est que la vitesse du mini UART est liée à celle du processeur. Il faut donc figer celle-ci pour se servir du mini-UART.
Pour plus d’information sur le mini UART, la référence est la fiche technique des périphériques du BCM2835 ARM, §2.2 en page 10.
L’un des UARTs est relié au connecteur GPIO. Cet UART est nommé UART primaire (primary - dans la documentation). Ça peut être un PL011 ou un Mini UART en fonction du modèle de votre carte.
L’autre UART est relié au module Bluetooth, en fonction des modèles de Raspberry Pi.
Il est possible d’inverser ces deux UARTs en fonction de vos besoins.
Ces UARTs peuvent être assignés à différentes broches du processeur, mais seules les broches 14 et 15 sont reliées au connecteur GPIO (aux broches 8 et 10).
Model | PL011 | mini UART |
---|---|---|
Raspberry Pi Zero | Primaire | Secondaire |
Raspberry Pi Zero W | Secondaire (Bluetooth) | Primaire |
Raspberry Pi 1 | Primaire | Secondaire |
Raspberry Pi 2 | Primaire | Secondaire |
Raspberry Pi 3 | Secondaire (Bluetooth) | Primaire |
Compute module 3 et + | Primaire | Secondaire |
Raspberry Pi 4 | Secondaire (Bluetooth) | Primaire |
Attention : Le mini-UART est désactivé par défaut, qu’il soit en primaire ou en secondaire
Raspberry Pi OS essaie de vous simplifier la tâche, en appliquant ces deux conventions.
En fonction des "capacités" de l’UART :
Fichier | Description |
---|---|
mini UART | |
PL011 (UART0) |
En fonction des broches :
Fichier | Description |
---|---|
Primaire | |
Secondaire |
Donc si vous voulez accéder à l’UART sur le port GPIO, en toute logique vous devriez utiliser /dev/serial0.
Et comme sur le Raspberry Pi 3 et 4, le PL011 est affecté au Bluetooth. Pour utiliser l’UART, deux options :
L’activation du mini-UART figera la fréquence du processeur, soit à 250 Mh, soit en "turbo" si vous ajoutez
L’UART primaire, celui sur GPIO, est accaparé par le noyau pour offrir un terminal par la liaison série. Au choix, soit vous passez par
Avant :
console=serial0,115200 console=tty1 root=PARTUUID=ac01d331-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
Après :
console=tty1 root=PARTUUID=ac01d331-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
Maintenant, vous êtes sur de la configuration Linux standard.
Obtenez la configuration actuelle de votre liaison série avec :
stty -F /dev/serial0 -a
Pour comprendre précisément la configuration, la page man de stty vous sera bien utile. Nous utilisons la commande suivante pour avoir une configuration fonctionnelle.
sudo stty -F /dev/serial0 115200 cs8 -cstopb -onlcr -echo -echoe -echok -opost
Vous pouvez changer 115200 par la vitesse souhaitée de votre liaison série.
Sous Linux, "tout est fichier". L’envoi ou la réception de données sur le RPi se fait en lisant ou en écrivant dans /dev/serial0. En C, nous utiliserons par exemple fopen, fprintf et fget, tandis qu’en bash, nous utiliserons les commandes suivantes. Pour la réception des données du port série :
cat /dev/serial0
Pour l’émission de données sur le port série :
echo -e -n "Bonjour\x00" > /dev/serial0
Pour la commande
Si vous obtenez un message du type "Permission non accordée", vérifier les droits du fichier.
# ls -l /dev/serial0
crw-rw---- 1 root dialout 4, 64 juin 11 08:44 /dev/ttyS0
Ajoutez votre utilisateur au groupe auquel appartient le fichier,
# sudo addgroup $USER dialout
Note : Une grande partie de l’article se base sur la documentation du Raspberry Pi, notamment la partie sur l’UART.