Ignorer la navigation

III. Communications informatiques: 2. Exemple N°1 : la liaison série (RS232 et Arduino)

La liaison série va permettre de faire communiquer 2 appareils (ordinateurs, capteurs, …).

Des liaisons séries, il en existe beaucoup (RS-232, Universal Serial Bus (USB), Serial ATA, SPI, …). Nous allons nous intéresser à la RS-232, qui est très répandue ainsi qu’à la version présente  sur les cartes micro-contrôleur Arduino.



Pour communiquer via la voie série, deux dispositifs doivent avoir 3 câbles minimum.

  • le premier câble est la référence électrique, communément appelée masse électrique. Cela permet de prendre les mesures de tension en se fixant un même référentiel. Dans notre cas, on considérera que le 0V sera notre référentiel électrique commun.
  • Les deux autres câbles permettent la transmission des données. L’un sert à l’envoi des données pour un émetteur, mais sert aussi pour la réception des données venant de l’autre émetteur. Idem pour l’autre câble. Il permet l’émission de l’un et la réception de l’autre.



Il s’agit du strict minimum. La norme n’interdit pas l’utilisation d’autres câbles qui servent à faire du contrôle de flux et de la gestion des erreurs.

La vitesse de transmission de l'émetteur doit être identique à la vitesse d'acquisition du récepteur. Ces vitesses sont exprimées en BAUDS (1 baud correspond à 1 bit par seconde). Il existe différentes vitesses normalisées: 9600, 4800, 2400, 1200... bauds
La communication peut se faire dans les deux sens (duplex), soit émission d'abord, puis réception ensuite (half-duplex), soit émission et réception simultanées (full-duplex)
La transmission étant du type asynchrone (pas d'horloge commune entre l'émetteur et le récepteur), des bits supplémentaires sont indispensables au fonctionnement: bit de début de mot (start), bit(s) de fin de mot (stop).

Le principal intérêt de la communication série est le nombre de fils réduits: la communication la plus simple peut être faite sur 3 fils (Tx, Rx et masse).




1.1. Le signal électrique et le protocole

Avant tout, il faut savoir que pour communiquer, deux dispositifs électronique ou informatique utilisent des données sous forme de bits. Ces bits sont des états logiques (vrai ou faux, 0 ou 1) qui peuvent être regroupés pour faire des ensembles de bits. Quand ces ensembles de bits sont constitués de 8 bits ils forment alors un octet. Jusqu’ici rien de nouveau !

Les tensions utilisées

Ces bits sont en fait des niveaux de tension électrique. Et la norme RS-232 définit quelles tensions doivent être utilisées (ici norme V28 présente sur les ordinateurs) :

Niveau logique 0

Niveau logique 1

Tension électrique minimale

+3V

-3V

Tension électrique maximale

+25V

-25V


Ce qui donne : -3v > 1 logique > -25v   et   +3v < 0 logique < +25v


En général on obtient :


On note que les tensions comprises entre +3V et -3V sont ignorées car c’est dans ces zones là que se trouvent la plupart des parasites. C’est un moyen permettant d’éviter un certain nombre d’erreurs de transmissions.
C’est aussi un moyen de contrôler que la liaison physique (les fils) est correcte : lorsqu’il n’y a pas de communication sur la voie série, il y a ce qu’on appelle un état de repos. C’est à dire un niveau logique toujours présent. Il s’agit du niveau logique 1. Soit une tension comprise entre -3V et -25V. Si cet état de repos n’est pas présent, c’est qu’il peut y avoir un problème de câblage (fil coupé, …).




Les données

Les données qui transitent par la voie série sont transmises sous une forme numérique (binaire). C’est à dire avec des niveaux logiques 0 et 1. Prenons une donnée que nous voudrions envoyer, par exemple la lettre « P » majuscule. Il faut savoir qu’une lettre du clavier est codé sur un nombre de 8 bits, donc un octet. Réellement c’est en fait sur 7 bits qu’elle est codée, mais en rajoutant un 0 devant le codage, cela conserve sa valeur et permet d’avoir un codage de la lettre sur 8 bits. Ces codes sont définis selon la table ASCII. Ainsi, pour chaque caractère du clavier, on retrouve un codage sur 8 bits.


En observant la table, on tombe sur la lettre « P » majuscule et l’on voit que sa correspondance en décimal est 80 donc en binaire : 01010000.

L’ordre et les délimiteurs

