Publié le 4 novembre 2021 - par

Utiliser l’UART – Port série du Raspberry Pi 4

J’ai eu plusieurs fois des questions sur les UART du Raspberry Pi. C’est vrai que ce n’est pas forcément très clair. Je vais essayer de faire simple, pour n’embrouiller personne et donner les éléments pour configurer la communication série le plus simplement possible.

Utiliser l’UART du Raspberry Pi

UART = Universal Asynchronous Receiver Transmitter ou émetteur-récepteur asynchrone universel

Attention le Raspberry Pi ne supporte que des niveaux à 3,3 volts maximum. Il vous appartient de prévoir des adaptations de niveau de tension si nécessaire. Si vous envoyez du 5 volts ou du 12 volts sur les GPIO vous allez détruire la carte Raspberry Pi !

Pour de vrai, le Raspberry Pi 4 et le Pi400 (je vais rester sur ceux là car ça varie avec les modèles) comporte plusieurs UART… 6 en fait !

Vous voyez qu’il y a deux types d’UART.

Le premier type est le PL011 l’autre le mini UART

Le PL011 est un UART performant, largement compatible avec le 16550. Les plus anciens se rappelleront de ce modèle qui équipait l’IBM PC… Le mini UART a quant à lui, un ensemble de fonctionnalités réduit.

Tous les UARTs sur le Raspberry Pi sont en 3,3V seulement – des dommages se produiront s’ils sont connectés à des systèmes 5V ou pire RS232 en +12v et -12v. Un adaptateur peut être utilisé pour se connecter à des systèmes 5V ou 12v. Des adaptateurs USB à 3,3 V série bon marché sont également disponibles auprès de divers vendeurs en ligne.

Sur le Raspberry Pi, un UART est connecté aux GPIO 14 (transmission TxD) et 15 (réception RxD). C’est l’UART primaire. Par défaut, ce sera également l’UART sur lequel une console Linux peut être connectée. C’est ce qui est programmé par défaut dans /boot/cmdline.txt. Notez que GPIO 14 est relié à la broche 8 sur et GPIO 15 est sur la broche 10 du connecteur GPIO.

Connexion d’origine des UART

Par défaut le noyau Linux est accessible (pour une ouverture de session ou pour l’affichage des messages lors du démarrage du système) sur le port série (GPIO 14 et 15, broches 8 et 10 du Raspberry Pi). L’interface Bluetooth est quant à lui connecté à un UART PL011 qui communique via HCIUART.

On peut dire que Linux “confisque” la console à son profit 😀 … La connexion de la console Linux est paramétrée dans le fichier /boot/cmdline.txt. On peut modifier ce fichier manuellement (voir encadré ci-dessous) ou via raspi-config, ou encore par la configuration en mode graphique, ce que je vous conseille si vous êtes débutant(e).

Attention
Si vous modifiez le fichier cmdline.txt, il faut savoir que ce fichier envoie directement des commandes au noyau lors du démarrage. Il ne doit faire qu’une seule ligne et ne pas comporter de saut de ligne, retour à la ligne ou autre caractère exotique. A défaut le système risque de ne pas démarrer. Comme la partition Boot est accessible depuis Windows (ou Linux) je vous conseille de faire une sauvegarde du fichier avant toute modif pour pouvoir revenir en arrière. D’autre part, n’utilisez pas d’utilitaire comme le Bloc Note de Windows qui ajoute des caractères et plante le fichier. Préférez NotePad++ sous Windows ou nano sous Linux.

Modification de cmdline.txt

En fonction de votre assurance, choisissez l’une ou l’autre de ces trois méthodes.

Manuellement

Commencez par faire une sauvegarde du fichier cmdline.txt (on ne sait jamais, ça permettra de revenir en arrière…).

sudo cp /boot/cmdline.txt /boot/cmdline.txt.old

Le fichier d’origine (installation “fraîche” de Raspberry Pi OS) contient SUR UNE SEULE LIGNE  :

console=serial0,115200 console=tty1 root=PARTUUID=75afe894-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

Ouvrez le avec nano (sur le Raspberry Pi) ou Notepad++ sur Windows.

