Sujet : Piste pour programmation robot 2 moteurs DC

Bonjour à tous,

Je viens de m'inscrire sur ce forum dans l'espoir d'avoir un peu d'aide.

Je vous explique :

Je dispose d'un robot comportant deux moteurs DC. Pour commander ce robot, j'utise un joystick analogique. J'ai un peu de mal à savoir comment je dois m'y prendre pour coder ça de manière intelligente. J'arrive très bien à le faire avancer, reculer, aller à droite, à gauche... mais comment dois-je procéder pour le faire aller à droite lentement... en gros, avoir une variation progressive représentative des mouvements du joystick.

Je pense ne pas être le premier à me poser la question et je pense que des codes ont déjà été écris pour réaliser ça. Je pourrais donc m'en inspirer si vous me dite où je peux trouver ce que je recherche.

Merci.

2

Re : Piste pour programmation robot 2 moteurs DC

La logique est très simple.

Partons du principe que le déplacement avant-arrière du joystick corresponde à la commande de vitesse de translation du mobile. Quand on pousse le manche, on avance, et quand on le tire on recule, la vitesse étant proportionnelle à la position du joystick par rapport au centre. Le déplacement latéral donne lui la vitesse de rotation du mobile sur lui-même. Si on pousse le manche à fond à droite, on tourne sur nous même dans le sens des aiguilles d'une montre, et l'inverse si on le pousse à fond à gauche. Là encore, la vitesse (de rotation ici) est proportionnelle à la position du joystick. Les positions intermédiaires du joystick doivent résulter en un mixage de ces deux vitesses (translation et rotation).