On va à présent voir comment est transmit un octet sur la voie série en envoyant notre exemple, la lettre « P ».

Pour comprendre suivons l’analogie d’un appel téléphonique :

  • Lorsque l’on passe un coup de fil, bien généralement on commence par dire « Bonjour » ou « Allo ». Ce début de message permet de faire l’ouverture de la conversation. En effet, si l’on reçoit un appel et que personne ne répond après avoir décroché, la conversation ne peut avoir lieu. Dans la norme RS-232, on va avoir une ouverture de la communication grâce à un bit de départ. C’est lui qui va engager la conversation avec son interlocuteur. Dans la norme RS-232, ce dernier est un état 0.
  • Ensuite, vous allez commencer à parler et donner les informations que vous souhaitez transmettre. Ce sera les données. L’élément principal de la conversation (ici notre lettre ‘P’).
  • Enfin, après avoir renseigné tout ce que vous aviez à dire, vous terminez la conversation par un « Au revoir ». Cela termine la conversation. Il y aura donc un bit de fin ou bit de stop qui fera de même sur la voie série. Dans la norme RS-232, c’est un état 1.




C’est de cette manière là que la communication série fonctionne. D’ailleurs, savez-vous pourquoi la voie série s’appelle ainsi ? En fait, c’est parce que les données à transmettre sont envoyées une par une, à la queue leu-leu. Exactement comme une conversation entre deux personnes : la personne qui parle ne peut pas dire plusieurs phrases en même temps, ni plusieurs mots ou sons. Chaque élément se suit selon un ordre logique. L’image précédente résume la communication que l’on vient d’avoir, il n’y a plus qu’à la compléter pour envoyer la lettre « P ».

Donc il y a le bit de start, notre lettre P et le bit de stop. D’après ce qu’on a dit, cela donnerait, dans l’ordre, ceci : 0 (Start) 01010000 (Données) et 1 (Stop).

Eh bien… c’est presque ça. Sauf que les ingénieurs qui ont inventé ce protocole ont eu la bonne idée de transmettre les données à l’envers… Par conséquent, la bonne réponse était : 0(Start)00001010(données)1(Stop) c’est à dire 0000010101. Avec un chronogramme, on observerait ceci :







Un peu de vocabulaire

Les données sont donc envoyées à l’envers. Ce qu’il faut savoir c’est que le bit de donnée qui vient après le bit de start s’appelle le bit de poids faible ou LSB en anglais pour Less Significant Bit. C’est un peu comme un nombre qui a des unités (tout à droite), des dizaines, des centaines, des milliers (à gauche), etc. Par exemple le nombre 6395 possède 5 unités (à droite), 9 dizaines, 3 centaines et 6 milliers (à gauche). On peut faire référence au bit de poids faible en binaire qui est donc à droite. Plus on s’éloigne et plus on monte vers… le bit de poids fort ou MSB en anglais pour Most Significant Bit. Et comme les données sont envoyées à l’envers sur la liaisons série, on aura le bit de poids faible juste après le start, donc à gauche et le bit de poids fort à droite.
Il est donc essentiel de savoir où est le bit de poids faible pour pouvoir lire les données à l’endroit. Sinon on se retrouve avec une donnée erronée !

Pour regrouper un peu tout ce que l’on a vu sur le protocole de la norme RS-232, voici une image d’une trame :



Vous devrez être capable de trouver quel est le caractère envoyé sur cette trame… alors ? Indice : c’est une lettre… On lit les niveaux logiques de gauche à droite, soit 11010010 ; puis on les retourne soit 01001011 ; enfin on compare à la table ASCII et on trouve la lettre « K » majuscule. Attention aux tensions négatives qui correspondent à l’état logique 1 et les tensions positives à l’état logique 0.


La vitesse
La norme RS-232 définit la vitesse à laquelle sont envoyée les données. Elles sont exprimés en bit par seconde (bit/s). Elle préconise des vitesse inférieures à 20 000 bits/s. Sauf qu’en pratique, il est très courant d’utiliser des débits supérieurs pouvant atteindre les 115 200 bits/s. Quand on va utiliser la voie série, on va définir la vitesse à laquelle sont transférées les données. Cette vitesse dépend de plusieurs contraintes que sont : la longueur du câble utilisé reliant les deux interlocuteurs et la vitesse à laquelle les deux interlocuteurs peuvent se comprendre. Voilà ce que dit la norme RS-232 :

Débit (bit/s) - (bauds)

Longueur (m)

2 400

