• 12 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 16/05/2019

Mettez en place une communication radio

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Transmissions radio “low cost”

Dans le chapitre précèdent, nous avons parlé de la communication radio à 433 MHz, qui peut être utilisée quand nous avons à transmettre une faible quantité de données de manière unidirectionnelle. Mais de quoi avons-nous besoin pour mettre en place ce type de communication ?

Nous avons choisi d’utiliser deux cartes Arduino Uno pour l'émission, et une carte Arduino MEGA pour la partie réception.  Ce choix a été fait parce que les cartes Arduino ont un prix raisonnable, et sont assez simples à prendre en main.

Une carte Arduino Uno
Une carte Arduino Uno.

Nous avons utilisé également des modules radio bon marché. Il s'agit des modules MX-FS-05V  pour la partie émission, et du module MX-05V pour la partie réception.  Ces modules peuvent être achetés à des prix dérisoires (moins de 5 € chez votre distributeur de composants électroniques préféré). De plus, sur Internet, vous pouvez trouver la bibliothèque de fonctions VirtualWire qui fournit les drivers pour ces deux cartes, et peut être  utilisée avec l’application Arduino.  Depuis peu, la bibliothèque VirtualWire a été remplacée par la bibliothèque RadioHead :

http://www.airspayce.com/mikem/arduino/RadioHead/index.html 

qui propose toutes les fonctionnalités de son prédécesseur.

Sur la figure suivante, vous pouvez retrouver l'image des deux modules émetteur et récepteur :

Le module MX-FS-05V (à gauche) et le module MX-05V (à droite)
Le module MX-FS-05V (à gauche) et le module MX-05V (à droite).

Les connexions électriques entre les modules radio et les cartes Arduino sont extrêmement simples  à mettre en place. Prenons le cas du module émetteur :

  • il est alimenté entre +5 volt et la masse, en utilisant les broches correspondantes (+5 V et GND), qui se trouvent sur la carte Arduino ;

  • ensuite, la connexion DATA sur le module émetteur est connectée à la sortie D12 du module Arduino ;

  • il ne faut  pas oublier de souder un fil d'environ 17 cm à la connexion ANT du module émetteur.

Voici ce que ça donne :

Les connexions électriques entre le module MX-FS-05V et la carte Arduino UNO
Les connexions électriques entre le module MX-FS-05V et la carte Arduino UNO.

Une fois les connexions électriques effectuées, il faut relier, grâce à un câble USB, la carte à microcontrôleur au PC sur lequel tourne l’application Arduino qui permet de les programmer.

Regardons de plus près le code qui permet de programmer le microcontrôleur de la partie émettrice :

#include <VirtualWire.h>
const char *message = "ConnectIO : capteurs, actionneurs"; // la chaîne de caractères à transmettre
void setup()
{
vw_setup(5000); //la vitesse de transmission de données en bits pas sec.
}
void loop()
{
vw_send((uint8_t *)message, strlen(message));
vw_wait_tx(); //attendre que le message soit transmis
delay(1000); //attendre 1000 millisecondes avant la retransmission suivante
}

La première ligne correspond à l’appel de la bibliothèque « VirtualWire » qui définit, entre autres, les différentes fonctions permettant le paramétrage de la transmission. Ces fonctions sont facilement reconnaissables par leur préfixe ("vw_").

Ensuite, nous définissons une chaîne de caractères qui contient le message à transmettre ("ConnectIO : capteurs, actionneurs"). On peut très bien imaginer que ce message soit remplacé par une série de valeurs binaires, récupérées à partir d’un capteur relié à la carte Arduino.

Dans la boucle setup qui s’exécute une seule fois, on définit la vitesse de transmission de données. Dans notre cas, elle est de 5 000 valeurs binaires par seconde et (ou 5 000 bauds).  Cette vitesse de transmission peut varier entre 1 000 et 9 000 bauds. En règle générale, plus la vitesse est grande, plus le risque d'avoir des erreurs de transmission est grand. De plus, ce risque augmente avec la distance entre l'émetteur et le récepteur. 

La fonction vw_send()  lance la transmission, et celle d’après  vw_wait_tx()   fait attendre que le message soit transmis complètement. Enfin, la fonction delay()permet de temporiser la transmission ; plus précisément, d'attendre une seconde avant le début de la prochaine transmission.

Le module de réception (MX-05V) sera connecté à une autre carte de développement microcontrôleur. Ici, une carte Arduino Mega a été utilisée, mais tout autre carte de même type peut faire l'affaire, à condition qu'elle ait une entrée numérique disponible.

