Mention légal| Contact

Envoyer et recevoir des données au moniteur série.

Envoyer et recevoir des données au moniteur série.

Introduction.

Le but de ce projet  et d'envoyer et recevoir des données au moniteur série. Pour cela, seule une carte arduino nous est utile avec un cordon USB.

Lançons le moniteur série et configurons le.

Puis dans le compilateur, configurons le débit de transmission de la carte Arduino.

Nous avons utilisé la classe Serial. avec la fonction begin(); que nous avons renseigné avec la valeur 9600 baud de transmission. Les deux périphériques fonctionnent à la même vitesse.

Recevoir des données.

Voilà, tout est prêt pour la communication. Commençons par recevoir au moniteur des données envoyées par la carte Arduino.Pour cela, nous utilisons la fonction println();

println();

println(); envoie les données vers le moniteur série avec un saut à la ligne . Ici notre donnée est une phrase placée entre les guillemets ces derniers sont utiles pour ce type de données qui sont des caractères alphabétiques. Ci-dessus, nous testons notre communication.

Téléversons notre programme et voyons le résultat.Le moniteur affiche la phrase ! Notre communication est bonne.

Le code A.S.C.I.

Vous constaterez ci dessus que nous avons volontairement négligé les accents sur les «e» . Cela est dû au fait que les caractères alphabétiques sont organisés par un code conventionné, appelé ASCII = American Standard Code for Information Interchange*. Mais les accents sont « exclus » de ce code.

* Il est possible de trouver des extensions de code ASCII qui incluent les caractères spéciaux.

ASTUCE: Pour connaître le code ASCII des lettres majuscules ou minuscules: il faut retenir que "A" majuscule vaut 65 points et que l'écart avec la lettre "a" minuscule est de 32 points, soit "a" minuscule correspond à 65+32 = 97 en code ASCII. Les caractères se suivent dans le tableau.

Afficher le résultat d'un petit calcul.

Nous allons maintenant demander d'afficher le résultat d'un petit calcul avec une phrase complémentaire. Il n'est pas permis de mélanger les types de données dans la fonction print(); il nous faudra donc faire plusieurs appels de cette fonction pour chacun d'eux.
05 moniteur serie E-R pgm calculNous déclarons trois variables. Deux pour le calcul et une pour le résultat. Puis nous réalisons le produit de nos deux variables, pour stocker le résultat dans la variable prévue à cet effet. Nous affichons ensuite une phrase complémentaire suivie de la valeur du résultat et d'un saut à la ligne suivante sous une autre méthode avec l'intégration de \n en fin de phrase.

NOTE:
Dans nos phrases chaque mot est espacé, il est donc possible de mettre des espaces en fin de phrase pour créer un espace avec la donnée suivante.

Téléversons les ajouts et voyons le résultat.L'affichage défile et est illisible a cette vitesse !!! Nous pourrions temporiser cela mais cela ne serais pas une solution confortable.

Exploitation du moniteur pou la mise en forme visuelle de l'affichage.

Il y a deux raisons à cela. La manière dont on a envoyé les données et le fait que ces dernières sont envoyées à chaque cycle d’exécution de la fonction loop(). Si l'on souhaite stopper le défilement, il faut décocher la case en-bas à gauche.

Mointeur série coche defilement

Note: Le défilement représente chaque cycle de passage dans la boucle loop().

Une fois l'affichage stoppé, on constate qu'il nous manque des sauts de lignes pour que cela soit correctement lisible.  Installons des sauts de lignes vierges avec println(); entre chaque exécutions et ajoutons une temporisation avec la fonction delay(); qui aidera à la lecture des données transmises.

NOTE: Il vous sera utile de ralentir le défilement du moniteur série par la mise en place de delay(); qui arrêtera temporairement le cycle du programme et vous permettra de comprendre son évolution ou de cibler ces dysfonctionnement (Débogage).

Nous avons en fin de programme nos deux instructions. Téléversons les ajouts et voyons le résultat.

Stoppons le défilement et revenons au début. On retrouve nos espaces et l'inter-ligne. C'est déjà plus lisible !!

Astuce: Pour un programme qui n'effectue qu'une seule et unique action. Il est possible de forcer son arrêt dans une boucle while(); en y inscrivant 1. while(1);*. Cela permet d'avoir une page dégagée et plus de confort visuel. C'est également utile pour rechercher des dysfonctionnement dans des séquences d'un programme. (débogage) Mais le mieux pour des tests ou des exemples est de l’inscrire dans le setup().

Installons cette instruction à la fin du programme suivant. Téléversons et voyons le résultat.Nous y voyons déjà plus clair !!

Manipuler les format de données

A présent que l'affichage est ordonné, nous allons manipuler notre résultat. Il serait utile de pouvoir convertir l'affichage de cette donnée et de voir quelle est sa valeur.

