Je recherche des informations sur la façon de mettre en œuvre un mélange correct de 2 signaux analogiques de joystick (axe X et Y) pour contrôler un entraînement à moteur différentiel double (entraînement "comme un réservoir") en utilisant un uC (ATMega328p dans mon cas, mais la même chose devrait s'appliquer à tout uC avec entrées ADC et sorties PWM):
J'ai un stick analogique, qui donne 2 valeurs analogiques:
(direction) X: 0 à 1023
(accélérateur) Y: 0 à 1023
La position de repos est (direction et position neutre des gaz) 512.512 La commande des gaz
vers l'avant / la direction vers la gauche est 0,0, la direction
avant vers la droite est 1023,0,
etc.
Les moteurs sont contrôlés par 2 pilotes de pont en H, 2 broches PWM pour chacun (avant, arrière), comme ceci:
Moteur gauche: -255 à 255
Moteur droit: -255 à 255
(les valeurs positives activent la broche PWM avant, les négatives permettent l'inverse) Broche PWM, 0 désactive les deux)
L'objectif est de mélanger les signaux analogiques du joystick pour obtenir la réponse suivante:
a) Accélérateur vers l'avant, direction neutre = véhicule en marche avant
b) Accélérateur vers l'avant, direction gauche = véhicule vers l'avant et tourner à gauche
c) Accélérateur neutre, direction vers la gauche = véhicule tournant à gauche EN PLACE qui est le moteur droit complètement en avant, moteur gauche complètement en arrière
... et de même pour les autres combinaisons. Bien entendu, la sortie doit être "analogique", c'est-à-dire qu'elle doit permettre une transition progressive, par exemple de l'option a) à b) à c).
Le concept est:
Réponses:
Un mixage "correct" est sujet à débat :-).
Un problème est que vous devez prendre des décisions sur la vitesse à laquelle une piste se déplace sous les signaux purs d'un seul pot et quoi faire lorsque les signaux de l'autre pot sont inclus. Par exemple, si vous poussez complètement le pot FB (avant-arrière) et si les deux moteurs tournent ensuite à pleine vitesse vers l'avant, comment gérez-vous l'ajout d'une petite quantité de pot LR (gauche-droite). pour obtenir la rotation, vous devez avoir une piste qui va plus vite que l'autre. Donc, si vous roulez déjà à la vitesse de marche avant maximale sur les deux moteurs, vous devez diminuer l'une ou l'autre vitesse de la piste pour tourner. Mais, si vous vous étiez arrêté, aurait accéléré l'une ou l'autre piste pour obtenir le même résultat.
Donc, tout cela dit, voici une solution de départ simple et spontanée qui me semble être un bon début.
Si les pots sont mécaniquement indépendants, les deux peuvent être à 100% simultanément.
Si les deux sont sur un arrangement de type joystick, si Yaxis = 100% et Xaxis = 0%, alors l'ajout de B réduira généralement A. Un joystick pourrait être construit là où ce qui précède n'est pas vrai, mais ceux-ci sont inhabituels.
Supposons que le joystick est du type que l'augmentation de Y% lorsque X = 100% réduira X. D'autres hypothèses peuvent être faites.
FB = pot avant-arrière. Centre zéro, + Ve pour le mouvement vers l'avant du pot
LR = pot gauche droite. Centre zéro. + Ve pour pot à droite.
K est un facteur d'échelle initialement 1.
Si un résultat dépasse 100%, ajustez donc K résultat = 100% et utilisez également la même valeur K pour l'autre moteur.
Comme 125 x 0,8 = 100, définissez K = 0,8. Alors.
Gauche = 125 x 0,8 = 100%. Droite = 80 x 0,8 = 64%.
Alors:
Moteur gauche = K x (Front_Back + Left_Right)
Moteur droit = K x (Front_Back - Left_Right)
Contrôles de santé mentale:
LR = 0 (centré), FB = plein avant -> Les deux moteurs tournent à fond vers l'avant.
LR = complètement à gauche, FB = 0 ->
Le moteur gauche tourne complètement en arrière, le
moteur droit tourne complètement en avant.
Le véhicule tourne dans le sens antihoraire.
FB était de 100%, Lr = 0%. Ajoutez 10% de LR à droite.
L = FB + LR = 100% - + 10% R = FB-LR = 100% - - 10%
Si le plus grand axe <100%, l'échelle jusqu'à = 100%.
Mettez ensuite à l'échelle l'autre axe de la même valeur.
la source
Voici une solution qui ne nécessite pas de chaînes if / else compliquées, ne réduit pas la puissance lorsque vous vous déplacez complètement vers l'avant ou la rotation en place, et permet des courbes et des transitions fluides du mouvement à la rotation.
L'idée est simple. Supposons que les valeurs du joystick (x, y) sont des coordonnées cartésiennes sur un plan carré. Imaginez maintenant un plan carré plus petit tourné à 45 ° à l'intérieur.
Les coordonnées du joystick vous donnent un point dans le grand carré, et le même point superposé dans le petit carré vous donne les valeurs du moteur. Il vous suffit de convertir les coordonnées d'un carré à l'autre, en limitant les nouvelles valeurs (x, y) aux côtés du petit carré.
Il existe de nombreuses façons d'effectuer la conversion. Ma méthode préférée est:
Cela suppose que les coordonnées initiales (x, y) sont dans la plage -1,0 / + 1,0. Le côté du carré intérieur sera toujours égal à
l * sqrt(2)/2
, donc l'étape 4 consiste à multiplier les valeurs parsqrt(2)
.Voici un exemple d'implémentation Python.
L'idée originale de cette méthode - avec une méthode de transformation beaucoup plus compliquée - est venue de cet article .
la source
Voici un exemple de mélange de la mise en œuvre d'un algorithme tel que décrit par la réponse de Russel McMahon:
http://www.youtube.com/watch?v=sGpgWDIVsoE
la source