60

4 800

30

9 600

15

19 200

7,6

38 400

3,7

56 000

2,6


Plus le câble est court, plus le débit pourra être élevé car moins il y a d’affaiblissement des tensions et de risque de parasites.


La gestion des erreurs

Malgré les tensions imposées par la norme, il arrive qu’il y ai d’autres parasites et que des erreurs de transmission surviennent. Pour limiter ce risque, il existe une solution. Elle consiste à ajouter un bit de contrôle appelé bit de parité. Juste avant le bit de stop, on va ajouter un bit qui sera pair ou impair. Donc, respectivement, soit un 0 soit un 1. Le paramétrage de la liaison va permettre de choisir une parité paire ou impaire.

Si l’on choisi une parité paire, alors le nombre de niveaux logiques 1 dans les données plus le bit de parité doit donner un nombre paire. Donc, dans le cas ci-dessous où il y a 5 niveaux logiques 1 sans le bit de parité, ce dernier devra prendre un niveau logique 1 pour que le nombre de 1 dans le signal soit paire. Soit 6 au total :




Dans le cas où l’on choisirait une parité impaire, alors dans le même signal où il y a 5 niveaux logiques 1, eh bien le bit de parité devra prendre la valeur qui garde un nombre impaire de 1 dans le signal. Soit un bit de parité égal à 0 dans notre cas :




Après, c’est le récepteur qui va vérifier si le nombre de niveaux logiques 1 est bien égale à ce que indique le bit de parité. Dans le cas où une erreur de transmissions serait survenu, ce sera au récepteur de traiter le problème et de demander à son interlocuteur de répéter.





Le connecteur de la liaison série RS232

Le connecteur utilisé par la norme RS232 est du type DB9 :

On notera la présence des 3 fils obligatoires au minimum : RxD (receive Data), TxD et la masse GROUND mais aussi d’autres possibilités de fils permettant une gestion plus efficace de la liaison série (on ne traitera pas de leur utilisation dans ce cours).







La liaison série de la carte microcontrôleur Arduino.

Prenons l’exemple suivant : le but est de connecter deux microcontrôleurs Arduino ensemble pour qu’ils puissent s’échanger des données.

La tension des microcontrôleurs :

Tension

Niveau Logique 0

0V

Niveau Logique 1

+5V



Contrairement à ce qu’impose la norme RS-232, les microcontrôleur ne peuvent pas utiliser des tensions négatives. Du coup, ils utilisent les seuls et uniques tensions qu’ils peuvent utiliser, à savoir le 0V et le +5V. Il y a donc quelques petits changement au niveau de la transmission série. Un niveau logique 0 correspond à une tension de 0V et un niveau logique 1 correspond à une tension de +5V. Fort heureusement, comme les microcontrôleurs utilisent quasiment tous cette norme, il n’y a aucun problème à connecter deux microcontrôleurs entre-eux même s’ils ne sont pas de même marque. Cette norme s’appelle alors UART pour Universal Asynchronous Receiver Transmitter plutôt que RS232. Hormis les tensions électriques et le connecteur, c’est la même chose !


Croisement de données

Il va simplement falloir faire attention à bien croiser les fils. On connecte le Tx (broche de transmission) d’un microcontrôleur au Rx (broche de réception) de l’autre microcontrôleur. Et inversement, le Tx de l’autre au Rx du premier. Et bien sûr, la masse à la masse pour faire une référence commune.








Exemple 1 : entre 2 cartes arduino


Exemple 2 : entre une carte Arduino et un capteur équipé d’une liaison série:






Exemple 3 : entre une carte arduino et un ordinateur

Le circuit électronique MAX232 va adapter les tensions de la liaison série de l’arduino à la liaison série (RS232) de l’ordinateur.

Remarque : lorsque l’on utilise le moniteur série du logiciel Arduino, la carte et l’ordinateur dialoguent à l’aide de la liaison série. Ils utilisent alors le port USB.

Remarque N°2 : il existe différentes librairies Arduino permettant de gérer les liaisons série (celle qui est standard s’appelle « serial »).

Remarque N°3 : sur la carte Arduino Uno précédente, on a utilisé les broches 0 et 1 qui sont les broches standard de la liaison série. Si on a besoin de plusieurs liaisons série, certaines autres broches peuvent devenir des broches « série » (Tx et Rx). Il faut consulter la documentation pour vérifier lesquelles sont compatible. Attention, tout est différent avec la carte Arduino Mega.