Motoren

Jetzt beginnen wir mit den Motoren, die den Antrieb des Joy-Cars darstellen. Mit den Motoren kannst du das Joy-Car sowohl vorwärts als auch rückwärts bewegen. Außerdem kannst du die Geschwindigkeit individuell anpassen, das Fahrzeug in verschiedene Richtungen lenken und es bei Bedarf abbremsen. Die Motoren bieten dir somit die volle Kontrolle über die Bewegungen deines Joy-Cars, sodass du sowohl präzise Manöver als auch dynamisches Fahren umsetzen kannst.
Mehr Informationen zu den Motoren findest du hier.
Im folgenden Codebeispiel werden die möglichen Bewegungen des Joy-Cars ausführlich dargestellt. Das Joy-Car kann sich nicht nur in den Grundrichtungen vorwärts, rückwärts, nach rechts und nach links bewegen, sondern auch in einem festgelegten Radius fahren. Dies ermöglicht dem Joy-Car komplexere Fahrmanöver, indem es sanfte Kurven und Wendungen vollziehen kann. Die Steuerung der Bewegung erfolgt dabei über spezifische Befehle, die jeweils die gewünschte Richtung und gegebenenfalls den Radius der Kurve definieren. So kann das Joy-Car flexibel und präzise durch verschiedene Umgebungen navigiert werden.
Fahren

Fahre vorwärts oder rückwärts. Die Geschwindigkeit kannst du zusätzlich in Prozent zwischen 0 (kein Antrieb) und 100 (maximaler Antrieb) wählen.
Bremsen

Bremse das Joy-Car bis zum Stillstand. Du kannst hier zusätzlich wählen zwischen einer harten Vollbremsung oder einem sanften Bremsen, bei dem das Joy-Car langsam ausrollt.
Kurven

Fahre eine Links- oder Rechtskurve. Auch hier kannst du die Geschwindigkeit in Prozent einstellen. Zusätzlich kannst du das Radius-Level der Kurve von 0 - 5 angeben (0 = Enge Kurve, 5 = Weite Kurve).
PWM-Signal

