Liaison série |
||
Noms : | ||
Centre d'intérêt : | CI 2 Instrumentation / Acquisition et restitution de grandeurs physiques | |
Classe : | Term Sti2d Sin | |
Id programme : | sin15, sin31 | |
Conditions : | Seul , durée 3 heures. | |
Matériel : | - un ordinateur; | |
Logiciel : | - Arduino IDE; - Proteus - Utiliser le navigateur chrome; |
|
Document : |
I. Objectifs
- Découvrir la liaison série;
- Savoir coder en Ascii.
II. Introduction
On vous demande d'étudier le concept de gestion distante du module NetAtmo. Celui-ci doit pouvoir communiquer directement avec une application mobile.
On désire commander et afficher les grandeurs mesurées à l'aide d'un appareil mobile par une liaison Bluetooth.
Le module utilisé est un circuit HC06, qui communique directement en Série par un circuit UART avec la carte Arduino en interne.
Il nous faut donc dans un premier temps comprendre ce qu'est une communication en série, et ce par une série d'expériences et de simulations pour ensuite mettre en œuvre le module.
Se pose alors plusieurs problématiques auxquelles nous allons répondre à travers différents TP mettant en œuvre le principe de la communication interne des modules puis entre systèmes externes :
- Comment transmettre des informations sur une liaison en série entre les modules d’un même système ?
- Comment interpréter et mettre en œuvre un protocole de communication entre deux systèmes distants ?
III. CODAGE D'UNE TRAME UART* PAR LA LIAISON SÉRIE
Schéma Structurel : Le schéma de simulation à réaliser est le suivant :
communication.DSN
Broche TXD: signal de communication Série (en sortie) pour la transmission des informations
* pour Universal Asynchronous Receiver Transmitter, est un émetteur-récepteur asynchrone universel
Programmation de la communication : Le programme à écrire sous Arduino est le suivant
communication.ino
• Réalisez le schéma sous PROTEUS ISIS et écrire le programme sur ARDUINO. Enregistrez le schéma et le programme dans le dossier M:\Travail\...\CI3-Comment circule …\TP\ETAPE1-Apprentissage\Simulation\
QUESTION 1 : Compilez puis chargez le programme .hex dans le module Arduino UNO sous ISIS. Lancez ensuite la simulation et réglez l'oscilloscope afin d'obtenir la visualisation suivante du signal TxD:
☞ Complétez les valeurs BINAIRES lues dans la Trame de DONNÉE et recherchez à partir de la table ASCII (cf document ressource) le caractère correspondant :
QUESTION 2 : Recherchez le codage Binaire ASCII du caractère 'U' et complétez le tableau.
Reportez également en dessous la valeur Binaire DONNÉE lue sur l'oscilloscope.
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
|
Caractère 'U' |
||||||||
DONNÉE lue |
☞ Que constatez-vous ? Analysez dans quel ordre est envoyée un octet (octets D7 à D0) sur une liaison Série UART.
☞ Complétez les informations transmises lors de l'envoie d'un caractère codé sur un octet :
QUESTION 3 : Modifier votre programme Arduino pour envoyer cette fois-ci non plus un Caractère mais une chaine de caractère : "UN" ⇨ Serial.print("UN");
☞ Réglez l'oscilloscope ainsi afin de visualiser la trame transmise , et lancez la simulation
☞ tracez le chronogramme de TxD en identifiant les bits à 1 (5V) et les bits à 0 (0V) :
☞ Identifiez sur le chronogramme chaque bit transmis en les nommant : S (START), P (STOP), D7, D6, D5, D4, D3, D2, D1 et D0
☞ Quel est le premier caractère transmis ? Combien de bits START et STOP seront utilisés si l'on envoie le message "STI2D-SIN" en série UART ?
☞ Quelle sera la longueur en bits de la transmission série du message "STI2D-SIN" ?
IV. LIAISON ASYNCHRONE : NOTION DE VITESSE DE TRANSMISSION
☞ Modifiez le programme afin d'envoyer le message "STI2D". Vérifiez que le message s'affiche bien dans le terminal de debogage.
☞ Modifiez la valeur 9600 par 4800 dans la fonction Setup() :
QUESTION 4 : Que remarquez-vous au niveau de la réception des messages dans le terminal de débogage ?
☞ Arrêtez la simulation et double-cliquez sur le Terminal de debogage. Modifiez la valeur "Baud rate" en la mettant également à 4800.
QUESTION 5 : Relancez la simulation. Que remarquez-vous au niveau de la réception des messages dans le terminal de débogage ?
CONCLUSION : Quelle est la condition indispensable dans une liaison ASYNCHRONE entre un émetteur et un récepteur pour que les messages soient lisibles ? ("Baud Rate" correspond au paramètre vitesse de transmission, exprimé en bit/sec)
V. LES CARACTERES DE CONTROLE
☞ Modifiez le programme afin d'envoyer le caractère 'U' à 9600 bauds. Vérifiez que le caractère s'affiche bien dans le terminal de débogage.
☞ Ajouter l'envoie du caractère '\r' après l'envoi du caractère 'U'. Le caractère '\' (slache) est obtenu est appuyant simultanément sur la touche Alt Gr et 8 :
QUESTION 6 : Relancez la simulation. Quelle modification au niveau de la réception des messages dans le terminal de débogage a apporté l'envoi de '\r' ?
QUESTION 7 : Retrouvez sur la trame de votre oscilloscope le code ASCII du caractère '\r'. A partir de la table ASCII en annexe, donnez le nom, la valeur Hexadécimale et le rôle de ce caractère de contrôle :
Caractère de contrôle '\r' :
Hexa : $ .............
Nom : .................................. Rôle : .......................................................................................
☞ Supprimer l'envoie du caractère '\r'. Modifiez ensuite le schéma Proteus ISIS en ajoutant le module COMPIM. Relier la broche TXD sur le signal TxD de la broche 1 d'Arduino et paramétrez le module ainsi (double-click ou click Droit + Editer propriétés) :
☞ Lancez le logiciel "Terminal.exe" (répertoire L:\LOGICIELS\SIN\ ) et paramétrez le ainsi :
COM4, 9600 bauds, 8 bits de données, 1 bit de STOP, pas de parité, pas de controle
☞ Connectez le logiciel TERMINAL au port COM4 et vérifiez que le caractère 'U' s'affiche bien dans le terminal de réception :
☞ Ajoutez dans le programme Arduino l'envoie du caractère '\t' après la transmission du caractère 'U'.
QUESTION 8 : Relancez la simulation. Quelle modification au niveau de la réception des messages dans le logiciel TERMINAL a apporté l'envoi de '\t' ?
QUESTION 9 : Retrouvez sur la trame de votre oscilloscope le code ASCII du caractère '\t'. A partir de la table ASCII en annexe, donnez le nom, la valeur Hexadécimale et le rôle de ce caractère de contrôle :
Caractère de contrôle '\t' :
Hexa : $ .............
Nom : .................................. Rôle : .......................................................................................
☞ Modifiez le programme Arduino en remplaçant la méthode .print par la méthode .println :
☞ Connectez le logiciel TERMINAL au port COM4 et vérifiez que le caractère 'U' s'affiche bien dans le terminal de réception.
QUESTION 10 : Relancez la simulation. Quelle modification au niveau de la réception des messages dans le logiciel TERMINAL a apporté l'usage de la fonction .println ? à quel caractère de contrôle correspond cette méthode ?
CONCLUSION :
Il est donc possible d'envoyer des caractères de contrôle, non visibles, en série avec Arduino. Soit nous envoyons directement la valeur DECimale, HEXAdécimale ou BINaire, soit nous passons par la commande \<x> en remplaçant <x> par un caractère bien spécifique
Le tableau ci-dessous regroupe l'ensemble des caractères de contrôle utilisable sous Arduino avec la commande \<x> :
Seq |
Dec |
Hex |
Acro |
Symb |
NOM |
C |
Description |
^@ |
00 |
0x00 |
NUL |
␀ |
Null |
\0 |
À l'origine utilisé pour permettre de laisser une absence (un gap) sur les bandes de papier pour modification ultérieure. Plus tard utilisé pour combler la suite d'un code nécessitant au terminal un temps de traitement (par exemple le temps d'un retour chariot ou d'un retour à la ligne sur un terminal imprimant). Il est maintenant souvent utilisé comme terminateur de chaîne de caractères, spécialement dans le langage de programmation C. |
^G |
07 |
0x07 |
BEL |
␇ |
Bell |
\a |
À l'origine utilisé pour faire tinter la cloche du terminal. Ensuite utilisé pour produire un court signal sonore (beep) sur des systèmes n'étant pas dotés d'un timbre physique. Par la suite, en mode silencieux, l'avertisseur peut attirer l'attention sous forme de flash en activant et désactivant l'inverse video (visual bell / cloche visuelle), le temps d'un éclair. |
^H |
08 |
0x08 |
BS |
␈ |
Backspace |
\b |
Déplacement du curseur d'une position vers la gauche. En entrée, cela peut détruire le caractère précédent (à gauche, le sens d'écriture étant de gauche à droite). En sortie, alors qu'avec les premières technologies, une caractère imprimé ne pouvait plus être effacé, le retour arrière (backspace) était parfois utilisé pour générer des caractères accentués en ASCII. Par exemple, à pouvait être imprimé en utilisant la séquence des trois multiplets ASCII a BS ` (0x61 0x08 0x60). Cet usage est maintenant désuet et généralement n'est plus pris en charge. Pour permettre une levée d'ambiguïté entre les deux usages potentiels du backspace', le code de contrôle caractère d'annulation (cancel character) a été intégré dans le jeu de contrôle C1. |
^I |
09 |
0x09 |
HT |
␉ |
Tabulation |
\t |
Positionne le caractère suivant dans une colonne de type tab stop (tabulation). |
^J |
10 |
0x0A |
LF |
␊ |
Line Feed |
\n |
Sur les machines à écrire, imprimantes, et certains émulateurs de terminaux déplace le curseur vers le bas d'une rangée sans modifier la position colonne. Sur Unix, utilisé pour indiquer la fin de ligne ([end- of-line). Sous MS-DOS , Windows , et des standards réseaux variables, la caractère de contrôle LF est utilisé immédiatement après CR comme partie composante de la fin de ligne. |
^K |
11 |
0x0B |
VT |
␋ |
Line Tabulation |
\v |
Positionnement sur la prochaine ligne de tabulation. |
^L |
12 |
0x0C |
FF |
␌ |
Form Feed |
\f |
Sur imprimante, charge la page suivante. Traité comme espace dans beaucoup de langages de programmation, peut être également utilisé pour séparer différentes divisions du code. Sur certains émulateurs de terminal, efface l'écran. |
^M |
13 |
0x0D |
CR |
␍ |
Carriage Return |
\r |
À l'origine utilisé pour positionner le curseur en première colonne en restant sur la même ligne. Sur Mac OS (pre-Mac OS X ), ainsi que sur d'autres systèmes anciens comme l' Apple II et le Commodore 64 , utilisé pour indiquer la fin de ligne. Sous MS-DOS , Windows , et des protocoles réseaux voisins, est utilisé immédiatement avant LF pour former une marque de fine de ligne. La touche [Entrée] (ou [Retour]) d'un clavier envoie cette valeur qui peut être différente suivant le logiciel impliqué. |
Source : https://fr.wikibooks.org/wiki/Les_ASCII_de_0_%C3%A0_127/Caract%C3%A8res_de_contr%C3%B4le
VI. LECTURE DE CARACTERES
☞ Modifiez le programme Arduino en écrivant les lignes de commande suivantes dans la partie Loop ( ) du programme :
☞ Modifiez le schéma de simulation sous PROTEUS ISIS en connectant la broche RXD du module COMPIM à la broche 0 ( RxD ) de l'Arduino UNO :
☞ Connectez le logiciel TERMINAL au port COM4 et tapez dans la zone de TRANSMISSION des caractères (Exemple : Spécialité STI2D - SIN )
QUESTION 11 : Que remarquez-vous dans la zone de RECEPTION du logiciel TERMINAL lorsque vous tapez du texte ?
QUESTION 12 : Quel est à votre avis le rôle de la méthode Serial.read() dans le programme ? Quel type de variable renvoie cette fonction ?
QUESTION 13 : Quel est à votre avis le rôle de la méthode Serial.available() dans le programme ?
QUESTION 14 : Que se passe-t-il si l'on change la temporisation entre chaque boucle de 20 ms à 400 ms ?
☞ Créez la procédure de réception serialEvent() et déplacez le code de réception de la fonction Loop() vers cette nouvelle fonction. Surtout LAISSEZ la temporisation de 400 ms :
QUESTION 15 : Relancez la simulation. Qu'elle amélioration a-t-on apportée au système par rapport à la question 14 ?
VIII. COMMANDER À DISTANCE LE MODULE ARDUINO : UTILISATION DE CHAINES
☞ Modifiez le programme Arduino en écrivant les lignes de commande suivantes dans la partie serialEvent ( ) du programme :
☞ Modifiez le schéma de simulation sous PROTEUS ISIS en connectant une LED jaune sur la broche 7 de l'Arduino UNO :
☞ Entrez les chaines de caractères "ON" et "OFF" dans le champ de saisie M1 et M2 du logiciel TERMINAL :
☞ Lancez la simulation et connectez le logiciel TERMINAL sur le port COM4.
QUESTION 16 : Cliquez sur le bouton M1. Quel changement s'est opéré sur le simulateur ISIS ?
………………....………………………………………………..………………....………………
QUESTION 17 : Cliquez sur le bouton M2. Quel changement s'est opéré sur le simulateur ISIS ?
QUESTION 18 : Expliquez le rôle de ces lignes de commande :
1 if(readString == "ON"){
2 digitalWrite(7,HIGH);
3 Serial.println("LED ON");
4 readString = "";
}
QUESTION 19 : Expliquez le rôle de cette ligne de commande :
readString = readString + caractere ;
QUESTION 20 : Pourquoi doit-on passer par une variable de type String (chaine de caractères) pour interpréter les commandes envoyées par le logiciel TERMINAL ?
VIII. PROTOTYPAGE
☞ Réalisez le schéma de câblage de la carte Arduino (Commande de la LED) . Transférez le programme Arduino.
☞ A partir du terminal d'Arduino, essayez depuis le PC d'allumer et d'éteindre la LED
♦ AMÉLIORATION DU PROGRAMME : UTILISATION DE LA MÉTHODE indexOff( )
☞ Reprenez votre schéma de simulation et lancez la simulation. Lancez le logiciel terminal.exe et entrez la commande "ON" dans M1 et cette fois-ci une commande « erronée » ("OFFF") pour M2 :
☞ Cliquez sur M1 et vérifiez que la LED s’allume sur votre schéma de simulation :
☞ Cliquez ensuite sur M2. Que constatez-vous ?
☞ Corrigez la commande M2 en remettant « OFF », puis cliquez ensuite sur M2. Que constatez-vous ?
☞ Modifiez votre programme afin d’ajouter la transmission du contenu de readString au Terminal lors de la réception des caractères de commande :
QUESTION 21 Répétez la même opération : ON → OFFF → OFF. Que constatez-vous sur le contenu de ReadString ?
QUESTION 22 Pourquoi alors le programme Arduino ne peut-il interpréter aucune commande à partir du moment où une erreur de transmission des commandes est faite ?
☞ Modifier votre programme en utilisant la méthode .indexOf("ON")> -1 et .indexOf("OFF")> -1 à la place de =="ON" et =="OFF" dans le programme principal Loop :
QUESTION 23 Exécutez la série de commande suivant : ON→OFFF→POWERON→ BLOFF. Que constatez-vous sur l'interprétation des commandes par Arduino ? Quelle est le rôle de la méthode .indexOf( <chaine>) de l'objet readString ?
Source : http://www4.ac-nancy-metz.fr/sti2d