Arduinophiles, arduinomanes, arduinophones, bonjour.
Les modèles radiocommandés sont très attractifs : ils se passent de cordon ombilical pour fonctionner. Cependant, les radiocommandes du commerce sont coûteuses, elles ont un nombre de canaux limité et ne savent généralement que commander des servomoteurs.
Le projet est de réaliser une radiocommande numérique en utilisant deux arduinos l’un connecté à un circuit émetteur et l’autre à un circuit récepteur (voir un exemple de circuits sur la photo). Ces petits circuits émetteurs et récepteurs très rudimentaires et très économiques (moins d’un euro par paire) sont capables de transmettre des bits de manière extrêmement simple : signal radio fort = 1 ; signal radio faible = 0 (modulation d’amplitude rudimentaire). Ils fonctionnent sur la bande de 433 MHz et peuvent transmettre des bits à raison de 1000 à 2000 bits par seconde, voire plus. En France, on a le droit de tout faire sur cette fréquence si on ne dépasse pas 10 mW de puissance pour l’émetteur, ce qui est notre cas. Leur liaison à l’arduino est très simple : les bornes Vcc (5V) et GND servent pour l’alimentation des circuits (on peut utiliser le 5V fourni par l’arduino ou par une de ses broches mise à HIGH) et les broches marquées DATA reçoivent les bits à émettre, ou sont mises à 0 ou 1 selon le signal reçu sur le récepteur. Il suffit de souder un fil d’antenne (de 17,3 cm environ) sur chaque circuit pour que la transmission se fasse bien.
L’arduino émetteur doit générer les bits à transmettre et l’arduino récepteur doit stocker les bits reçus et agir en conséquence.
L’utilisation de ces petits circuits serait très fastidieuse (il faudrait générer les bits) s’il n’existait pas une bibliothèque pour arduino, nommée VirtualWire, écrite par Mike McCauley. Cette bibliothèque facilite grandement l’utilisation de ces circuits, en fournissant la possibilité avec des instructions simples d’envoyer un tableau d’octets ou de recevoir ce tableau d’octets. La bibliothèque se charge du petit protocole d’émission de l’émetteur vers le récepteur. En gros, l’émetteur dit : attention je vais envoyer un tableau d’octets, il envoie le tableau d’octets, puis signale que le message est terminé. Le récepteur attend une réception d’octets, les stocke dans un tableau d’octets, vérifie que le message reçu est complet et sans erreur (checksum) et avertit l’arduino récepteur qu’un message correctement reçu est arrivé. A noter que la bibliothèque est utilisable avec tout type de communication sans fil (radio, infrarouge, ultrasons, etc.) ou même avec un fil !
La bibliothèque VirtualWire est téléchargeable à :
http://www.airspayce.com/mikem/arduino/VirtualWire/VirtualWire-1.27.zip.
La documentation complète (en anglais) des fonctionnalités est téléchargeable à :
http://www.airspayce.com/mikem/arduino/VirtualWire.pdf
Bien que n’étant plus maintenue par son auteur, elle fonctionne très bien.
Par ailleurs, le site
https://www.carnetdumaker.net/articles/communiquer-sans-fil-en-433mhz-avec-la-bibliotheque-virtualwire-et-une-carte-arduino-genuino/
donne des exemples (en français) assez pédagogiques d’utilisation de cette bibliothèque.
Le principe de fonctionnement
Grâce à cette bibliothèque, il ne reste au programme de l’arduino émetteur qu’à remplir le tableau d’octets à envoyer et à donner l’ordre de l’émettre ; quant au programme de l’arduino récepteur, il doit attendre de recevoir un message et agir en conséquence des octets reçus. La bibliothèque ignore totalement la signification du message transmis : elle ne transmet qu’un tableau d’octets. C’est le programmeur qui décide de l’ordre des octets et de leur interprétation.
Le projet
Dans le petit projet présenté ici, l’objectif est de radiocommander un mobile à deux roues motrices (roue gauche et roue droite, chacune ayant son moteur, une bille folle servant de troisième point d’appui) au moyen d’un joystick bidirectionnel (deux potentiomètres : l’un en x, l’autre en y). On décide que le positionnement en x règle la vitesse (avant ou arrière) et que le positionnement en y règle la direction du virage : pour tourner à gauche, la roue gauche est ralentie et inversement pour tourner à droite, on ralentit la roue droite. Le petit joystick que j’ai utilisé ayant aussi une fonction bouton-poussoir quand on appuie dessus, on peut s’en servir pour radiocommander un autre dispositif (des phares sur le mobile par exemple).
Le programme émetteur a la charge de mesurer les positions actuelles x et y du joystick ainsi que celle du bouton, de calculer les vitesses de chaque moteur en fonction de la position du joystick et de transformer ces informations en trois octets (vitesse gauche, vitesse droite et statut actuel du bouton) et de les émettre à l’intention du récepteur.
Le programme récepteur a la charge d’attendre la réception d’un message d’octets et d’agir en conséquence sur les moteurs et les phares.
Pour éliminer des messages parasites ou destinés à d’autres dispositifs, j’ai décidé que chaque message commence par trois octets d’identification pour s’assurer de l’identité de l’émetteur et du récepteur. Le programme récepteur a donc aussi la charge de vérifier que c’est le bon émetteur et que le message lui est bien destiné avant d’en tenir compte. Avec 3 octets d’identification, il n’y a qu’une chance sur 16.777.216 de prendre en considération un message qui n’est pas destiné au récepteur ! Chaque message contient donc 6 octets : trois d’identification et trois de données utiles. J’ai constaté qu’à la vitesse de 2000 bits par seconde, la transmission d’un message de 7 octets avec VirtualWire dure environ 85 millisecondes. Le temps de réaction entre le joystick et les moteurs est donc de l’ordre du 1/10 de seconde, ce qui est acceptable en modélisme.
Vous pouvez télécharger le squelette (à compléter) des programmes de ce petit projet. Vous devrez l’adapter à vos propres besoins. Notamment, vous aurez à compléter le programme récepteur avec les instructions adéquates qui ajustent la vitesse et le sens de rotation des moteurs gauche et droite car ces instructions dépendent de la carte de pilotage des moteurs que vous utilisez (consultez la documentation de la carte). Dans le programme de l’arduino émetteur, vous pouvez aussi modifier la manière de tourner à gauche ou à droite si celle que je propose ne vous convient pas. En fait, ces squelettes de programmes précisent surtout la gestion de la communication sans fil entre l’arduino émetteur et l’arduino récepteur. Ils sont très commentés pour vous aider à comprendre ce qui s’y passe.
Recepteur_radiocommande.ino.zip (pour l’arduino récepteur);
TelecommandeParJoystick.ino.zip (pour l’arduino émetteur).
Note importante
La bibliothèque VirtualWire est incompatible avec la bibliothèque Servo qui est utile pour piloter des servos. Ces deux bibliothèques ne peuvent pas cohabiter sur le même arduino, car elles utilisent le même timer d’arduino pour commander des durées d’impulsion.
Dans un autre projet dans lequel je devais radiocommander un servo et deux moteurs, j’ai utilisé un second arduino dans le mobile pour piloter le(s) servo(s). Si l’arduino récepteur reçoit un (des) octet(s) destiné(s) à piloter un servo, il le(s) transmet à l’arduino dédié au pilotage des servos (celui qui utilise la bibliothèque Servo), au moyen du port série (UART) de l’arduino, c’est-à-dire la broche 0 (marquée RX) et la broche 1 (marquée TX). Ne pas oublier de croiser les fils entre les deux arduinos (TX connecté à RX et inversement) et de relier les GND des deux arduinos. La transmission et la réception de l’octet se fait simplement en utilisant les fonctions de Serial. Pour envoyer un octet brut (c’est-à-dire sans transformation) : Serial.write, et pour savoir si un octet est arrivé : Serial.available puis le lire avec Serial.read. Cette solution à deux arduino est quelque peu encombrante, mais elle fonctionne !
Une amélioration possible
Dans toute communication digne de ce nom, il est utile que l’émetteur soit assuré que le message envoyé a été bien reçu, afin de le renvoyer si nécessaire. Même le bon vieux télex du siècle dernier avait un caractère spécial (ACK, caractère ascii n° 6) réservé à cet usage. Les petits programmes ci-dessus ne se préoccupent pas de ce problème. Pour qu’un accusé de réception soit envoyé par le mobile, il faut que les deux arduino soient à la fois émetteur et récepteur. C’est tout à fait possible : chaque arduino doit alors posséder un circuit émetteur et un circuit récepteur. Mes petits essais ont montré qu’ils peuvent partager la même antenne. Il suffit que les programmes de chaque arduino veillent à ce que leur circuits émetteur et récepteur ne soient jamais alimentés simultanément. Au prix d’une programmation un peu plus compliquée vous pouvez vous lancer dans la programmation d’un petit protocole de communication suivant le principe que nous utilisons tous au téléphone :
- télécommande : allo
- mobile : oui, j’écoute
- télécommande : envoi d’un message
- mobile : bien reçu
Bien sûr, ce genre d’échange augmente la fiabilité de la télécommande mais aussi le petit retard entre le mouvement du joystick et la réaction du mobile. Pour y pallier, vous pouvez tester de plus forts débits en bits par seconde.
Conclusion
J’espère que cet article et ces petits programmes seront utiles aux qui souhaitent réaliser une télécommande sans fil sans dépenser des fortunes.
Jean Garrigues, CAM 931.