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▲
#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.
#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.
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.