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
Cookie- and privacy policy information
Protects against cross-site request forgery attacks.
Retention period: This cookie remains only for the current browser session.
Saves the current PHP session.
Retention period: This cookie remains only for the current browser session.
This website uses cookies to enable certain functions and to improve the offer.
louis_robot
28.11.23 22:12
Jens
29.11.23 08:59