On veut traduire cela en vitesses respectives des deux moteurs. Ceci se fait en appliquant les règles suivantes :
- pour un déplacement en avant :
-- le moteur de droite tourne à une vitesse proportionnelle (en valeur) à la vitesse de translation du mobile (soit donc à la position du joystick sur l'axe Y) *diminuée* d'une vitesse proportionnelle à la vitesse de rotation du mobile (soit donc à la position du joystick sur l'axe X), qu'on appelle le *biais*
-- le moteur gauche tourne à une vitesse proportionnelle à la vitesse de translation du mobile *augmentée* du biais dont on vient de parler.
- pour un déplacement en arrière, on inverse l'application du biais.

Si on formalise cela mathématiquement, cela donne :
- soient X et Y la position du manche sur les deux axes, avec origine à la position au repos du manche
- soient Vd et Vg les consignes de vitesse des moteurs droit et gauche respectivement, positives pour une rotation du moteur dans un sens et négatives pour une rotation dans l'autre sens
Vd = a * Y - b * X * sgn(Y)
Vg = a * Y + b * X * sgn(Y)
sgn() étant la fonction qui retourne le signe d'un nombre (+1 si positif, -1 si négatif), qu'on peut écrire simplement comme :
sgn(x) = x / |x| pour x non nul, et 0 si x = 0
a et b sont les coefficients de proportionnalité cités précédemment.

Ca a l'air compliqué, mais il suffit de prendre l'exemple des 8 positions extrêmes du joystick (aux extrémités des 2 axes et aux 4 coins de l'espace de liberté) pour visualiser ce que ça donne.

Il faut bien entendu limiter les vitesses obtenues en fonction des vitesses maximales que les moteurs peuvent prendre
Il ne reste plus qu'à évaluer les différents coefficients de proportionnalité (a et b), en fonction des valeurs retournées par le joystick dans ses positions extrêmes et des valeurs concrètes à fournir au contrôleur de moteur pour piloter la vitesse.

On peut imaginer des règles plus complexes, non linéaires par exemple de manière à utiliser au mieux la surface du carré dans lequel se déplace le manche, mais dans la pratique la conversion linéaire proposée ici est très satisfaisante et a présente avantage d'être très simple à coder.

Pour info, c'est ce qui est utilisé pour le pilotage du radeau décrit dans la rubrique http://www.pobot.org/-Radeau-environnemental-.html

Cordialement

Eric

3

Re : Piste pour programmation robot 2 moteurs DC

Ok merci pour avoir pris le temps de répondre. C'est exactement le type d'information que j'attendais.

Je vais devoir m'adapter un peu par contre, car la commande n'est plus un joystick mais un accéléromètre de Nunchunk (même si on peut voir ça comme un joystick analogique).

La deuxième différence est qu'il me faut calculer 4 PWM et non 2.

Si tu as d'autres conseils, je suis preneur.

Merci.
Romain

4

Re : Piste pour programmation robot 2 moteurs DC

Que ce soit un joystick ou un Nunchuck ne change rien, car les deux vont envoyer des valeurs en X et Y qui traduisent la position de la commande. D'ailleurs, je m'étais amusé à contrôler les moteurs avec la souris, en utilisant sa position X/Y courante par rapport à sa position de départ. En faisant en sorte d'envoyer des valeurs dans le même domaine de variation, le code en aval n'y voit que du feu.

Pour ce qui est des 4 moteurs, à quoi correspondent-ils ? Je pensais qu'il s'agissait d'un robot de type différentiel, avec deux roues motrices (chenilles, hélice, ou autre dispositif de locomotion équivalent) et piloté en mode "char" par conséquent. Quelle est la configuration de ton engin ?

5

Re : Piste pour programmation robot 2 moteurs DC

La configuration de mon engin est bien celle que tu décris : 2 roues motrices (chenilles) seulement la commande est :

2 PWM par moteurs : PWM A commande la rotation dans un sens et PWM B commande la rotation du moteur dans l'autre sens

idem pour le moteur 2 avec PWM B et PWM C.

6

Re : Piste pour programmation robot 2 moteurs DC

Je ne comprends pas bien la nécessité de 2 PWM par moteur.

Si les moteurs sont contrôlés par un classique ESC, le sens de rotation est déterminé en fonction de la longueur du pulse de contrôle par rapport à la valeur médiane (aka point neutre), soit 1.5ms. Si les pulses sont plus courts, le moteur tournera dans un sens, s'ils sont plus longs il tournera dans l'autre. La vitesse de rotation sera elle donnée par la valeur absolue de la différence entre la longueur du pulse et 1.5ms. Conclusion, il n'y a besoin que d'un signal de contrôle par moteur.

Qu'utilises-tu pour les contrôler ?

7

Re : Piste pour programmation robot 2 moteurs DC

Pour ce projet, il s'agit d'un composant disponible chez TI : le DRV8432. Il est vraiment très intéressant car il permet d'avoir pas mal de puissance embarquée dans un encombrement très restreint.

Ce composant présente plusieurs mode de fonctionnement. Le fonctionnement que tu décris correspond au mode de fonctionnement 4 du composant, or, celui que j'utilise c'est le 1 (je ne peux pas le modifier, c'est une définition hardware).

Pour faire plus simple, on peut commander les moteurs de cette manière :
Pour le moteur 1 : une entrée PWM et une entrée Sens
Pour le moteur 2 : une entrée PWM et une entrée Sens

Mais on peut aussi les commander en remplaçant les entrées Sens par des PWM... d'où les 4 PWM...

Merci pour ton aide Eric.
Romain.

8

Re : Piste pour programmation robot 2 moteurs DC

OK, j'ai vu de quoi il s'agit.

En fait ton composant est juste un étage de puissance, et tes 4 signaux servent à contrôler les 4 branches des 2 ponts. Ca s'apparente aux L298 et consorts. Les différents modes mentionnés sont relatifs aux configurations possibles des ponts, avec possibilité de mise en parallèle pour doubler la puissance commutable.

Ce dont je parlais correspond à la commande de contrôleurs de moteurs CC, constitués d'un pont en H de même nature, mais également de la logique de contrôle de ce pont, générée à partir du décodage des impulsions de commande de type R/C.

Ce qu'il faut donc ajouter à ma première suggestion de solution est le code qui va générer les pulses PWM, en faisant varier leur rapport cyclique en fonction de la vitesse souhaitée. Si je comprends bien la doc, pour faire tourner le premier moteur dans un sens donné, il faut n'utiliser qu'un des 2 PWM contrôlant ses 2 demi-ponts (PWM_A par ex.) et pour le faire tourner dans l'autre, il faut utiliser l'autre PWM (PWM_B dans l'exemple choisi). Je suppose que si un PWM est à l'état bas, le demi-pont correspondant est fermé à la masse, et s'il est à l'état haut, il est fermé à VDD_mot, l'état hi-Z semblant géré par le signal RESET en synchronisation pour les deux branches d'un même demi-pont. Pour en revenir à la commande, il faut donc gérer la ligique suivante :
- rotation du moteur AB dans un sens : PWM_B à 0 et PWM_A actif avec un rapport cyclique correspondant à la vitesse souhaitée
- rotation du moteur AB dans l'autre sens : PWM_A à 0 et PWM_B actif avec un rapport cyclique correspondant à la vitesse souhaitée

9

Re : Piste pour programmation robot 2 moteurs DC

Oui, je suis entièrement d'accord avec toi.

La logique que tu as décrit est efficace, c'est celle que j'utilise actuellement. Celle que je souhaite implanter à terme diffère un peu :

- rotation du moteur AB dans un sens : PWM_A actif (variation de la vitesse de rotation en fonction du DC) et PWM_B à 0 (sens +)

- rotation du moteur AB dans l'autre sens : PWM_A actif (variation de la vitesse de rotation en fonction du DC) et PWM_B à 1 (sens -)

10

Re : Piste pour programmation robot 2 moteurs DC

Ceci juste une question : pour quelle raison as-tu sélectionné ce composant plutôt qu'un ESC de modélisme ?

Le premiers modèles sont déjà capables de piloter des courants de 20 à 30A et on trouve couramment des modèles supportant plus de 100A, le tout pour quelques dizaines d'Euros et un packaging compact.

L'avantage est que le pilotage en est beaucoup plus simple, puisqu'il suffit d"un seul signal pour gérer vitesse et direction, et que ce type de signaux peut être produit directement par des devices incorporés à des MCU telles que le LPC2468 qui équipe les cartes mbed.

11

Re : Piste pour programmation robot 2 moteurs DC

Alors c'est vrai qu'on peut se poser la question.

Un premier élément de réponse est que je suis totalement novice en modélisme, et que j'ai eu plus une approche électronique du problème sans forcément regarder les solutions intégrées du modélisme... j'ai certainement du avoir cette démarche

Après j'avais fait pas mal de recherche pour trouver un pont en H (Farnell, RS,...) et c'est ce composant qui est sorti.

Il y a aussi des contraintes particulières qui m'étaient imposées que je n'ai pas mentionné. L'encombrement notamment qui, pour mon projet, était un élément très réducteur. Je pilote le double pont en H que j'ai utilisé avec un Arduino Nano, ça m'était imposé aussi.

En tout cas, si un jour tu décides de regarder de plus près le pont que j'ai utilisé, n'hésites pas à me contacter pour quelques conseils (donnant/donnant). En effet, je dois bien connaître la DS par coeur et j'avais fait quelques erreurs qui m'ont servit de leçon wink.

Pour ce qui est de la loi de commande, j'ai adapté la philosophie présentée dans tes premiers messages et ça fonctionne très bien. Un grand merci pour le "coup de pouce".

Après si tu as quelques liens pour que je puisse me renseigner sur les ESC (je ne connaissais même pas le terme).

Romain

12

Re : Piste pour programmation robot 2 moteurs DC

Ton premier élément de réponse est tout à fait légitime. Ensuite c'est là où est l'intérêt d'échanger avec des gens d'autres domaines, car ça permet de découvrir d'autres approches possibles, et éventuellement de changer de direction pour les projets futurs.

Pour ce qui est de l'encombrement, les ESC sont assez compacts de nos jours, surtout si on tient compte du fait qu'ils intègrent les éventuels dissipateurs. Un exemple en est visible sur une des photos de l'article http://www.pobot.org/Refonte-de-coffrets.html Les ESC sont les deux blocs roses, et ces modèles-là passent 15A (20A en pointe) avec gestion des deux sens de rotation, démarrage progressif, protection en surcharge et en surchauffe, configuration de tout un tas de paramètres,.... Le gros avantage de cette option est une mise en oeuvre très simple, car pas de carte à concevoir et à réaliser et un seul signal à générer. Donc au bout du compte, si on intègre le temps passé et les éventuelles erreurs de parcours, ça revient significativement moins cher.

Concernant les liens, je n'en ai pas en tête en particulier, car en fait il n'y a pas grand-chose à en dire de spécial. La seule chose à savoir c'est qu'ils se commandent comme un servo R/C (dont avec le mécanisme de pulse de largeur variable), du simple fait qu'avant d'être électroniques (et actuellement gérés par un µP intégré) il s'agissait d'un bête rhéostat mécanique positionné par un servo (cf la première photo de l'article http://www.pobot.org/Bouge-ton-servo.html). Et c'est vrai que j'ai utilisé l'acronyme ESC, mais sans l'expliciter. ESC signifie "Electronic Speed Controler", soit en Français : "contrôleur électronique de vitesse", ou plus couramment "variateur". Un coup de Google sur ces bases là te donner des tonnes de pages à consulter. Mais le plus simple est peut-être de commencer par l'article que je mentionne juste avant, car il s'agit d'un tutorial pour les débutants en µP, qui explique comment on contrôle un servo (et donc un ESC) par µP.

Et pour ce qui est du retour d'ascenseur, il te suffira de nous référencer si d'aventure tu as un site qui décrit ton projet wink

Cordialement

Eric