Problème : les données sont transmises toutes les 10ms. Elles sont donc difficilement visibles et descriptibles dans le terminal série.
Ressources d'utilisation du port série
Ressources d'utilisation du port série
Port Serie
Ressources d'utilisation du port série
La majorité des cartes “type Arduino” sont capables de communiquer en série via l’USB (c’est le cas des cartes arduino UNO). Il est donc possible de recevoir et d’envoyer des instructions via ce port et de les afficher sur un terminal de l’ordinateur hôte.
Pour se faire nous allons établir une communication série entre le µC et le PC.
La liaison série permet une communication point-à-point grâce à deux voies:
Etant donné que les voies sont spécifiques et associées à des pins du µC (sur une UNO : RX = pin0 et TX = pin1) il ne faut pas oublier de croiser le fils de communication comme montré dans cet exemple :
Afin de communiquer, les deux périphériques doivent être synchronisés sur la même vitesse de transmission appelée bauds.
Si vous souhaitez en savoir plus sur la liaison série : La liaison série - Zeste de savoir
Dans notre exemple, nous allons envoyer une trame (un sinus) et nous allons l’afficher sur le moniteur série.
Le code utilisé sera le suivant :
#include <Arduino.h>
float i=0;
void setup()
{
Serial.begin(115200);
}
void loop()
{
i+=0.1;
Serial.print("sin:");
Serial.println(sin(i));
delay(10);
}
Serial.begin(115200)
: Initialise une communication série à 115200 baudsSerial.print(">sin:")
: Envoi sur le porte série la chaine de caractères ">sin:"
Serial.println(sin(i))
: Envoi sur le porte série le résultat de l’opération sin(i)
avec un retour à la ligne à la finEn savoir plus sur l’utilisation du port série dans le Framework arduino : référence Arduino - Serial
Pour que le moniteur série puisse lire le porte série, il faut donner à platformIO l’information de vitesse de la communication en ajoutant la ligne suivante monitor_speed = 115200
dans le fichier de configuration platformio.ini
Vous pouvez ensuite Serial Monitor dans la barre de menu en bas à gauche :
Le moniteur série s’ouvre et vous affiche l’ensemble des données transmises entre votre carte et votre ordinateur.
Nous allons donc voir par la suite comment améliorer la lecture du port série dans le cas d’un grand nombre de données et d’une fréquence d’envoi importante.
Le terminal série inclut dans l’Arduino IDE est particulièrement simple et efficace. Il permet à la fois :
Il n’est d’ailleurs pas nécessaire d’avoir écrit le code dans l’IDE, ou d’avoir une carte arduino, pour utiliser le moniteur série. N’importe quel port série provenant de n’importe quelle source peut être utilisé.
Utilisons l’exemple précèdent afin de tester le moniteur série en lecture
Dans l’IDE Arduino, allez dans Outils > Port et sélectionnez le port com de votre carte à utiliser. Cliquez ensuite sur Moniteur série en haut à droite pour ouvrir le moniteur.
La fenêtre du terminal série s’ouvre et vous affiche les données reçues. Attention cependnat à bien régler la vitesse en baud dans le menu inférieur droit.
Il vous est également possible d’afficher l’horodatage et de désactiver le défilement automatique.
Le moniteur arduino a l’avantage de proposer les fonctionnalités du moniteur de PIO sous VSCode avec des accès simplifiées aux paramétrage du port série, le rendant plus simple à utiliser et à paramétrer
Il est également possible d’afficher les données reçues sur un affichage graphique et de tracer les courbes de données reçues. pour cela :
Sur la fenêtre s’affiche alors votre courbe des données reçues. il est également possible, comme sur la fenêtre textuelle, de modifier les paramètres de vitesse et d’envoyer des données.
Il es possible d’afficher plusieurs graphiques dans l’interface série d’Arduino IDE. Pour cela, on va utiliser le séparateur virgule
","
entre chaque envois de datas.
Par exemple, pour afficher une courbe de sin(i)
et en même temps la courbe de cos(i)
, on peut s’y prendre de la manière suivante :
void loop()
{
i+=0.1;
Serial.print(sin(i));
Serial.print(",");
Serial.println(cos(i));
delay(10);
}
Il est bien sur possible d’afficher plus de courbes (aucune limite n’est définie dans la doc de l’IDE). Les couleurs des graphes sont définies automatiquement et l’ordre d’envoi des données impact le choix de la couleur.
Il est également possible d’afficher des labels permettant d’identifier les courbes. Pour cela, on va faire précéder chaque envoi de valeur avec le label correspondant à la courbe avec un le caractère deux points
:
entre le label et la valeur :
void loop()
{
i+=0.1;
Serial.print("sin:");
Serial.print(sin(i));
Serial.print(",");
Serial.print("cos:");
Serial.println(cos(i));
delay(10);
}
Le moniteur série d’arduino IDE va automatiquement adapter l’échelle verticale de l’affichage en fonction des données min et max reçues. Cela peut parfois être contraignant pour la lecture des graphiques. Une solution consiste à envoyer deux courbes constantes min et max permettant de forcer l’échelle verticale.
Attention cependant : si les courbes dépassent le valeurs min et/ou max, l’adaptation automatique recommence à modifier l’échelle d’affichage.
Dans l’exemple ci-dessous on va afficher deux lignes min et max à respectivement -15
et +30
, puis on va afficher la valeur de 10*cos(i)
.
void loop()
{
i+=0.1;
Serial.print("min:");
Serial.print(-15);
Serial.print(",");
Serial.print("cos:");
Serial.print(10*cos(i));
Serial.print(",");
Serial.print("max:");
Serial.println(30);
delay(10);
}
Si vous souhaitez simplifier votre écriture de code dans le but d’afficher des graphiques, vous pouvez utiliser la fonction suivante (ou similaire) dans votre code :
void plot(String label, float value, bool last)
{
Serial.print(label);
Serial.print(":");
Serial.print(value);
if(!last) Serial.print(",");
else Serial.println();
}
String label
: Le nom de votre labelfloat value
: La valeur à afficherbool last
: faux
si d’autres valeurs doivent suivre, vrai
si c’est la dernière valeurOn peut alors avoir le code suivant afin d’afficher deux courbes avec labels :
void loop()
{
i+=0.1;
plot("cos", 10*cos(i), false);
plot("sin", 5*sin(i), true);
delay(10);
}
Pour cela, il parait intéressant de chercher d’autres options d’affichage. Actuellement il n’existe pas de vrai alternative implémentée directement dans VSCode par PlatformIO ou par Arduino.
C’est pour cela que l’extension TelePlot a été développée et sera explicitée ci-après.
TelePlot est un outil d’affichage de courbes télémétriques développée par Alexandre Bremer. A la base, l’application a été développée pour permettre l’affichage de données provenant de paquets UDP. Elle a été ré-adpatée afin d’être utilisable comme extension sous VSCode afin d’afficher des données provenant d’un port série.
L’extension s’installe simplement via le gestionnaire d’extension de VSCode.
Une fois l’installation réalisée, l’extension est accessible via le bouton du menu inférieur gauche .
L’extension s’intègre directement à l’interface de VSCode lors de son ouverture et s’utilise en tant qu’onglet. L’interface permet :
Enfin, toute les datas sont horodatées et un curseur permet l’affichage des précis des datas reçus à un instant pointé par le curseur.
Afin d’afficher des courbes dans TelePlot, il est nécessaire, comme pour l’arduino IDE, de respecter un certain nombre de spécificités.
Pour afficher une donnée dans le moniteur textuel, il suffit juste d’envoyer la donnée sur le port série comme sous arduino.
void loop()
{
i+=0.1;
Serial.print("loop - i=");
Serial.println(i);
delay(10);
}
Pour afficher une courbe dans TelePlot, nous allons utiliser le caractère >
juste avant le label de la courbe afin d’indiquer à l’outil que la prochaine valeur envoyée sera liée à un graphe du label correspondant. On terminera l’envoi de données par un retour chariot à l’aide de la fonction println()
par exemple.
void loop()
{
i+=0.1;
Serial.print("loop - i=");
Serial.println(i);
Serial.print(">sin:");
Serial.println(sin(i));
Serial.print(">cos:");
Serial.println(cos(i));
delay(10);
}
Il est également possible d’afficher les courbes et les données en même temps en combinant les deux codes précédents.
void loop()
{
i+=0.1;
Serial.print("loop - i=");
Serial.println(i);
Serial.print(">sin:");
Serial.println(sin(i));
Serial.print(">cos:");
Serial.println(cos(i));
delay(10);
}
Si vous souhaitez simplifier votre écriture de code dans le but d’afficher des graphiques, vous pouvez utiliser la fonction suivante (ou similaire) dans votre code :
void teleplot(String label, float value)
{
Serial.print(">");
Serial.print(label);
Serial.print(":");
Serial.println(value);
}
String label
: Le nom de votre labelfloat value
: La valeur à afficher