sudo nano /boot/cmdline.txt

Supprimez ce texte :

console=serial0,115200

Redémarrez le système pour prendre la modification en compte.

sudo reboot

Pour vérifier, affichez le contenu du fichier cmdline.txt Il ne contient plus la déclaration de la console sur le port série. Vous pouvez continuer.

Dans raspi-config

Dans une fenêtre de terminal, lancez raspi-config :

sudo raspi-config

Allez sur 3 => Interface Options

Sélectionnez P6 => Serial Port

Vous obtenez cette fenêtre avec Oui sélectionné par défaut mais on ne veut plus que le login soit possible sur le port série : répondez Non (touche Tab)

Puis validez (touche Entrée)

raspi-config vous demande maintenant si vous souhaitez activer le port série hardware. Répondez Non et validez.

raspi-config vous confirme que le login n’est plus possible sur le port série qui est désactivé. Validez avec la touche Entrée.

Vous revenez au menu principal. Mettez Finish en surbrillance (touche Tab) et validez (touche Entrée)

Il reste à rebooter pour prendre ces modifications en compte.

Après le redémarrage, on va quand même vérifier ce qui a été fait dans cmdline.txt :

Le résultat est le même que pour la procédure manuelle, la déclaration de la console a disparu (console=serial0,115200) et c’est ce qu’on voulait. C’est juste un peu plus long avec raspi-config. On peut passer à la suite.

En mode graphique dans la configuration

En mode graphique, Dans les interfaces,  activez le port série, désactivez la console. Après le démarrage Vous disposez du port série sur les GPIO.

Déconnecter le Bluetooth

Les overlays

Pour le moment on a libéré le port UART GPIO (qui utilisait mini UART) de la console. On va maintenant libérer l’UART PL011 qui était relié à l’interface Bluetooth. Cette fois c’est dans /boot/config.sys que ça va se passer.

Diverses définitions d’overlay UART se trouvent dans le Device Tree. J’avais écrit un article sur ce mécanisme en 2015. Les deux overlays les plus utiles sont disable-bt et miniuart-bt.

disable-bt désactive le périphérique Bluetooth et fait du premier PL011 (UART0) l’ UART primaire. Vous devez également désactiver le service système qui initialise le modem, afin qu’il ne se connecte pas à l’UART, en utilisant sudo systemctl disable hciuart.

miniuart-bt permet à l’interface Bluetooth d’utiliser le mini UART, et fait du premier PL011 (UART0) l’UART primaire. Notez que cela peut réduire le débit maximum (en bauds ). Vous devez également régler l’horloge centrale du GPU à une fréquence fixe en utilisant soit force_turbo=1 ou core_freq=250.

Les overlays uart2, uart3, uart4, et uart5 sont utilisés pour activer les quatre UARTs supplémentaires sur le Pi 4. Il y a d’autres overlays spécifiques aux UART dans le dossier. Référez-vous à /boot/overlays/README si vous voulez plus  de détails sur les overlays, ou exécutez dtoverlay -h overlay-name pour plus d’informations sur leur utilisation.

Désactiver le Bluetooth

Vous devez ajoutez une ligne au fichier /boot/config.txt pour appliquer cet overlay :

Ouvrez le fichier avec nano

sudo nano /boot/config.txt

Et tout en bas du fichier, ajoutez :

dtoverlay=disable-bt

Enregistrez le fichier et redémarrez Raspberry Pi OS pour qu’il prenne la modification en compte.

sudo reboot

Info
/dev/serial0 et /dev/serial1 sont des liens symboliques qui pointent vers /dev/ttyS0 ou /dev/ttyAMA0.

Désactiver le service système

disable-bt que nous venons d’utiliser désactive le périphérique Bluetooth et fait du premier PL011 (UART0) l’UART primaire. Vous devez également désactiver le service système qui initialise le modem, afin qu’il ne se connecte pas à l’UART, en utilisant la commande

sudo systemctl disable hciuart

Ce qui se traduit par l’affichage de ce message :

Vote système est maintenant prêt pour l’utilisation du port série sur le GPIO :

