En cours de rédaction
1 - Introduction
1.1 - Présentation
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:
- TX : La transmission - C’est la voie qui transmet le message à son interlocuteur
- RX : La réception - C’est la voie qui va recevoir un message de l’interlocuteur
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
1.2 - Premier exemple
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 bauds -
Serial.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érationsin(i)
avec un retour à la ligne à la fin
En 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.
2 - Arduino IDE
Le terminal série inclut dans l’Arduino IDE est particulièrement simple et efficace. Il permet à la fois :
- D’afficher les données bruts du port série
- De tracer des courbes de données
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é.
2.1 - Utilisation simple du moniteur
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
2.2 - Utilisation du mode graphique
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.
2.3 - Utilisation avancée du plotter
a. Afficher plusieurs graphiques
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);
}
b. Gérer l’auto-scale
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);
}
c. Fonction d’aide
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 label -
float value
: La valeur à afficher -
bool last
:faux
si d’autres valeurs doivent suivre,vrai
si c’est la dernière valeur
On 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);
}
2.4 - Limitations
- L’axe X défile à l’infini et il est impossible de mettre en pause le défilement autrement qu’en déconnectant la liaison physique.
- Il n’est pas possible d’afficher un point en (X,Y)
- La mise à l’échelle automatique de L’axe Y semble être une bonne idée à première vue, mais peut être très ennuyante rapidement dans certains cas.
- Il est impossible de zoomer sur une partie de la courbe
- Il est impossible de visualiser d’autres données provenant du port série en même temps que les courbes.
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.
3 - TelePlot
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.
3.1 - Installation
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 .
3.2 - Possibilités
L’extension s’intègre directement à l’interface de VSCode lors de son ouverture et s’utilise en tant qu’onglet. L’interface permet :
- D’afficher plusieurs courbes séparément
- D’afficher un moniteur série textuel contenant les datas qui ne sont pas liées à des graphiques
- D’afficher des statistiques sur les graphes.
- De choisir l’échelle d’affichage en X
- De zoomer sur une courbe
- D’exporter les données (au format JSON pour le moment)
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.
3.3 - Utilisation
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.
a. Moniteur textuel seul
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);
}
b. Courbes seules
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);
}
c. Courbes et datas
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);
}
d. Fonction d’aide
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 label -
float value
: La valeur à afficher