Hallo,


wie genau ergeben sich biasR und biasL?


Wenn bspw. der rechte Motor nur 9 Umdrehungen macht während der linke Motor bei gleicher Dauer und gleichem PWM-Wert 10 Umdrehungen macht, gilt dann biasR=10?


Wofür sind die Werte in_min/max und out_min/max [nbsp]in der scale Funktion gedacht? Welche Einstellmöglichkeiten habe ich damit?


Sollte entsprechend dem Code-Beispiel unten nicht biasR dafür sorgen, dass PWM2 und PWM3 verringert werden und umgekehrt? Ansonsten würde ja der sowieso schon langsamere rechte Motor einen noch geringeren PWM-Wert erhalten, weshalb er noch langsamer wird.


Gibt es die Möglichkeit die unterschiedlichen Motordrehzahlen mithilfe des Speed-Sensoren so zu regeln, dass der Roboter (einigermaßen) geradeaus fährt? Wenn ja, wie kann ich das umsetzen?


LG Louis


[nbsp]


Code aus "motor_control+bias.py"


# Durch die Verzögerung eines Motors kann eine durch produktionsbedingte
# Toleranzen unterschiedliche Drehzahl der Motoren ausgeglichen werden.
biasR = 0 # Verzögerung des rechten Motors in Prozent
biasL = 0 # Verzögerung des linken Motors in Prozent

# Die scale Funktion wird genutzt um die bias-Variablen für
# die Berechnung der Motorgeschwindigkeit umzuskalieren.
def scale(num, in_min, in_max, out_min, out_max):
return (num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

# Motoren mithilfe des PWM Controllers steuern
# PWM0 und PWM1 für den linken und PWM2 und PWM3 für den rechten Motor
def drive(PWM0, PWM1, PWM2, PWM3):
# Skalierung des Verzögerungswerts in den Wert in Prozent mit dem
# der Motor drehen soll. Bsp: bias = 5 wird in 95 umgewandelt
# und anschliessend durch 100 geteilt. 255 * (95/100).
PWM0 = int(PWM0 * (scale(biasR, 0, 100, 100, 0) / 100))
# Wiederholen des Vorgangs für alle 4 Kanäle
PWM1 = int(PWM1 * (scale(biasR, 0, 100, 100, 0) / 100))
PWM2 = int(PWM2 * (scale(biasL, 0, 100, 100, 0) / 100))
PWM3 = int(PWM3 * (scale(biasL, 0, 100, 100, 0) / 100))
# Wert für PWM Kanal (0-255) an PWM Controller übertragen.
# 0x70 ist die I2C Adresse des Controllers. b'\x02 ist
# das Byte für den PWM Kanal 1. Zu dem Byte für den
# Kanal wird das Byte mit dem PWM Wert zu addiert.
i2c.write(0x70, b'\x02' + bytes([PWM0]))
# Wiederholen des Vorgangs für alle 4 Kanäle
i2c.write(0x70, b'\x03' + bytes([PWM1]))
i2c.write(0x70, b'\x04' + bytes([PWM2]))
i2c.write(0x70, b'\x05' + bytes([PWM3]))

louis_robot

28.11.23 22:12

Hallo louis_robot,


mit dem bias wird der Verzögerungswert für den entsprechenden Motor in Prozent angegeben. Ein bias-Wert von beispielsweise 5 wird also in eine gedrosselte Motorleistung von 95% umgewandelt.


Die Werte in_min, in_max, out_min und out_max werden für die Skalierungsfunktion benötigt. Hier wird ein Wert (num) von einem bestehenden Wertebereich (in_min bis in_max) in einen neuen Wertebereich (out_min bis out_max) skaliert.


In der Werkstatt haben wir bereits viele Beispielcodes, auch für MicroPython. Eine Kombination der Speed-Sensoren und der Motorgeschwindigkeit haben wir hier aktuell allerdings leider noch nicht.


Liebe Grüße
Jens

Jens

29.11.23 08:59