La configuration est maintenant celle-ci. Pour pouvoir communiquer avec l’extérieur par l’intermédiaire du port série, on va mettre en place un émulateur de terminal sur le Raspberry Pi. Ce programme sera capable d’envoyer des données sur le port série et d’afficher celles qui arrivent. C’est tout ce qu’il faut pour dialoguer avec un Arduino, un Raspberry Pi Pico, une carte de téléphonie… (il y a des articles qui en parlent sur le blog).

Activer l’UART physique

Dans /boot/config.txt si ce n’est pas fait automatiquement,

modifiez la ligne

enable_uart=0

pour qu’elle devienne

enable_uart=1

Pour activer l’UART physique (voyez sur cette page la partie : Other DT commands available in config.txt).

Pour prendre tout ceci en compte, redémarrez votre Raspberry Pi

sudo reboot

Minicom

L’émulateur de terminal que j’ai choisi s’appelle minicom. Ce n’est pas le seul et en fonction de vos habitudes ou de vos préférences, vous pouvez en choisir un autre.

Installation

Dans une fenêtre de terminal, entrez :

sudo apt install minicom

Répondez O, l’installation est très rapide.

Pour démarrer minicom :

sudo minicom

Minicom se lance et affiche ceci dans la fenêtre de terminal. Pour accéder à l’aide, tapez CTRL A puis Z :

Vous obtenez un résumé des commandes de minicom. Pour quitter proprement vous voyez qu’il faut taper X, O pour configurer minicom, P pour définir les paramètres de communication etc. La page d’aide de minicom (man page) est en ligne et en français, merci au traducteur 😛

Permettre à l’utilisateur pi d’utiliser minicom

Pour lancer minicom il faut le faire précéder de sudo car minicom accède au port série qui est un port matériel, auquel un utilisateur “normal” n’a pas accès. Pour que pi puisse y accéder on va l’ajouter dans le groupe dialout.

sudo usermod -a -G dialout pi

et redémarrez pour prendre la modification en compte.

Vous pouvez lancer minicom directement sur le port série avec la commande

minicom -D /dev/ttyAMA0

Configuration

Lancez minicom, normalement il suffit de faire :

minicom -D /dev/ttyAMA0

Pour voir la configuration de la communication, tapez CTRL A puis P

Par défaut minicom est configuré en 115200 8N1

  • 115200 bauds
  • 8 bits de données
  • Parité : sans parité
  • 1 stop bit

Pour des liaisons avec des systèmes externes, vous devrez sans doute modifier ces paramètres. Pour nos tests on va laisser ça sans y toucher.

Test

Pour le test on va envoyer des caractères depuis minicom. Ils vont être envoyés vers le port GPIO14 TxD (émission de données). Positionnez un strap (un court-circuit, un cavalier) entre les broches 8 et 10 du GPIO. Le signal sortant par GPIO14 va rentrer par GPIO15 RxD (réception de données) et revenir vers minicom qui l’affichera sur l’écran.

Si vous n’êtes pas confiant(e), remplacez le strap par une résistance de 1KΩ qui protègera vos GPIO en cas de bétise.

Image du port GPIO du Raspberry Pi avec un strap entre les broches 8 et 10

Mise en place du court-circuit entre les broches 8 et 10 du port GPIO pour les tests du port série. (Raspberry Pi 4 en boîtier Argon One)

En résumé : quand le strap est présent, les caractères que je tape au clavier sont affichés sur l’écran. Enlevez le strap : plus rien ne s’affiche sur l’écran quand je tape du texte.

Si ceci fonctionne, votre port série est opérationnel et vous pouvez dialoguer avec des cartes extérieures (Arduino, Raspberry Pi Pico…) via le port série avec minicom.

Mode Echo

En mode normal, chaque caractère frappé au clavier sort par le port TxD et revient sur l’écran. C’est ce qui se passe généralement quand vous connectez le port série à une carte extérieure, c’est elle qui assure le retour des caractères pour confirmer qu’ils ont été bien reçus.

Ici lors des tests j’ai saisi la phrase “Essai du port série du Raspberry Pi …” notez la transformation du é en 2 caractères … je vous laisse trouver le pourquoi de la chose 😉 Chaque caractère a été écrit une seule fois à l’écran.

