Arduino : comment obtenir un deuxième port série sur Arduino Uno ?

Niveau : débutant

Jay M

Les cartes Arduino Uno disposent d’un port série matériel connecté via USB à votre ordinateur et partagé sur les broches 0 et 1. Ce port série vous permet initialement de charger un code compilé dans votre Uno et d’établir une discussion (affichage et saisie de données) entre votre PC et votre sketch Arduino via le Moniteur Série de l'EDI.

De nombreux équipements tiers (GPS, GSM, Bluetooth, Sonar, appareil MIDI, compteur Linky…) discutent aussi par le biais d’un port série. Que faire si vous avez besoin de communiquer avec deux périphériques série ou de parler avec un seul périphérique tout en laissant le port série principal ouvert à des fins de débogage ?

Commentez

- Titre : Arduino : comment obtenir un deuxième port série sur Arduino Uno ?

- Auteur : Jay M

- Parution : 18 août 2021

- Public visé :

- Licence : Copyright ® 2021 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Voir également :

- Les Cahiers Pratiques Arduino : une série de tutoriels pour débuter

Sommaire

- I. L’émulation de port

- II. Création du port série logiciel

- III. Le code

- IV. Pour aller plus loin

I - L’émulation de port

Le port série matériel étant déjà utilisé, nous pouvons reproduire les fonctionnalités des lignes Rx et Tx par logiciel. La bibliothèque SoftwareSerial répond à ce besoin : elle a été développée pour permettre la communication série sur les autres broches. C’est une bibliothèque officielle livrée avec l’EDI, il n’y a donc rien de plus à installer.

II - Création du port série logiciel

Attention aux niveaux de tension sur le port série. De nombreux appareils sont en 3,3 V alors que votre Arduino Uno est en 5 V. Cela veut dire que lorsque le Uno émet un 1 (HIGH) sur le port série, il met sa broche Tx à 5 V. De l’autre côté, votre appareil va recevoir ces 5 V en entrée sur sa broche Rx. Si elle ne supporte que 3,3 V, vous risquez de griller votre appareil. Il existe des adaptateurs de niveau (logic-level shifter) ou alors on peut régler cela avec un pont de résistances.

Contrairement au port série matériel (Serial) où les broches sont fixes (0 et 1), il faut définir celles que l’on voudra utiliser. Pour cela, on crée une variable de type SoftwareSerial en lui donnant un nom et comme paramètres les deux broches émulant respectivement Rx (broche en réception) et Tx (broche en émission).

Dans l'exemple ci-dessous, les broches numériques 2 et 3 sont utilisées comme lignes série Rx et TX virtuelles. Ce port virtuel est nommé portSecondaire.

#include <SoftwareSerial.h>           // import de la bibliothèque
SoftwareSerial portSecondaire(2, 3);  // définition de portSecondaire (Rx, Tx)

III - Le code

portSecondaire.ino

#include <SoftwareSerial.h>           // import de la bibliothèque
SoftwareSerial portSecondaire(2, 3);  // définition de portSecondaire (Rx, Tx)

void setup()
{
Serial.begin(115200);               // port série matériel à 115200 bauds
portSecondaire.begin(9600);         // ouverture du port série logiciel à 9600 bauds
}

void loop()
{
... // ici usage des 2 ports
}

Exemple de communication avec un module Bluetooth (type HC-05) :

La communication avec le module HC-05 se fait par un port série virtuel de l’Arduino (connecteurs 2 et 3). Le port série matériel sur les connecteurs 0 et 1 est disponible pour la communication série avec l’ordinateur par le câble USB.

Hc05.ino

#include <SoftwareSerial.h>
SoftwareSerial hc05(2, 3); //Rx, Tx

void setup() {
Serial.begin(9600);
hc05.begin(9600);
}

void loop() {
if (hc05.available()) { // donnée disponible
Serial.write(hc05.read());  // les données renvoyées par le module bluetooth sont envoyées au moniteur série
}

if (Serial.available()) {  // donnée disponible
hc05.write(Serial.read()); // les données saisies et validées depuis le moniteur série sont envoyées au module bluetooth
}
}

Avec ce programme, on peut envoyer des commandes AT depuis le moniteur Série vers le module et voir sa réponse.

Depuis le moniteur Série, le module répond « OK » quand on l'interroge avec la commande « AT »

IV - Pour aller plus loin

L’émulation série par logiciel met fortement à contribution votre Arduino. Par conséquent, si vous le pouvez, préférez toujours un port série matériel.

Quelques points notables :

- bien que l’émulation logicielle d’un port série puisse théoriquement supporter 115 200 bauds, il vaut mieux l’utiliser à bas débit (9 600 par exemple) et vous assurer que l’appareil connecté n’est pas « trop bavard » ;

- vous pouvez utiliser plusieurs ports série logiciels, mais un seul peut recevoir des données à la fois ;

- vous ne pouvez pas recevoir et transmettre en même temps ;

- vous ne pourrez pas utiliser la bibliothèque Servo en même temps que SoftwareSerial (mais il existe d’autres bibliothèques de pilotage de servomoteurs).

Si vous êtes « coincé », il existe d’autres bibliothèques d’émulation de port série, chacune avec ses avantages et inconvénients :

- AltSoftSerial est extrêmement robuste jusqu’à 31 250 bauds, elle permet l’émission et la réception simultanées, mais n’offre qu’une seule instance possible sur les broches 8 et 9 de votre Uno. La bibliothèque requiert un Timer 16bits (Timer1) qui désactive le PWM sur la broche 10 et elle est incompatible avec d’autres bibliothèques nécessitant Timer1 (comme la bibliothèque Servo).

- NeoSWSerial fonctionnera sur toutes les broches, mais uniquement à des débits relativement faibles (9 600, 19 200, 31 250 (MIDI) et 38 400).

La communication série est fondamentalement asynchrone. Sa gestion n’est donc pas toujours simple, il faut éviter les attentes bloquantes (pas d’appel à delay()) et lire les données au fil de l’eau, quand elles arrivent, sans bloquer votre Arduino.

Si vous avez encore des questions, n’hésitez pas à ouvrir une discussion dans le forum Arduino.