communication

série

Qu'est ce qu'une liaison série

On oppose la liaison série à la liaison parallèle. avec une liaison parallèle on enverra l'information d'un coup en utilisant plusieurs fils alors qu'avec un liaison série il faudra découper l'information pour l'envoyer sous forme de trame.
prenons par exemple un suite de 8bits: 01100111
avec une liaison parallèle je vais utiliser 8 fils pour envoyer les 8 bits d'un coup.
avec un liaison série je vais envoyer le premier caractère, puis le suivant jusqu'au 8ème.
conclusion:
la liaison parallèle va plus vite mais nécessite beaucoup de fils.
la liaison série va moins vite à la même fréquence d'envoi mais utilise peu de fils. pour compenser cet handicape il faudra augmenter le débit.
Aujourd'hui les fréquences sont de plus en plus élevées et on utilise majoritairement des liaisons séries pour leurs facilités de câblage et de mise en oeuvre. Cette présentation est très basique, passe sur beaucoup d'aspects mais c'est ce petit préambule nous permet de passer rapidement à la pratique…

bits et octets

Je ne vais pas rentrer en détail sur l'explication du binaire, des bits et des octets mais surtout de leur utilisation en électronique. Voici un cours pour ceux qui voudrait revoir les bases: https://openclassrooms.com/courses/du-decimal-au-binaire)
En informatique l'utilisation de bits et d'octets se cantonne souvent à quantifier des tailles de fichiers, d'espaces de stockage ou quantifier le débit de données.
En électronique l'utilisation de bits est beaucoup plus présente car chaque broche représente potentiellement un bit et souvent les ports des microcontroleurs possèdent 8 broches soit un octet. attention l'Arduino utilise sa propre numérotation de broches et nous cache ainsi l'appartenance des broches aux port (PORTB, PORTC, PORTD etc…) pour en savoir plus sur les ports : écrire sur tout un port à la fois. la commande suivante vous permettra ainsi d'envoyer un octet sur le PORTD.

PORTD = 15;

15 en décimal donne 00001111 e binaire.
la commande suivante donnera donc le même résultat

PORTD = 0b00001111;

maintenant voyons comment faire si on l'on veut transmettre cette valeur dans un trame.

trame UART

Pour transmettre des données en série il faut les organiser en trame.

introduction

On utilise une liaison série pour échanger des données. Ces données peuvent être des nombres entiers, des nombres décimaux, un caractère, une chaîne de caractères…
Pour transmettre ces données via une liaison série il va falloir les transformer en une série de '0' et de '1'. Comme évoqué ci-dessus ces bits sont regroupés par 8 en octets. toute valeur numérique, alphanumérique, etc, est transformée en octet pour être transmise.certaine valeur ne n'utiliseront 1 seul octet d'autres nécessiteront plusieurs octets.

Imaginez que vous vouliez transmettre 3 octets représentant les caractères 'S' 'O' S'. (on va utiliser ici un tableau dans le lequel chaque caractère correspond à une valeur entre 0 et 255 qui du coup ne prnd qu'un seul octet. tableau des caractères ASCII)
le 'S' en ascii correspond au nombre 123 ce qui donne en binaire: 01111011
le '0' en ascii correspond au nombre 119 ce qui donne en binaire: 01110111
“SOS” donnerait en binaire 011110110111011101111011
Avouez que l'on ne s'y retrouve pas au 1er coup d'oeil… Le problème dans cette trame est que si il y une erreur de reception (il faut penser aux erreurs ;) ) toute la trame va être mal interprétée et on risque de se retrouver avec des surprises à l'arrivée.

Empaquetage...

on va “empaqueter” chaque octet dans la trame pour être sûr que celui sera interprété comme un octet sans risque de décalage. Au pire si il y a une erreur l'octet sera corrompu mais le suivant sera correctement interprété.

MIDI

le sujet va être traité en 2 parties. la partie électronique (brochage, composant à mettre en oeuvre pour envoyer ou recevoir des signaux midi) et la partie programmation (explication des trames, méthodes pour envoyer ou recevoir ces trames)
on va voir ici la partie programmation…