Il y a trois types de format de données que l'on peut exploiter.

  • Le décimale DEC. Le système décimale est un système en base 10 (avec les chiffres de 0 à 9). 
  • L’hexadécimale HEX. L'hexadécimale en base 16 avec les chiffres de 0 à 9 en plus des lettres de A à F qui représentent les valeurs de 10 à 15.
  • Le binaire BIN. Le système binaire en base 2 avec les chiffres 0 et 1 seulement. (mais à lui seul a permis le montage de système complexe que l'on connaît)

Nous ne rentrerons pas dans le détail de chaque format. Il est nécessaire ici de connaître l'exploitation possible de ce type de format.

Pour afficher une donnée dans un format voulu, il suffit de l'indiquer avec une virgule "," dit opérateur séquentiel dans la fonction print();

Ça se présente sous cette forme (Exemple).

Serial.print(variable opérateur séquentiel format);51 moniteur serie format variableVoici le résultat au moniteur.

51 moniteur serie affichage format variableL'utilisation de l'affichage sous un format différent est parfois utiles pour un traitement plus lisible de données binaires vers l'hexadécimale.

Envoyer des données.

Nous avons vu comment envoyer des données vers le moniteur. Maintenant nous allons envoyer des données vers la carte Arduino.

moniteur série donnée bouton envoyéPour envoyer des données vers la carte nous avons une zone de saisie de données et un bouton.

Fonctions  available() et read().

Pour cela, nous allons utiliser deux autres fonctions de Serial. Tout d'abord comme dans toute communication, il va falloir dire à la carte que l'on s'adresse à elle.

available() va contrôler si des données sont présentent dans le buffer*. Dans ce cas, on les lira avec la fonction read() qui va récupérer les données dans le buffer. C'est l'acquisition de la donnée qui vient d'être faite.

*Buffer: Mémoire tampon de stockage de données pour le transfert.

read() récupère les données une à une dans le buffer. Il faudra répéter son action de lecture tant qu'il y a des données dans le buffer. L'utilisation de while() nous permettra de réaliser cette opération. Il faut savoir également que read() efface du buffer la donnée qu'il vient de lire.

Créons une variable qui va récupérer les données et mettons en place
les fonctions dans notre programme.La présence de données est contrôlée par Serial.available(). La fonction retourne « true » (1) si des données sont présentent dans le buffer. Ensuite la fonction read() s'occupe de lire dans le buffer et de charger les données dans la variable « acquis_donnees » .

NOTE: Ici delay() apporte une stabilité de traitement des données. Sans cela, il y a un risque d'un affichage erroné.

Téléversons les modifications et voyons le résultat avec l'envoi du mot Arduino.Que s'est-il passé ? Il nous retourne que des chiffres !

Le type char

Se sont les valeurs de code ASCII qui correspondent à chaque lettre du mot Arduino. Ces chiffres correspondent à ce qui a été envoyé par le moniteur pour transférer les données vers la carte. Cette dernière nous les a simplement retourné sous le format entier int de la variable dans laquelle elles ont été stockées.

Si l'on souhaite avoir un retour de notre envoi par des lettres, il faut faire la conversion inverse. Sauf qu'une conversion n'est pas intéressante car nous avons le type char qui prend en charge les caractères alphabétiques. Il nous faut donc changer le type de déclaration de la variable acquis_donnees.

moniteur série donnée type charRenvoyons le mot arduino.

Afficher ce mot sur une ligne, c'est possible. Comme on le voit sur le moniteur chaque lettre du mot est une donnée lue à chaque lecture de read().

La première solution est de retirer les sauts de lignes après l'affichage de la donnée et supprimer la phrase complémentaire à l'aide des barres obliques //.Cela nous donne.

Envoyer une chaine de caractères.

Vous constaterez que les lettres s'affichent une à une comme précédemment. C'est dû  au traitement de notre acquisition qui s'effectue via notre variable de type char. Il nous faudrait stocker une à une les lettres de notre mot dans une variable; mais le type char n'a de place mémoire que pour des caractères alphabétiques seuls. Il ne permet pas de stocker un mot ou une phrase qui sont trop volumineux pour l'espace mémoire alloué. Une suite de lettres alphabétiques dans un mot ou une phrase est appelée chaîne de caractères.

String

Il existe une classe String qui contient suffisamment de place mémoire pour des chaînes de caractères.

Comment utiliser String ?
String est une classe qui regroupe plusieurs fonctions utiles à l'exploitation des chaînes de caractères. A la différence de Serial, pour faire appel à l'une de ses fonctions, il faut lui attribuer un  objet  . Un  objet : c'est comme une variable mais pas vraiment. Il nous faut la nommer judicieusement en fonction de son utilisation.

Voici comment attribuer un objet, qui ne sera utile uniquement pour la classe String
à laquelle il est rattaché. Dans le jargon, on dit faire une instanciation*.

*Instanciation :  L'instance d'une classe est faite par l'affectation d'un objet qui lui est propre à son exploitation.

chaineCaractere; est notre objet, une instance de String.

Comme nous l'avons vu plutôt on récupère les données une à une. Donc par le biais d'une addition nous stockerons une à une les données reçues dans l'objet.

moniteur série donnée solution 2 chargement donnéeN'oublions pas de réinstaller notre phrase complémentaire et le saut de ligne en fin d'affichage de données. Il nous faut à présent afficher notre objet chaineCaractere à la place de acquis_donnees

moniteur série donnee solution 2Téléversons nos modifications et envoyons le mot Arduino.Le résultat est volontaire, c'est pour vous montrer comment se déroule l'acquisition et ce qu'il se passe à chaque cycle de while().

Mise en forme de l'affichage des données.

Pour un affichage complet de notre envoi, il nous faut sortir de la boucle while() l'affichage de notre objet . Par conséquent, il se retrouve dans le programme principal loop() et notre phrase complémentaire risque d’être afficher en continu. Donc pour éviter cela nous allons conditionner l'affichage sur la présence de données contenues dans notre objet.moniteur série donnée hors whileNOTE rappel: delay() dans la boucle sera à présent seulement utile pour apporter une stabilité de traitement des données. Sans ça, il y a un risque d'un affichage erroné.

Téléversons les modifications et voyons le résultat avec l'envoi du mot Arduino.Voici un résultat plus satisfaisant ! Nous avons un bel outil qui nous permet de retourner une phrase au moniteur. Amusez-vous avec d'autres mots et phrases.

moniteur série donnée affichage belle outilPetit plus: Pour l'affichage des données avec String, il est possible de le faire avec une seule ligne d'instruction à l'aide d'un "+" en fin de phrase. Vous comprendrez que cela est faisable par le traitement de type de données identiques. Voyez ci-dessous.

moniteur série donnée string une seul ligneLes fins de lignes de données ?

Nous allons voir à présent l'importance que le moniteur porte au saut de ligne et fin de ligne. Nous avons vu précédemment que le code ASCII régie la transmission des données. Pour traiter les données en fonction des sauts ou fins de lignes, il nous faut connaître le code ASCII des sauts de lignes et fins de lignes. Celui de fin de ligne "LF - Line feed" vaut 10 en code ASCII.
Nous allons donc contrôler la présence du code 10 dans la réception des données transmises pour afficher un message.

moniteur série donnée code 10Assurez-vous que le paramètre de ligne du moniteur soit sur "Pas de fin de ligne" (nous verons pourquoi plus tard).

Téléversons les modifications et envoyons le mot Arduino.

Rien ne se passe ! C'est normal . Cela pour comprendre que les fins de lignes sont générées par le moniteur lui-même lors d'une transmission de données. Pour Activer les fins de lignes, il faut changer le paramètre d'envoi de données sur "nouvelle ligne"

Mointeur série bouton défilementEssayez avec le mot Arduino.

Cela fonctionne. Et l'on comprend maintenant que le moniteur peut être configuré pour traiter des envois de données sur des fins de lignes ou pas. Si vous appuyez simplement sur "entrée" ou le bouton "envoyé" vous envoyez des données vierges.

50 moniteur envoi-reception vierge

Je vous propose un petit jeu !!

Amusons-nous à distinguer chaque mot d'une phrase !!!!
Pour cela nous allons faire la même chose que pour les sauts de lignes, sauf que cette fois, se sont les espaces entre chaque mot que nous chercherons.

Dans le tableau ASCII l'espace "space" vaut 32.
Nous avons également besoin de savoir quand vient le saut de ligne 10 pour le dernier mot de la phrase qui ne dispose pas forcément d'un espace. Intégrons cette dernière valeur dans notre condition de  contrôle.

Nous aurons aussi besoin d'un objet "chaineCaractere2" supplémentaire pour décomposer notre phrase. Il va nous falloir réinitialiser à zéro (vider) notre nouvel objet à chaque détection d'espace pour afficher seulement le mot suivant entre espace. En utilisant la boucle while() tant que des données sont présentes.

52 moniteur serie separation 32+10Téléversons nos modifications et voyons le résultat avec une phrase de plusieurs mots.53 moniteur serie affichage 32+10Cela fonctionne mais prenez garde au paramétrage du moniteur car en mode "pas de fin de ligne" le dernier mot ne sera pas affiché, si vous n'y ajoutez pas d'espace. Le mode "nouvelle ligne" est approprié à l'utilisation de ce sketch.

Il existe de multiples fonctions de String utiles pour le traitement des chaînes de caractères.

Vous avez exploré les bases pour traiter l'envoi et la réception de données au moniteur série. Nous avons atteint le but de ce projet. Il y a beaucoup de manière d'utiliser le moniteur série. Vous le découvrirez au fur et à mesure de votre progression.

FIN.

Téléchargez les codes sources référent à ce sujet. Merci.


Recevez gratuitement les codes sources de PlaisirArduino

Amusez-vous tout de suite avec les entrées/sorties de votre carte Arduino Uno

Vous y retrouverez : des scketchs, des schémas et des PDF