Lors des tests du Yocto-Motor-DC, on a réalisé pas mal d'expériences pour s'assurer que c'était un module fiable qui allait tenir ses promesses et non pas prendre feu à la première occasion. L'une d'entre elles mérite d'être relatée: on s'est demandé si on pouvait construire une voiture télécommandée et son émetteur, en n'utilisant que des modules Yoctopuce...
Que les choses soient claires: on ne prétend pas avoir fait mieux qu'une voiture télécommandée de base achetée au magasin de modélisme du coin. Rien qu'au niveau financier, on a remplacé une électronique à quelques dizaines d'euros par du matériel qui en vaut plusieurs centaines.
L'objectif était surtout de tester un certain nombre de modules Yoctopuce. En effet, outre le fait de tester le Yocto-Motor-DC, cette expérience nous a permis de savoir si le matériel Yoctopuce est suffisamment réactif pour ce genre d'application.
Architecture
On a choisi de construire une voiture et une télécommande qui se connectent sur un réseau Wifi existant, et de faire tourner la logique du système sur un ordinateur connecté au même réseau. Les modules Yoctopuce n'étant que des senseurs et des actuateurs, il fallait bien mettre un ordinateur quelque part pour gérer tout ce petit monde.
l'architecture du système
La voiture
Les voitures sont probablement les plus simples des jouets télécommandés. Il n'y a que deux voies: le moteur et la direction. On a donc utilisé le Yocto-Motor-DC pour piloter le moteur de la voiture, un Yocto-Servo pour contrôler le servo de la direction. Finalement on a utilisé un YoctoHub-Wireless pour la radio. Pour alimenter tout ça on a utilisé une batterie lipo 3 cellules, soit environ 11.1 volts. On a ajouté un BEC qui converti le 11.1V en 5 volts pour alimenter les modules Yoctopuce. Ce BEC est le seul module électronique de l'expérience qui ne soit pas fabriqué par Yoctopuce.
l'électronique présente dans la voiture
On a configuré le Yocto-Motor-DC pour qu'il s'arrête s'il ne reçoit pas d'ordres pendant plus d'une seconde, pour éviter que la voiture ne se sauve en cas de perte de connexion. On l'a aussi configuré pour qu'il s'arrête si la tension de batterie descend en dessous de 9.3 Volt pour éviter de trop décharger la batterie.
On a fixé le tout sur une plaque en Plexiglas qu'on a fixé dans la voiture, l'occasion de remarquer qu'à l'échelle du modélisme nos modules ne sont pas si petits que ça :-)
Notre banc d'essai à roulettes
La télécommande
Pour la télécommande, on a utilisé un autre YoctoHub-Wireless et un Yocto-MaxiDisplay. L'intérêt d'utiliser un Yocto-MaxiDisplay est double. D'une part il permet d'afficher en direct les paramètres de la voiture: consommation, température du variateur, niveau de la batterie etc.. D'autre part, il dispose de six entrées anButton capable de mesurer des éléments résistifs... comme deux petits joysticks par exemple. Le tout est alimenté par une petite batterie USB.
l'électronique de la télécommande
On a aussi installé un petit switch pour réinitialiser le Yocto-Motor-DC à distance. Le but de l'expérience étant de pousser le variateur à ses limites, il y a des chances pour qu'il se mette en protection assez souvent :-)
La télécommande
Le software
Construire la voiture et la télécommande revient plus ou moins à jouer aux Legos en se contentant de connecter ensemble des modules Yoctopuce. La partie software est un peu plus compliquée parce qu'il faut être un peu malin: on a affaire à une application en temps réel dans toute sa splendeur.
En apparence le problème est archi-simple: il faut juste lire la position de chaque joystick et convertir cette information en ordres à envoyer au Yocto-Servo et au Yocto-Motor-DC. Sauf qu'il faut le faire efficacement, et pour cela il y a quelques règles à respecter:
Pas de fonction bloquantes
On ne peut utiliser aucune des fonctions get_* de l'API Yoctopuce, que ce soit pour lire la position des joysticks ou l'état de la voiture. En effet les fonctions get_* sont des fonctions bloquantes. A fois qu'on en utilise une, le programme envoie une requête au module correspondant et attend la réponse sans rien faire. Mais pendant ce temps, la voiture, elle, continue à avancer. Il faut donc baser toute la logique sur des callbacks, qui seront automatiquement appelés à chaque fois qu'un paramètre change de façon significative. Il suffira alors de réagir en envoyant l'ordre approprié au bon module à l'aide d'un set_* qui lui, n'est pas bloquant.
Attention au flood
Il faut faire attention à ne pas générer plus d'événements que le système n'est capable d'en absorber. Dans le cas contraire, les ordres envoyés à la voiture vont commencer s'empiler et il seront exécutés avec du retard. Il ne faut donc pas forcément interpréter et transmettre aveuglément chaque changement de position des joysticks. Il faut veiller à ce qu'un délai minimal s'écoule entre chaque ordre..
Voici donc un extrait du code pour la gestion du moteur et de la direction. vous trouverez le code complet ici.
static void PowerChange(YAnButton *fct, const string& value)
{ int v = strtoint(value)+60; // compensation du neutre
motorValue = -(v * 2 - 1000); // conversion
}
static void directionChange(YAnButton *fct, const string& value)
{ int v= strtoint(value);
directionValue = ( v * 2 - 1000) ;
}
static void refreshCarControls(void)
{
if (motorAvailable) carPower->set_drivingForce(motorValue / 10);
if (servoAvailable) carDirection->set_position(directionValue);
}
// mise place des callbacks
direction1 = YAnButton::FindAnButton("direction1");
power1 = YAnButton::FindAnButton("power1");
power1->registerValueCallback(PowerChange);
direction1->registerValueCallback(directionChange);
// boucle principale
while (true)
{
YAPI::HandleEvents(errmsg);
if (now - lastrefreshControls >50)
{ refreshCarControls();
lastrefreshControls=now;
}
}
Le résultat
On a réalisé beaucoup d'essais avec de nombreux moteurs différents. On a remarqué un phénomène intéressant: lorsque la voiture avance le variateur est naturellement refroidi par les courants d'airs mais pas à l'arrêt. L'ajout d'un minuscule ventilateur permet de repartir beaucoup plus vite après une surchauffe due à un moteur un peu trop gourmand. A part ça, on s'est bien amusé avec cette expérience, la preuve:
Un stress test très déstressant...
Conclusion
En soit, l'expérience est une réussite: la voiture fonctionne plutôt bien, mieux que ce qu'on espérait. On a cependant remarqué un léger lag entre les actions sur la télécommande et leur résultats sur la voiture, rien de vraiment étonnant vu l'architecture du système. Mais cela nous laisse penser que cette expérience illustre aussi les limites du système. Ça marche avec une voiture, mais piloter un avion ou un hélicoptère basé sur le même principe est probablement une très mauvaise idée. Ceci dit, le Yocto-Motor-DC a passé ce test haut la main.