le MIDI (Musical Instrument Digital Interface) est un norme qui a été beaucoup utilisé en musique.
la norme midi est assez complète, très répandue et permet de faire pas mal de choses.

je ne vais entrer dans détails (il des des sites très bien fait sur le sujet) mais plus faire ici une présentation ultra-rapide et très simplifiée pour vite passer à la pratique…
quelques liens sur le sujet:

au début on se servait du midi pour jouer des sons…
il y avait des instruments midi (typiquement les claviers numériques) pour produire des signaux midi. par ex lors de l'appui d'une touche du clavier. il y avait aussi des récepteurs pour recevoir les signaux midi et jouer des sons à partir de banques de sons. (certains instruments comme les claviers faisaient les 2)

aujourd'hui on utilise beaucoup le midi en le reliant à un ordinateur. par exemple en se servant d'une surface de contrôle midi que l'on connecte sur son ordi pour contrôler plus facilement un logiciel (très utilisé en MAO, mais aussi pour les logiciels de jeux de lumière). cette utilisation est assez répandu dans chez musiciens (c'est plus facile en live d'appuyer sur un pédalier que de manipuler une souris et un clavier (d'ordi)).
bref on peut voir le MIDI comme une solution pour utiliser/créer des interfaces pour mieux contrôler les logiciels.

le MIDI une norme qui commence à dater

le MIDI existe depuis près de 30 ans! et pourtant cette norme est encore très utilisée. ceci dit l'informatique a un peu évolué depuis et particulièrement dans les transferts de données. on échange des données de plus en plus volumineuses et de plus en plus vite.
une nouvelle norme existe aujourd'hui, l'OSC qui devrait remplacer le MIDI en amenant pas mal de nouvelles possibilité et un petit coup de jeune…

le format des données MIDI

cette partie est très inspirée de la page:format de données sur le site d'olivier Gloton
voici par exemple le schéma d'envoi d'une trame:

comme on peut le voir sur le schéma ci-dessus seul le 7 bits de droite sont utilisables, le premier bit servant à déterminer si l'octet envoyé est une donnée ou une commande (statut).
si l'octet commence par un “1” l'octet est interprété comme une commande (statut).
les 3 bits suivant indique la commande envoyée (NOTE ON, PROGRAM CHANGE , etc)
les 4 derniers bits indique le canal utilisé (0-15)
on a donc la possibilité d'utiliser 8 commandes différentes et 16 canaux (0-15)

si l'octet commence par un “0” l'octet est interprété comme une donnée.
comme on ne peut utiliser que 7 bits la valeurs sera comprise entre 0 et 127.

voici une liste des différentes commandes:

(nnnn pour n° de canal)

  • Note on (1001 nnnn) + Hauteur note (0xxx xxxx) + Vélocité (0xxx xxxx): le message “note on” est l'événement qui se produit par ex lorsque l'on appui la touche d'un clavier (l'instrument…) . si on ne donne pas de valeur pour la vélocité elle sera par défaut à 64 . pour faire simple on peut voir la vélocité comme le volume de note jouée.
  • Note off (1000 nnnn) + Hauteur note (0xxx xxxx) + Vélocité (0xxx xxxx): le message “note off” est l'événement qui se produit par ex lorsque l'on relâche la touche d'un clavier (tjs l'instrument…) . si on ne donne pas de valeur pour la vélocité elle sera par défaut à 64 . la vélocité correspondera à la dynamique de la disparition de la note. si on veut simplement arrêter une note cette valeur a peu d'importance.
  • Program change (1100 nnnn) + Numéro (0xxx xxx): Affectation d'un instrument à un canal, selon banque chargée en contrôle change. dans le cas d'une interface midi pour piloter un logiciel on se sert souvent de message “program change”
  • Control change (1011 nnnn) + Numéro (0xxx xxxx) + Valeur (0xxx xxxx): dans le cas d'une interface midi pour piloter un logiciel on se sert aussi souvent de message “control change”
  • polyphonic after touch (1010 nnnn) + Hauteur note (0xxx xxxx) + Valeur pression (0xxx xxxx): Variation de pression sur une touche, (le flux d'informations peut augmenter considérablement). s'utilise plus rarement
  • After touch (1101 nnnn) + Valeur (0xxx xxxx): Variation de pression sur l'ensemble du clavier, affecte tout le canal. S'utilise plus rarement
  • Pitch bend (1110 nnnn) + Code (0000 0000) + Vitesse (0xxx xxxx): le “pitch bend” est une molette qui revient d'habitude à sa position centrale. elle sert souvent à faire des effets. la valeur de sa position centrale est 0(code), 64 (vitesse).

envoi des données

les données sont envoyées en série ou chaque trame fait 3 octets (à part pour “program change” et “after touch” ou il n'y en a que 2“).
on envoi chaque octet avec 1 bit de start, 8 bits de données, 1 bit de stop et pas de bit de parité (c'est la format par défaut donc il n'y a rien à changer de ce côté là dans notre programme). pour de plus amples explications sur la réception et l'envoi des données en série cf la section serie
la vitesse de communication est de 31250.
pour en savoir un plus un lien (toujours vers le même site qui décidemment est très bien fait …) format des donnée ou vous trouverez des schémas et des explications assez clairs en début de page

concrètement voilà comment on va paramétrer ça dans la partie setup de notre programme:

Serial.begin(31250);   // set MIDI baud rate

par exemple si on veut envoyer une NOTEON de hauteur 60(je crois que c'est un “do” vers le centre du clavier) sur le cannal 1 (en comptant de 1 à 16).
en suivant les descriptions ci-dessus on se rend compte qu'il nous faut envoyer 3 octets:\

  • la commande NOTEON+canal: 1001 nnnn où nnnn représente le cannal. pour un canal 1 (de 1 à 16) il nous faudra mettre 0 car ici on compte de 0 à 15… ça donnera donc 10010000
  • la hauteur de note: ici on a choisi 60. (on peut choisir une valeur de 0 à 127)
  • le vélocité (qui pour nous représentera la volume): la valeur max étant 127 on va mettre 100 ce qui est déjà un bon niveau de volume.

voyons ce que ça donnerait dans notre programme:

Serial.write(0b10010000);
Serial.write(60);
Serial.write(127);

et voilà c'est tout. vous venez d'envoyer un signal NOTEON. remarquez qu'il pourrait être judicieux d'envoyer un signal NOTEOFF ou un signal NOTEON avec une vélocité à 0 pour arrêter la note.

MIDI OUT

XBEE

Je vais faire ici une présentation assez succinct car les possibilités d'utilisation sont assez vastes et il existe des pages très bien faites sur le xbee dont cet article s'est largement inspiré…(vous trouverez les liens à la fin de cet article).
Donc je vais faire un résumé avec comme but de passer rapidement à la pratique…

Présentation des modules Xbee

Les modules Xbee permettent de créer des réseaux sans fil. Ils fonctionnent sur une fréquence de 2,4GHz, ils sont faciles à mettre en œuvre, relativement bon marché, consomment peu de courant et peuvent atteindre des portées assez intéressantes (cf infos ci-dessous). On communique avec le module Xbee simplement avec le port série de l'arduino. La vitesse de communication entre le xbee et l'arduino est paramétrable (cf paramétrage des modules xbee) mais les modules xbee entre eux communiquent à une vitesse de 250Kbps. Les modules xbee possèdent aussi des entrées/sorties pour leurs permettre de les faire fonctionner de manière autonome mais nous n'aborderons pas ses possibilités pour l'instant…

il existe 2 versions. la version normale et la version pro plus puissante.

version normale

  • Portée intérieur / urbain: jusqu’à 30 m
  • Portée extérieur champs libre: jusqu’à 100m
  • Puissance d’émission RF: 1 mW (0 dBm)
  • Courant de repos: < 10 μA
  • Fréquence de fonctionnement: 2.4 GHz
  • Vitesse de transmission RF:250Kbps

version pro

  • Portée intérieur / urbain: jusqu’à 100 m
  • Portée extérieur champs libre: jusqu’à 1600m
  • Puissance d’émission RF: 100 mW (20 dBm) EIRP
  • Courant de repos: < 10 μA
  • Fréquence de fonctionnement: 2.4 GHz
  • Vitesse de transmission RF:250Kbps

Le datasheet

série 1 ou série 2

La réponse est série 1… Le module xbee est disponible en 2 séries (dans chaque série il y a une version normale et version pro).
Les modules de la série 1 et la série 2 ne sont pas compatibles.
La série 2 permet de créer des réseaux plus complexes que la série 1 mais est aussi plus difficile à mettre en œuvre. dans les exemples ci-après nous utiliserons des xbee série 1. En clair si vous utilisez des modules Xbee série 2 c'est que vous connaissez déjà bien votre sujet et que le présent article ne vous apportera rien de plus…

Différents modèles d'antennes

Pour chaque version il existe plusieurs modèles qui correspondent à plusieurs types d'antenne.

Voici les modèles pour les modules xbee de la série 1

version normale version pro type d'antenne série
XB24-AUI-001 XBP24-AUI-001 UFL 1
XB24-AWI-001 XBP24-AWI-001 antenne filaire 1
XB24-ACI-001 XBP24-ACI-001 antenne intégrée (chip) 1

Paramétrage du module Xbee

Il va falloir paramétrer nos modules Xbee pour créer un réseau afin de les faire communiquer.
Il faudra donner pour chaque module:

  • Une vitesse de communication (qui servira à communiquer entre l'arduino et le Xbee, les Xbee entre eux communique de toutes façon à 250Kbps)
  • Un nom
  • à compléter

La platine d'interface usb<>Xbee


Le plus simple pour paramétrer nos cher Xbee est d'utiliser une platine usb<>xbee. Il vous en coûtera ~20€… Elle amène plusieurs avantages qui à mes yeux la rendre indispensable…

  • Elle permet de paramétrer facilement les modules Xbee à partir de l'ordi
  • On peut aussi s'en servir pour accéder aux entrées/sorties du Xbee
  • Cette carte permet aussi d'espionner le réseau.

De ces possibilités la plus intéressante est certainement la dernière.
En electronique comme en programmation la phase de débuggage est une des phase les plus importantes. On a souvent tendance à la minimiser car on aimerait bien que tout marche du 1er coup, mais bon on a tous passer des heures à chercher une erreur bien cachée…
En informatique il y a beaucoup d'outils de débuggage, par contre en électronique on est plus souvent à aveugle. Je ne parle pas que de la partie programmation du microcontroleur mais aussi de l'aspect plus électrique de la chose. C'est la qu'interviennent les outils comme en premier plan le multimètre et oscilloscope.
Pour en revenir aux modules Xbee, une bonne méthode est d'en avoir un de plus, connecté sur la platine usb<>xbee pour espionner la communication des autres Xbee. On se sert souvent du port usb de l'arduino pour faire de débuggage mais sur les Arduino Uno par exemple il n'y a qu'un port série. Bref cette petite platine permettra d'aider à régler bien des problèmes dans bien des cas. fin de la page de pub…

2 modes de fonctionement

Il existe 2 modes pour paramétrer les modules xbee.

  • Un mode “AT” où le Xbee est vu comme un modem ce qui permet de dialoguer avec celui-ci au moyen de commande AT. c'est le mode qu'on va utiliser les exemples ci-dessous
  • Un mode “direct” ou “API”. Ce mode est plus puissant apparemment mais plus compliqué à mettre en œuvre. Pour l'instant je ne l'ai pas testé…

Le terminal de communication

Pour envoyer des commandes AT au module Xbee il nous faut utiliser un terminal de communcation…
Personnellement j'utilise minicom (sous linux). Il demande quelques réglages au départ mais je le trouve puissant et paramétrable. Sinon il en existe d'autres, il y a une partie très bien faite sur le sujet sur la page xbee-arduino de Jérôme Abel, partie configuration > terminal: http://jeromeabel.net/ressources/xbee-arduino#toc18
Il faut garder à l'esprit que quelque soit le terminal utilisé le principe et les commandes AT restent les mêmes…

Je vais donner les explications ici pour une installation avec ubuntu avec les paramétrage qui vont bien.
Pour l'installer c'est simple il se trouve dans les dépôts mais si vous êtes pressé:

sudo apt-get install minicom

Ensuite avant de paramétrer minicom il faut connaître le nom du port sur lequel se trouve la platine usb<>xbee. Une fois la platine connectée sur votre ordi dans un terminal taper:

dmesg | grep tty

Ça devrait vous retourner quelquechose qui ressemble à ça:
[ 0.000000] console [tty0] enabled
[ 4554.057228] usb 6-1: FTDI USB Serial Device converter now attached to ttyUSB0

Donc dans mon cas je peux voir que ma platine est connectée sur le port ttyUSB0.
Pour pouvoir utiliser ce port il faudra que votre utilistateur ait les droit en lecture et écriture. Le groupe dialout, qui est par défaut le groupe propriétaire du fichier, a déjà ces permissions.
Vous pouvez le voir avec la commande suivante:

ls -la /dev | grep ttyUSB0

Ça devrait vous retourner quelquechose qui ressemble à ça:
crw-rw—- 1 root dialout 188, 0 oct. 1 09:20 ttyUSB0

Il faut que votre utilisateur fasse aussi parti du groupe dialout. vous pouvez le vérifier en tapant:

cat /etc/group | grep dialout

Dans mon cas voici ce que ça retourne:
dialout:x:20:yan
On voit bien ici que l'utilisateur yan fait parti du groupe dialout.

si ce n'est pas le cas il faut l'ajouter en tapant:

adduser votre_utilisateur dialout

Bon voilà pour les droits maintenant il nous faut paramétrer minicom pour lui donner les bons réglages pour communiquer avec notre module xbee…

Par défaut les modules Xbee ont comme vitesse de communication 9600. Il faut donc dire à minicom que l'on veut communiquer à la vitesse de 9600 sur le port ttyUSB0 (dans mon cas).

Pour configurer minicom il faut taper:

sudo minicom -s

Aller dans le menu “configuration du port série” et avec les touches A-B-C-D-E-G on peut régler chaque paramètre.
Dans notre cas il faut:

  • Port série: /dev/ttyUSB0
  • Débit/Parité/Bits: 9600 8N1
  • Contrôle de flux matériel: Non
  • Contrôle de flux logiciel: Non

Revenir à la page de configuration et aller dans le menu “Enregistrer config. sous dlf” pour enregistrer la config par défaut…
Sortir de minicom par le menu “Sortir de Minicom”…

Maintenant tout devrait fonctionner à merveille pour vous en assurer lancez minicom en tapant:

minicom

enssuite taper +++ et au bout 1 à 2 sec votre module doit vous répondre “ok”

Quelques précisions sur l'utilisation de minicom (à lire avant la 1ère utilisation)

Voici quelques détails qui ne vont forcément de soit et qui peuvent être utiles pour une première utilisation…

  • Pour ouvrir l'aide taper: “ctrl+a” puis “z”
  • Par défaut le mode echo est désactivé ce qui veut dire que lorsque l'on tape sur le clavier rien be s'affiche… Pour activer le mode echo: “ctrl+A” puis “e”
  • Lorsque l'on tape une commande (par ex: +++) il ne faut pas taper entrer après. Cette précision peut faire rire ceux qui maîtrisent mais quand on n'a pas l'habitude de ce type de terminal..
  • pour sortir de minicom: “ctrl+a” puis “x”.

Voilà nous sommes prêt pour communiquer avec notre module Xbee

Les commandes AT

Mode "command"

Pour configurer le module Xbee nous devrons lui envoyer des commandes et pour ce faire il nous faudra passer en mode “command”. Comme quoi il y a une certaine logique…
par défaut le module Xbee est en mode “transparent” pour passer en mode “command” il faut taper ”+++“ (sans taper sur entrée) au bout ~1 sec le terminal vous repond “OK”.
!!! Au bout de 10 sec sans recevoir de commande le module repasse en mode “transparent” et il vous faudra retaper ”+++“ pour repasser en mode “command”.

Changer la vitesse entre l'arduino et le Xbee

Par défaut les Modules Xbee ont une vitesse de communication entre hôte et le Xbee de 9600.
Comme indiqué à la page 39 du datasheet, il est possible avec la commande ATBD de changer cette valeur et même de mettre une valeur personnalisée.
voici un petit tableau des vitesses:

parameter Configuration (bps)
0 1200
1 2400
2 4800
3 9600(valeur par défaut)
4 19200
5 38400
6 57600
7 115200

Par ex pour choisir une vitesse de 38400bps:

ATBD5,WR,CN


Parfois il peut être nécessaire de paramétrer le Xbee sur une vitesse personnalisée. par exemple on peut imaginer recevoir des données Midi sur l'entrée RX de l'arduino et emmètre des données vers le Xbee sur la sortie TX de l'arduino. Comme le protocole Midi impose un baudrate de 31250bps il va falloir paramétrer la vitesse du module Xbee sur 31250bps.
!!! Attention toute erreur a de grandes chances de rendre le module Xbee inutilisable car une fois paramétrer sur une vitesse non prédéfinie vous ne pourrez plus communiquer avec votre Xbee via un terminal. il faudra beaucoup de bidouilles pour faire marche arrière…
En fait toute valeur supérieure à 7 sera interprétée comme le baudrate désiré (en hexadécimal). Donc pour passer une valeur non prédéfinie il faut faire suivre la commande ATBD de la valeur hexadécimal choisie. Par ex pour choisir une vitesse de 31250bps(en hexa 7A12):

ATBD7A12,WR,CN


envoyer des données avec l'arduino

Pour la partie programmation il n'y a aucune difficulté particulière.
Il suffira de paramétrer dans la partie setup de votre programme la vitesse de communication à la laquelle vous configuré votre xbee (par défaut les xbee configuré à 9600):

Serial.begin(38400);

Pour écrire ou lire des donner ça se passe comme avec une connexion série standard.
Par ex pour envoeyr une chaîne caractère:

Serial.println("hello world!");

Pour plus de détails sur la lecture et l'écriture sur les ports séries se reporter à la section lecture/écriture des communication séries.

Des liens pour approfondir le sujet

  • Xbee arduino par jérôme Abel: Une excellente page, très très complete pour ne pas dire exhaustive, qui m'a beaucoup servi pour écrire se présent article…

NFR24L01


Le NFR24L01 est une petite carte de communication HF en 2,4Ghz extrêmement bon marché (sur ebay on peut trouver le modèle standard à ~1€…). Leur prix mini, leur faibles consommation en font une carte très intéressante.
Petit retour d’expériences personnel: pour avoir beaucoup utilisé le xbee et les nfr je dirai que les nfr sont moins fiables et moins puissants (même les modèles amplifiés avec antenne).
avec les nfr (le modèle non amplifié) j'avais régulièrement des décrochages à moins de 10m par exemple si une personne se trouvée entre l’émetteur et le récepteur. avec un modèle amplifié je n'ai jamais eu de problème jusqu'à 30-50m par contre dès qu'il y a des murs ça décroche assez vite.
En comparaison en intérieur avec un nfr amplifié j'ai des décrochage dès la première cloison alors qu'avec un xbee pro je n'arrive pas à le faire décrocher dans toute maison sur 3 étages.
Par contre le NFR permettent de faire des objets connectés petit et pas cher (voir aussi ci-dessous le esp8266 qui boxe dans cette catégorie). une configuration qui marche assez bien est d'utiliser un NFR amplifié pour l'emetteur et des NFR standard dans les objets récepteurs. En effet l’émetteur consomme plus mais peut plus facilement avoir une alimentation sur le secteur. les objets connectés on plus de chances d'être sur batterie (un NFR consomme ~10mA). dans cette configuration en mettant l'antenne de l’émetteur amplifié bien hauteur on a de très bon résultats.
fin de la page retour d'expérience subjective et non documentée…

en construction

ESP8266


en construction.


prog/communication.txt · Dernière modification: 2016/05/19 11:32 par admin_memo