Une radiocommande très économique avec deux cartes Arduino UNO

Tout ce qu'il faut savoir pour radio-commander vos modèles de voitures, robots, tractopelle, etc..
Avatar du membre
JeanGar
Nouveau Membre
Nouveau Membre
Messages : 9
Enregistré le : 13 févr. 2021, 10:56
Localisation : Marseille

Une radiocommande très économique avec deux cartes Arduino UNO

Message par JeanGar »

Bonjour à tous les arduinomanes.

Les modèles radiocommandés sont très attractifs : ils se passent de cordon ombilical pour fonctionner. Cependant, les radiocommandes du commerce sont chères, 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. Ces petits circuits émetteurs et récepteurs très rudimentaires et économiques (moins d'un euro par paire) sont capables de transmettre des bits de manière très simple : signal radio fort = 1 ; signal radio faible = 0 (modulation d’amplitude). Ils fonctionnent sur la bande de 433 MHz (voir un exemple sur la photo) et peuvent transmettre des bits à raison de 1000 à 2000 bits par seconde. 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 connection à l’arduino est très simple : les bornes Vcc (5V) et GND sont les alimentations fournies par les arduinos et les broches 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.

Recepteur_emetteur.png

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 assez fastidieuse s’il n’existait pas une bibliothèque pour arduino, nommée VirtualWire, écrite par Mike McCauley, qui 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 de tout le protocole de communication entre l’émetteur et le récepteur. En gros, l’émetteur dit (avec des bits): 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/ ... e-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/ ... o-genuino/
donne des exemples (en français) assez pédagogiques d’utilisation de cette bibliothèque.

Ce qu’il faut programmer :
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. Comme on le voit, l'ordre, la signification et l’interprétation des octets envoyés et reçus est décidée par le programmeur des deux arduinos. Pour vous entraîner vous pouvez commencer par allumer ou éteindre des LED à distance avec des boutons sur connectés à l'arduino émetteur.

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 virage : pour tourner à gauche, la roue gauche est ralentie et inversement pour tourner à droite, on ralentit la roue droite. Le joystick 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, de transformer ces informations en trois octets (vitesse gauche, vitesse droite et statut actuel du bouton) et de les transmettre.
Le programme récepteur a la charge d’attendre la réception du 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 millions (et des poussières) 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 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 les 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 : ces instructions dépendent de la carte de pilotage de 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 virer à 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 radio. Ces programmes sont largement commentés pour vous aider à comprendre ce qui s'y passe.

Recepteur_radiocommande.ino.zip
TelecommandeParJoystick.ino.zip

Remarque importante : la bibliothèque VirtualWire est incompatible avec la bibliothèque Servo qui est utile pour piloter des servomoteurs. Ces deux bibliothèques ne peuvent pas cohabiter sur le même arduino, car elles utilisent le même timer dans ardino pour régler des durées d’impulsion.
Dans un autre projet où je devais radiocommander un servo et deux moteurs ordinaires, j’ai utilisé un arduino supplémentaire à côté de l'arduino récepteur pour piloter le(s) servo(s). Si l’arduino récepteur reçoit un (des) octet(s) destiné(s) à piloter un servomoteur, il le(s) transmet à l’arduino dédié au pilotage des servomoteurss au moyen du port série (UART), 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 sans transformation utilisez Serial.write, et pour savoir si un octet est arrivé utilisez Serial.available puis le lire avec Serial.read. Cette solution à deux arduinos pour commander à la fois des moteurs et des servos est peu élégante et assez encombrante, mais elle a le mérite de fonctionner !

J'espère que ces deux petits programmes seront utiles à ceux qui souhaitent radiocommander pas cher.


 

 


 

 
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Rouletabille
Membre Émérite
Membre Émérite
Messages : 856
Enregistré le : 04 août 2020, 18:48

Re: Une radiocommande très économique avec deux cartes Arduino UNO

Message par Rouletabille »

Merci. c'est très clair.

Avatar du membre
marc80
Modérateur
Modérateur
Messages : 424
Enregistré le : 27 juil. 2020, 14:22
Localisation : 80500 Montdidier

Re: Une radiocommande très économique avec deux cartes Arduino UNO

Message par marc80 »

Merci de tes explications. J'ai l'impression au vu du modèle et d'une de mes construction que cette librairie (utilisée aussi pour les commandes infrarouge) pose aussi problème avec le shield moteur utilisé. 1 des 4 moteurs ne fonctionne pas.
Bon Meccano à tous ! :020:  Marc
 

Avatar du membre
JeanGar
Nouveau Membre
Nouveau Membre
Messages : 9
Enregistré le : 13 févr. 2021, 10:56
Localisation : Marseille

Re: Une radiocommande très économique avec deux cartes Arduino UNO

Message par JeanGar »

marc80 a écrit :
02 sept. 2021, 14:56
Merci de tes explications. J'ai l'impression au vu du modèle et d'une de mes construction que cette librairie (utilisée aussi pour les commandes infrarouge) pose aussi problème avec le shield moteur utilisé. 1 des 4 moteurs ne fonctionne pas.

Humm! Peut-être faudrait-il vérifier si le fonctionnement de la carte moteur est correct sans la présence de VirtualWire avant de soupçonner une mauvaise interférence entre la carte et la bibliothèque ?

Répondre