Terminal série sur Arduino
Transcription
Terminal série sur Arduino
http://www.didel.com/ [email protected] C pour microcontrôleurs www.didel.com/C/Terminal.pdf Terminal série sur Arduino Un moniteur ou terminal est un écran/clavier relié à un microcontrôleur pour interagir avec un utilisateur. Les microcontrôleurs ont utilisés depuis leur début la norme série RS232 (en 5 volts) pour communiquer avec un PC (programme Teraterm, Telnet) et maintenant avec des tablettes via BlueTooth. USB a défini des "com ports" qui émulent des prises séries, avec des numéros de ports qui fonctionnent en général. Arduino utilise un com port pour charger le programmes, et quelques fonctions Arduino permettent d'utiliser cette ressources. Sur Energia et Pinguino, il y a quelques différences partiellement citées en fin de ce document. Appel du terminal Arduino On appelle le terminal en cliquant sur l'icône (1). Une fenêtre s'ouvre et un reset est envoyé pour redémarrer le programme. Cette fenêtre se ferme si on lance une nouvelle compilation. Le driver qui permet la communication avec le PC pour le chargement a été initialisé à une vitesse qui est affichée en (2). C'est cette vitesse qu'il faut spécifier pour mettre en route les transferts. En (3) on a le numéro du com port. En (4) et (5) des options de mise en page (voir note 1) On reparle plus loin du (6). Initialisation et écriture L'instruction Serial.begin(9600); définit dans le setup la vitesse des transferts que notre programme va effectuer. On peut alors écrire des chaînes de caractères (strings) et des nombres d'une façon assez peu commode. Serial.print;("texte")// affiche chaine sans saut de ligne Serial.print(valeur); // affiche une valeur en décimal Serial.print(valeur, DEC); Serial.print(valeur, HEX); Serial.print(valeur, BIN); - attention, les zéros non significatifs sont effacés: (0b00010100,BIN) est affiché 10100 - Serial.println(): l'affichage est suivi d'un saut de ligne Une variante pour introduire un saut de ligne est d'utiliser le caractère \n, Ceux qui ont appris le C++ sur écran connaissent une plus grande richesse de signes, non supportés par Arduino. Serial.print(27,BIN); Serial.print(" "); Serial.print(val,DEC); L'affichage d'une variable dépends de son type char x = 'A' Serial.print(x); A Serial.print(val,DEC); 65 byte y = 'A' Serial.print(y); 65 unsigned char z = 'A' Serial.print(z); 65 int y Code ASCII (table complète sous www.didel.com/AsciiCode.gif ) //TestSerie.ino Différents formats void setup() { Serial.println(val,HEX); Serial.begin(9600); Serial.println("com\npte "); } for (byte i=0;i<15;i++) { int val = 45 ; Serial.print(i); void loop() { } Serial.print(val,BIN); while (1) {} Serial.print(" "); Serial.print(val,DEC); Les zéros non significatifs sont supprimés Serial.print('\n'); A noter que BIN=2 DEC=10 et HEX=16. Voulez avoir le résultat en base 3? (28,3) affiche 1001 ( les poids en base 3 sont 1 3 9 27 …) Envoyer depuis le clavier Le code Ascii des caractères que l'on tape sur le clavier va dans une mémoire tampon et la fonction Serial.available() donne le nombre de bytes en attente dans le tampon. La ligne supérieure du terminal (6) reçoit les caractères à transmettre, mais il faut - cliquer le début de la ligne pour avoir le curseur - taper le ou les caractères à transmettre - cliquer sur Send ou touche Return Lire le caractère avec Serial.read(); Exemple: //TestSerialread.ino void setup() { Serial.begin(9600); } char codeRecu ; void loop () { if (Serial.available() > 0) { codeRecu = Serial.read(); Serial.print ("J’ai tape: "); Serial.print (codeRecu); Serial.print (" "); Serial.print (codeRecu,DEC); Serial.print (" = 0x"); Serial.print (codeRecu,HEX); Serial.println (); } } La cacade en bas d'écran (CR et son code) disparaît si vous mettez le mode "no line ending" en (5) Lire un paramètre Ce qui est essentiel, pour le déverminage en pour plusieurs applications, c'est de pouvoir taper un nombre et modifier une variable. C'est documenté dans un recoin bien caché d'Arduino, que l'on trouve en tapant "Arduino parse" ou "parseint" // TestParse.ino Affiche le nombre tapé // essayez 15, -1, 256, …, changez de type void setup() { Serial.begin(9600); } byte valeurIn; void loop() { if (Serial.available() > 0) { valeurIn = Serial.parseInt(); Serial.print(valeurIn); Serial.print(" Serial.println(valeurIn,HEX); } } "); Qu'est-ce qui sera affiché au Return? 0 on est en 8 bits! (remarquez aussi la lenteur de l'exécution!) A noter que l'on peut aussi utiliser un while, les caractères sont envoyés tous en même temps. Lire plusieurs paramètres Les nombres que l'on entre peuvent être séparés par un espace ou une virgule, et terminés par le Return ou Send (mais s'il y a un espace avant le return, c'est comme si on a un nombre de plus). Dans le programme, on lit les paramètres en suivant: if (Serial.available() > 0) { red = Serial.parseInt(); green = Serial.parseInt(); blue = Serial.parseInt(); Serial.write () Cette fonction semble identique à Serial.print, mais elle rend la longueur de la chaîne de caractère transmise. Gestion du tampon Des fonctions de gestion du tampon sont utiles pour des applications dans lesquelles il faut récupérer des comportements inattendus. Chercher serial.Flush Terminal sur Pinguino Ce document ancien correspond au Pinguino9-05: www.didel.com/diduino/SerialMonitor.pdf Terminal sur Energia La compatibilité avec Arduino semble bonne. Linux Les transferts avec Energia sous Linux posent parfois problème. jdn 131113/16/20140518