Ich suche nach Informationen darüber, wie man das richtige Mischen von 2 analogen Joystick-Signalen (X- und Y-Achse) implementiert, um einen doppelten Differentialmotorantrieb ("tankähnlicher" Antrieb) unter Verwendung eines uC (in meinem Fall ATMega328p) zu steuern, aber dasselbe sollte für gelten beliebige uC mit ADC-Eingängen und PWM-Ausgängen):
Ich habe einen analogen Stick, der 2 analoge Werte ergibt:
(Richtung) X: 0 bis 1023
(Gas) Y: 0 bis 1023
Die Ruheposition ist (Richtung und Gas Neutral) 512.512 Gas
vorwärts / Richtung links ist 0,0
Voll vorwärts-voll rechts ist 1023,0
usw.
Die Motoren werden von 2 H-Brückentreibern gesteuert, jeweils 2 PWM-Pins (vorwärts, rückwärts), wie
folgt : Linker Motor: -255 bis 255
Rechter Motor: -255 bis 255
(positive Werte aktivieren den Vorwärts-PWM-Pin, negative aktivieren den Rückwärtsgang PWM-Pin, 0 deaktiviert beide)
Das Ziel ist es, analoge Joystick-Signale zu mischen, um folgende Reaktion zu erzielen:
a) Gas vorwärts, Richtung Neutral = Fahrzeug fährt vorwärts
b) Gas vorwärts, Richtung links = Fahrzeug fährt vorwärts und links ab
c) Gas neutral, Richtung links = Fahrzeug links abbiegen IN PLACE, das ist der rechte Motor voll vorwärts, der linke Motor voll rückwärts
... und ähnlich für andere Kombinationen. Natürlich sollte der Ausgang "analog" sein, dh er sollte einen schrittweisen Übergang von beispielsweise von Option a) nach b) nach c) ermöglichen.
Das Konzept lautet:
Antworten:
"Richtiges" Mischen steht zur Debatte :-).
Ein Problem ist, dass Sie entscheiden müssen, wie schnell sich ein Track unter reinen Signalen aus einem einzelnen Pot bewegt und was zu tun ist, wenn Signale aus dem anderen Pot enthalten sind. Wenn Sie beispielsweise den FB-Topf (Vorwärts-Rückwärts-Topf vollständig vorwärts schieben und beide Motoren dann mit voller Geschwindigkeit vorausfahren), wie gehen Sie mit dem Hinzufügen einer kleinen Menge LR-Topf (links-rechts) um Um eine Rotation zu erreichen, muss eine Spur schneller als die andere sein. Wenn Sie also bereits mit beiden Motoren mit maximaler Vorwärtsgeschwindigkeit fahren, müssen Sie die eine oder andere Spurgeschwindigkeit verringern, um sich zu drehen. Aber wenn Sie still gestanden haben hätte die eine oder andere Strecke beschleunigt, um das gleiche Ergebnis zu erzielen.
Alles in allem ist hier eine einfache Startlösung von der Stange, die mir als guter Start erscheint.
Wenn die Töpfe mechanisch unabhängig sind, können beide gleichzeitig zu 100% sein.
Wenn sich beide auf einer Joystick-Anordnung befinden, wenn Yaxis = 100% und Xaxis = 0%, wird durch Hinzufügen von etwas B normalerweise A reduziert. Ein Joystick könnte konstruiert werden, wenn das oben Gesagte nicht zutrifft, aber diese sind ungewöhnlich.
Angenommen, der Joystick ist von dem Typ, dass eine Erhöhung von Y% bei X = 100% X verringert. Andere Annahmen können getroffen werden.
FB = Front-Back-Pot. Mitte Null, + Ve für Vorwärtsbewegung des Topfes
LR = linker rechter Topf. Null zentrieren. + Ve für Topf rechts.
K ist anfangs ein Skalierungsfaktor 1.
Wenn ein Ergebnis 100% überschreitet, stellen Sie K so ein, dass Ergebnis = 100% ist, und verwenden Sie denselben K-Wert auch für andere Motoren.
Als 125 x 0,8 = 100 setze K = 0,8. Dann.
Links = 125 x 0,8 = 100%. Rechts = 80 x 0,8 = 64%.
Dann:
Linker Motor = K x (Front_Back + Left_Right)
Rechter Motor = K x (Front_Back - Left_Right)
Sanity Checks:
LR = 0 (zentriert), FB = voll vorwärts -> Beide Motoren laufen voll vorwärts.
LR = ganz links, FB = 0 ->
Linker Motor läuft voll rückwärts,
rechter Motor läuft voll vorwärts.
Fahrzeug dreht sich gegen den Uhrzeigersinn.
FB war 100%, Lr = 0%. Fügen Sie rechts 10% LR hinzu.
L = FB + LR = 100% - + 10% R = FB-LR = 100% - - 10%
Wenn die größte Achse <100% ist, skalieren Sie bis = 100%.
Skalieren Sie dann die andere Achse um denselben Betrag.
quelle
Hier ist eine Lösung, die keine komplizierten if / else-Ketten erfordert, die Leistung beim Vorwärtsbewegen oder Drehen nicht verringert und glatte Kurven und Übergänge vom Bewegen zum Drehen ermöglicht.
Die Idee ist einfach. Angenommen, die (x, y) Joystickwerte sind kartesische Koordinaten auf einer quadratischen Ebene. Stellen Sie sich nun eine kleinere quadratische Ebene vor, die um 45 ° gedreht ist.
Die Joystick-Koordinaten geben Ihnen einen Punkt im größeren Quadrat, und der gleiche Punkt, der im kleineren Quadrat überlagert ist, gibt Ihnen die Motorwerte. Sie müssen nur die Koordinaten von einem Quadrat in das andere konvertieren und die neuen (x, y) Werte auf die Seiten des kleineren Quadrats beschränken.
Es gibt viele Möglichkeiten, die Konvertierung durchzuführen. Meine Lieblingsmethode ist:
Dies setzt voraus, dass die Anfangskoordinaten (x, y) im Bereich von -1,0 / + 1,0 liegen. Die Seite des inneren Quadrats ist immer gleich
l * sqrt(2)/2
, also geht es in Schritt 4 nur darum, die Werte mit zu multiplizierensqrt(2)
.Hier ist ein Beispiel für eine Python-Implementierung.
Die ursprüngliche Idee für diese Methode - mit einer viel komplizierteren Transformationsmethode - stammt aus diesem Artikel .
quelle
Unten finden Sie ein Beispiel für die Implementierung eines Mischalgorithmus, wie von Russel McMahon beschrieben:
http://www.youtube.com/watch?v=sGpgWDIVsoE
quelle