Pour activer le mode Echo, dans minicom tapez CTRL A puis E. Le mode Echo est activé :

Lorsque vous tapez un caractère au clavier (un A) il est envoyé sur l’écran du terminal (A bleu). Minicom l’envoie également vers le port série TxD (A rouge). Le A est transmis à la carte extérieure. Il arrive sur son port RxD. La carte exploite le caractère reçu mais le renvoie également sur son port TxD pour confirmer qu’il a bien été reçu (A vert). Le A revient donc sur le Raspberry Pi via le port RxD (GPIO15) puis vers minicom qui l’affiche sur l’écran.

En mode Echo, à chaque fois que vous tapez un caractère, si la transmission se passe bien, il est affiché deux fois de suite sur l’écran.

La commande du mode Echo est une bascule. Pour l’enlever faites de nouveau CTRL A puis E. Les caractères saisis au clavier ne sont affichés qu’une seule fois.

Pour quitter minicom, tapez CTRL A puis X et validez avec la touche Entrée.

Conclusion

Nous voilà arrivés au terme de cet article. Pour un ancien comme moi qui ai utilisé des lignes RS232, RS422 et RS485 pour des liaisons en industrie et dans les systèmes de pointage horaire, la notion de liaison série a un sens. C’est vrai qu’aujourd’hui on parle plutôt d’USB ou d’I2C. Mais je pense que la bonne vieille liason série a encore de l’avenir car elle est facile à mettre en oeuvre et à “déverminer”. A une époque (lointaine) j’ai utilisé régulièrement une valise d’analyse de liaison série ainsi que des boîtes de coupure pour dépanner ces liaisons qui ont toujours leur place dans les systèmes actuells.

N’hésitez pas à faire part de vos remarques sur cet article, positives et négatives, ça permettra de l’améliorer pour les utilisateurs intéressés.

A noter qu’on trouve pour une vingtaine d’euros (le lot de 5 cares)  des cartes d’extension RS232 pour le Raspberry Pi sur Aliexpress. Elles sont équipées d’une prise DB9 et d’un MAX232.

Il y a également des équivalents chez Amazon avec cette carte Raspberry PI GPIO TX/RX ZU RS232 à 7,50€ = 6€ de frais de ports.

 

Sources

 

 

Share Button

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. Auteur de plusieurs livres sur le Raspberry Pi publiés aux Editions ENI.

4 réflexions au sujet de « Utiliser l’UART – Port série du Raspberry Pi 4 »

  1. Matthieu

    On a toujours besoin d’un uart ….

    J’avais utilisé les versions précédentes de cet article pour les Rpi3, je vois que ça n’a pas beaucoup changé pour le 4.

    Merci pour la maj !

    Répondre
  2. lolio

    Merci, article très intéressant comme toujours !

    Juste une remarque sur les convertisseurs MAX232 cités en fin d’article: attention à la tension d’alimentation utilisée en entrée car ces cartes doubles seulement cette dernière en sortie: si on l’alimente en 3.3V, la tension de sortie côté DB9 sera comprise entre 6.6 et -6.6V… cela peut poser problème lorsque l’on souhaite s’en servir pour faire du RS232 avec un port physique d’un ancien PC (gérant ses niveaux entre -12 et +12V) => cela m’a posé plusieurs fois des soucis sur certains montage car les fronts de niveaux (0 ou 1) étaient mal reconnus… La solution que j’ai trouvé: alimenter le module en +5V et utiliser un pont diviseur de tension sur la patte RX du raspberry pou ramener la tension en 3.3V max. Il y avait peut-être moyen de faire mieux mais je reste encore novice en électronique (même si j’ai beaucoup progressé grâce à ce blog)… 🙂

    Sinon autre question: comment utiliser les UART2 à 5 ? Y a-t-il déjà des gpio définis pour les utiliser ou doit-on les configurer ? Si oui, serait-il possible d’avoir un exemple ?

    J’aurai un projet pour utiliser le raspberry comme concentrateur d’équipements série vers IP… 🙂

    En tout cas, bravo François ! 🙂

     

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.