Die Motoren können auch direkt über PWM-Signale angesteuert werden. Dazu kann an jeden Kanal ein PWM-Wert zwischen 0 und 255 gesendet werden.
Codebeispiel
JoyCar.initJoyCar(RevisionMainboard.OnepThree)
basic.forever(function () {
JoyCar.drive(FRLRDirection.Forward, 100)
basic.pause(2000)
JoyCar.drive(FRLRDirection.Reverse, 100)
basic.pause(2000)
JoyCar.turn(
FRDirection.Forward,
LRDirection.Left,
100,
0
)
basic.pause(2000)
JoyCar.turn(
FRDirection.Forward,
LRDirection.Right,
100,
0
)
basic.pause(2000)
JoyCar.stop(StopIntensity.Intense)
basic.pause(2000)
JoyCar.turn(
FRDirection.Forward,
LRDirection.Left,
50,
4
)
basic.pause(1000)
JoyCar.turn(
FRDirection.Reverse,
LRDirection.Right,
50,
2
)
basic.pause(1000)
})
Vorbereitung für Motoren
Zunächst aktivieren wir die Motorensteuerung, indem wir die entsprechenden Befehle über die I2C-Schnittstelle senden.
Dies ermöglicht die Kommunikation zwischen dem Mikrocontroller und den Motoren. Um die Motoren präzise und effizient anzusteuern, nutzen wir die Variablen biasL
und biasR
. Diese Variablen dienen dazu, die Drehgeschwindigkeiten der linken und rechten Motoren in Prozent zu justieren. Dies ist besonders wichtig, um Abweichungen auszugleichen, die durch Verschleiß, Fertigungstoleranzen oder andere Einflüsse entstehen können, und sorgt dafür, dass das Joy-Car geradeaus fährt oder präzise Manöver durchführen kann.
# PWM-Controller initialisieren
i2c.write(0x70, b'\x00\x01')
i2c.write(0x70, b'\xE8\xAA')
# die Verzögerung einer Motorverzögerung kann verwendet werden, um unterschiedliche Motordrehzahlen zu kompensieren
biasR = 0 # Verzögerung des rechten Motors in Prozent
biasL = 0 # Verzögerung des linken Motors in Prozent
Motorensteuerung
Die Methode drive
ermöglicht die Steuerung der beiden Motoren des Joy-Cars. Dabei steuern die PWM-Signale PWM0
und PWM1
den linken Motor, während PWM2
und PWM3
für den rechten Motor zuständig sind. Innerhalb der Methode werden die Eingabewerte zunächst skaliert, um die Motoren aneinander anzupassen, falls Unterschiede in den Drehgeschwindigkeiten auftreten. Diese Skalierung berücksichtigt die zuvor definierten Korrekturfaktoren wie biasL
und biasR
.
Am Ende der Methode wird die berechnete Motorengeschwindigkeit über die I2C-Schnittstelle an den Motorcontroller gesendet, der die Adresse 0x70
verwendet. Dies stellt sicher, dass die Steuerbefehle präzise umgesetzt werden und die Motoren entsprechend der gewünschten Geschwindigkeit arbeiten.
# Motoren mit dem PWM-Controller steuern
# PWM0 und PWM1 für den linken Motor und PWM2 und PWM3 für den rechten Motor
def drive(PWM0, PWM1, PWM2, PWM3):
# Die Skalierungsfunktion wird verwendet, um die Bias-Variablen
# für die Berechnung der Motordrehzahl skaliert
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
# Skalierung des Verzögerungswertes auf den Wert in Prozent
PWM0 = int(PWM0 * (scale(biasR, 0, 100, 100, 0) / 100))
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
# das Byte mit dem PWM-Wert wird zu dem Byte für den Kanal addiert
i2c.write(0x70, b'\x02' + bytes([PWM0]))
i2c.write(0x70, b'\x03' + bytes([PWM1]))
i2c.write(0x70, b'\x04' + bytes([PWM2]))
i2c.write(0x70, b'\x05' + bytes([PWM3]))
Kurven fahren
# Methode zum Drehen mit Orientierung, Richtung, Geschwindigkeit und Radius
def turn(orientation, direction, speed, radius):
# radius: 0-5
if radius > 0:
# Berechnung der inneren Radgeschwindigkeit
innerWheelSpeed = (speed * 0.7) * (radius / 5)
else:
return
# die Motoren entsprechend einstellen
if orientation == "forward":
if direction == "left":
drive(0, speed, 0, innerWheelSpeed)
elif direction == "right":
drive(0, innerWheelSpeed, 0, speed)
elif orientation == "backwards":
if direction == "left":
drive(speed, 0, innerWheelSpeed, 0)
elif direction == "right":
drive(innerWheelSpeed, 0, speed, 0)
Codebeispiel
# Notwendige Bibliotheken importieren
from microbit import *
# Definiere deine Joy Car Mainboard Revision
joycar_rev = 1.3
# Initialisierung der I2C-Schnittstelle für das Joy Car Mainboard
i2c.init(freq=400000, sda=pin20, scl=pin19)
# PWM-Controller initialisieren
i2c.write(0x70, b'\x00\x01')
i2c.write(0x70, b'\xE8\xAA')
# die Verzögerung einer Motorverzögerung kann verwendet werden, um unterschiedliche Motordrehzahlen zu kompensieren
biasR = 0 # Verzögerung des rechten Motors in Prozent
biasL = 0 # Verzögerung des linken Motors in Prozent
# Motoren mit dem PWM-Controller steuern
# PWM0 und PWM1 für den linken Motor und PWM2 und PWM3 für den rechten Motor
def drive(PWM0, PWM1, PWM2, PWM3):
# Die Skalierungsfunktion wird verwendet, um die Bias-Variablen
# für die Berechnung der Motordrehzahl skaliert
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
# Skalierung des Verzögerungswertes auf den Wert in Prozent
PWM0 = int(PWM0 * (scale(biasR, 0, 100, 100, 0) / 100))
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
# das Byte mit dem PWM-Wert wird zu dem Byte für den Kanal addiert
i2c.write(0x70, b'\x02' + bytes([PWM0]))
i2c.write(0x70, b'\x03' + bytes([PWM1]))
i2c.write(0x70, b'\x04' + bytes([PWM2]))
i2c.write(0x70, b'\x05' + bytes([PWM3]))
# Methode zum Drehen mit Orientierung, Richtung, Geschwindigkeit und Radius
def turn(orientation, direction, speed, radius):
# radius: 0-5
if radius > 0:
# Berechnung der inneren Radgeschwindigkeit
innerWheelSpeed = (speed * 0.7) * (radius / 5)
else:
return
# die Motoren entsprechend einstellen
if orientation == "forward":
if direction == "left":
drive(0, speed, 0, innerWheelSpeed)
elif direction == "right":
drive(0, innerWheelSpeed, 0, speed)
elif orientation == "backwards":
if direction == "left":
drive(speed, 0, innerWheelSpeed, 0)
elif direction == "right":
drive(innerWheelSpeed, 0, speed, 0)
while True:
# mit voller Kraft vorwärts fahren
drive(0, 255, 0, 255)
sleep(2000)
# Mit voller Kraft rückwärts fahren
drive(255, 0, 255, 0)
sleep(2000)
# Mit voller Kraft nach links fahren
drive(0, 255, 255, 0)
sleep(2000)
# Mit voller Kraft nach rechts fahren
drive(255, 0, 0, 255)
sleep(2000)
# stop
drive(0, 0 , 0, 0)
sleep(2000)
# eine Linkskurve vorwärts mit 50% Geschwindigkeit und Radius 4 machen
turn("forward", "left", 128, 4)
sleep(1000)
# mache eine Rechtskurve rückwärts mit 50% Geschwindigkeit und Radius 2
turn("backwards", "right", 128, 2)
sleep(1000)