Les connexions électriques entre le module MX-05 et une carte  Arduino Mega
Les connexions électriques entre le module MX-05 et une carte Arduino Mega.

Plus précisément, pour alimenter le module récepteur, il faut utiliser les connexions +5 Volt et GND sur la carte Arduino, qui seront reliées aux connexions Vcc et GND du module récepteur. La sortie "data" sera reliée à l’entrée  D11  de la carte Arduino MEGA. Comme pour l'émetteur, une antenne filaire d'environ 17 cm (enroulée sur elle-même pour prendre moins de place) devra être soudée à la connexion ANT du module récepteur.

Le programme qui roule sur le microcontrôleur du coté récepteur est le suivant :

#include <VirtualWire.h>
void setup()
{
vw_setup(5000);
vw_rx_start();
Serial.begin(9600);
}
void loop()
{
uint8_t long_buf = 33;
uint8_t mem_tampon[long_buf];
if (vw_get_message(mem_tampon, &long_buf))
{
int i;
Serial.print("Reçu : ");
for (i = 0; i < long_buf; i++)
{
Serial.write(mem_tampon[i]);
}
Serial.println();
}
}

Comme pour l'émetteur, il faut appeler la bibliothèque VirtualWire. Ensuite, il faut indiquer le débit de données reçues (fonction  vw_setup() ). Bien évidemment, ce débit doit être identique à celui utilisé à l'émission (5 000 bauds). Après avoir indiqué le débit de données et démarré le récepteur ( vw_rx_start() ), on initialise la communication avec le moniteur série pour visualiser les données qui seront reçues, grâce à la fonction   Serial.begin(9600).

Ensuite, dans la boucle principale, on définit une mémoire tampon de longueur égale à la taille du message transmis, en sachant qu’au maximum, cette longueur est de 80 octets. Cela est effectué par les instructions suivantes :   uint8_t long_buf = 33; et  uint8_t mem_tampon[long_buf];.

Si un paquet de données a été correctement reçu, alors cela est affiché par le moniteur série par la fonction  Serial.write(mem_tampon[i]);.

Comme vous pouvez le constater, la transmission a été réalisée avec succès ; le message transmis par l’émetteur est affiché en boucle par le moniteur série du récepteur :

Terminal série du récepteur
Terminal série du récepteur.

Cette communication est assez fiable. En visibilité directe, la communication porte a plus de 100 mètres et, dans un environnement "indoor" (à l'intérieur d'un bâtiment) cela est réduit à quelques dizaines de mètres.  Les messages sont transmis même si les deux fils qui servent d'antennes ne sont pas soudés, mais la portée est alors fortement dégradée.

Dans la section suivante, nous allons configurer un autre type de transmission : la Bluetooth Low Energy, qui est plus complexe, certes, mais qui permet d’avoir plus de degrés de liberté, tels que le choix d’un canal de communication, la constitution d’un réseau radio, etc.

Transmissions Bluetooth Low Energy

Faire communiquer des modules radio bon marché c’est bien, mais qu’est-ce qu’on fait si on souhaite établir une communication radio fiable, sécurisée et surtout avec une faible empreinte énergétique?

Dans cette section, je vous présenterai comment on peut établir une connexion Bluetooth Low energy (Bluetooth LE) entre un système à microcontrôleur et un smartphone.

La connexion Bluetooth Low Energy utilisée pour le pilotage d'un drône avec un smartphone
La connexion Bluetooth Low Energy utilisée pour le pilotage d'un drone avec un smartphone.

Pour ce faire, nous allons relier un module Bluefruit LE à une carte Arduino (dans le cas présent, via une liaison SPI). Le tableau suivant récapitule les connexions électriques à faire entre les deux dispositifs :

Arduino UNO

Bluefruit LE

D13 

SCK

D12

MISO

D11

MOSI

D10

REQ

2

RDY

pas connecté

ACT

~9

RST

pas connecté

3V0

GND.

GND

5V

VIN

À son tour, la carte à microcontrôleur est connectée à un PC sur lequel tourne l’environnement de programmation Arduino, qui inclut la librairie Adafruit  nRF 8001.  De l’autre côté, sur le smartphone, on installe l’application Bluefruit LE.  Ce type de communication radio fonctionne comme une liaison série UART entre les deux équipements : microcontrôleur et smartphone.

La connexion série entre un module Bluefruit LE et une carte à microcontrôleur Arduino UNO
La connexion UART entre un module Bluefruit LE et une carte à microcontrôleur Arduino UNO.

Regardons de plus près  le programme qui roule sur le microcontrôleur :

#include "Adafruit_BLE_UART.h"
#include "SPI.h"
#define ADAFRUITBLE_REQ 10
#define ADAFRUITBLE_RDY 2
#define ADAFRUITBLE_RST 9
Adafruit_BLE_UART BTLEserial = Adafruit_BLE_UART(ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST);
void setup() {
BTLEserial.setDeviceName("Cnct_IO"); // 7 characteres maximum
Serial.begin(9600);
BTLEserial.begin();
}
aci_evt_opcode_t laststatus = ACI_EVT_DISCONNECTED;
void loop() {
BTLEserial.pollACI();
aci_evt_opcode_t status = BTLEserial.getState();
if (status != laststatus) {
if (status == ACI_EVT_DEVICE_STARTED) {
Serial.println(F("# ConnectIO: Capteurs, actionneurs\n\n#Le module Bluefruit LE (BLE4.0) est prêt pour la connexion"));
}
if (status == ACI_EVT_CONNECTED) {
Serial.println(F("# Connecté!"));
}
laststatus = status;
}
if (status == ACI_EVT_CONNECTED) {
if (BTLEserial.available()) {
Serial.print("#Reçu : ");
}
while (BTLEserial.available()) {
char c = BTLEserial.read();
Serial.print(c);
}
if (Serial.available()) {
Serial.setTimeout(300);
String s = Serial.readString();
uint8_t sendbuffer[40];
s.getBytes(sendbuffer, 40);
char sendbuffersize = min(40, s.length());
Serial.print("#Transmis : "); Serial.print((char *)sendbuffer); Serial.print("\n");
BTLEserial.write(sendbuffer, sendbuffersize);
# }
}
}

Après avoir appelé les librairies Adafruit et SPI avec les deux premières instructions, on configure les différentes connexions entre le module Bluetooth et la carte Arduino, et on définit la connexion Bluetooth comme une liaison série :

Adafruit_BLE_UART BTLEserial = Adafruit_BLE_UART(ADAFRUITBLE_REQ, ADAFRUITBLE_RDY, ADAFRUITBLE_RST);

Ensuite, dans la partie   setup, on donne un nom et on initialise le module Bluefruit.  Dans cet exemple, le module s’appelle   Cnct_IO

Dans la boucle qui s’exécute indéfiniment ( loop ), on interroge l’état du module Bluefruit. Par défaut, il est en attente d’appairage avec un autre équipement Bluetooth.

BTLEserial.pollACI();
aci_evt_opcode_t status = BTLEserial.getState();
if (status != laststatus) {
if (status == ACI_EVT_DEVICE_STARTED) {
Serial.println(F("# ConnectIO: Capteurs, actionneurs\n\n#Le module Bluefruit LE (BLE4.0) est prêt pour la connexion"));
}
if (status == ACI_EVT_CONNECTED) {
Serial.println(F("# Connecté!"));
}
laststatus = status;

Sur la figure suivante, vous pouvez apercevoir une copie d'écran du moniteur série de la carte Arduino.

Le moniteur série de la carte Arduino à laquelle le module Blue a été branché
Le moniteur série de la carte Arduino à laquelle le module BlueFruit LE a été branché.

Si un message arrive, il sera détecté par la fonction   BTLEserial.available   et sera affiché au moniteur série grâce à la fonction  BTLEserial.read. Tout message qui est saisi par l’utilisateur au moniteur série sera transmis grâce à la fonction BTLEserial.write

Coté smartphone, l’application Bluefruit LE, téléchargeable gratuitement depuis le Play Store d'Android, permet d’initier une connexion Bluetooth 4.0 avec le module Bluefruit, et notamment d'établir une liaison série UART bidirectionnelle. Voici la face avant de cette application, ainsi que son icône sur Android Store :

Bluefruit LE sur Android Store et la face avant de l'interface UART
Bluefruit LE sur Play Store et la face avant de l'interface UART.

Regardons de plus près comment fonctionne notre liaison Bluetooth. Avec le système à microcontrôleur, l'utilisateur envoie le message : « Bonjour Android ». Le même message est reçu par le smartphone, comme on peut le voir sur la figure suivante :

Message passé du microcontrôleur au smartphone
Message passé du microcontrôleur au smartphone

Comme on peut le voir ci-dessous, le possesseur du smartphone, grâce à l'interface UART, répond à son tour « Bonjour Arduino » :

Méssage passé du smartphone vers microcontrôleur
Message passé du smartphone vers le microcontrôleur.

Chouette, n’est-ce pas ? :zorro: Maintenant qu’on sait communiquer en Bluetooth, on peut se servir de notre téléphone comme d’une télécommande de drone. Voici l'interface de la télécommande proposée par l’application Bluefruit LE.

L'inteface de la telecommande proposée par l'application Blue. A chaque touche correspond l'envoi d'un code ASCII
L’interface de la télécommande proposée par l'application Bluefruit LE. À chaque touche correspond l'envoi d'un code ASCII.

Le code qui s’exécute sur la carte Arduino doit associer aux caractères reçus de la part du smartphone, une action bien précise (tourner à gauche, tourner à droite, avancer, etc.).

Dans la section suivante, nous allons voir ensemble comment on peut communiquer grâce à des modules radio Decawave, qui sont compatibles avec les normes de communication ultra-large bande.

Transmissions radio "ultra-large bande"

Parfois, nous avons besoin de transmettre des données avec un débit plus grand, et de se servir de la transmission radio pour calculer la distance entre les deux objets communicants. Pour ce faire, la meilleure technologie radio à employer est celle qui utilise des signaux ultra-large bande. Dans cette section, je vous montrerai comment mettre en place une communication point à point, en utilisant des modules radio de la société Decawave.

Exemple de module radio ultra-large bande proposé par la société Decawave
Exemple de module radio ultra-large bande proposé par la société Decawave.

Pour rappel, cette technologie implique la transmission des impulsions de courte durée, ce qui lui confère une meilleure robustesse aux interférences rencontrées sur le canal de propagation.

Comparaison entre un signal de type bande étroite (noir) et un signal ultra-large bande (rouge)
Comparaison entre un signal de type bande étroite (noir) et un signal ultra-large bande (rouge).

Néanmoins, la transmission ultra-large bande doit se contenter d’une portée assez réduite par rapport aux autres technologies bande étroite.

De plus, par rapport aux autres technologies à bande étroite, avec les transmissions ultra-large bande, nous avons la possibilité de localiser les objets communicants, voire de mesurer la distance entre eux, parce que ce type de communication est similaire à la technique RADAR.

Une méthode pour la mesure de la distance entre deux transceivers ultra-large bande est présentée sur la figure suivante :

Mesure de la distance entre deux objets communicants qui possedents des transceivers radio ultra large bande
Mesure de la distance entre deux objets communicants qui possèdent des transceivers radio ultra-large bande.

En faisant transmettre des paquets de données entre deux systèmes embarqués avec des modules ultra-large bande, on peut déterminer le temps de parcours  tp du paquet entre les deux objets. Ce temps est donné par la formule suivante :

tp=Δt1Δt2+Δt3Δt44

Bien évidemment, la distance entre les deux objets sera d=tpc, où c=3108m/sec est la vitesse de la lumière.

Le module DWM1001, fabriqué à base du chip radio DW1000, est capable d’émettre des trains d’impulsions autour de la fréquence 6,5 GHz, avec une bande passante d’environ 500 MHz. Plus précisément, il émet entre 6 240 MHz et 6 739,2 MHz. Nous avons le choix entre trois niveaux de débit de transmission différents : 110 kbps,  850 kbps et 6,8 Mbps. Le module respecte la densité spectrale de puissance maximale définie par la norme, donc il émet des impulsions d’une densité spectrale de puissance de -41.3 dBm/MHz.

Terminaux série d'un emmeteur et d'un récepteur ultra large bande
Terminaux série d'un emetteur et d'un récepteur ultra large bande

Vous voyez ci-dessus des images d'écran de terminal (série) qui correspondent à la communication avec deux modules DWM1001 paramétrés en émetteur (celui à gauche) et en récepteur (celui de droite). Vous pouvez remarquer le fait que le message « ConnectIO » transmis par le module émetteur est bien reçu par le module récepteur.

Pour résumer :

  • nous avons passé en revue les principaux paramètres d’une transmission radio ;

  • nous avons évoqué les principales normes de communication à faible débit ;

  • vous avez appris comment mettre en place trois types de liaison radio à faible débit : une grâce à des modules radio bon marché, une connexion Bluetooth Low Energy et une connexion ultra-large bande.

Exemple de certificat de réussite
Exemple de certificat de réussite