Servomotor

 

Das Joy-Car ist mit zwei Servomotoren ausgestattet, die beide direkt auf dem Mainboard angeschlossen werden können. Diese Servomotoren bieten eine zusätzliche Möglichkeit, das Joy-Car um bewegliche Komponenten zu erweitern.

Ein typisches Beispiel für die Verwendung eines Servomotors ist die Steuerung eines Ultraschallsensors. Durch den Servomotor kann der Sensor gedreht oder geneigt werden, um in verschiedenen Richtungen Hindernisse oder Abstände zu messen. Dies erweitert die Funktionalität des Joy-Cars und macht es vielseitiger in Anwendungen wie Hindernisvermeidung oder freien Fahren.

Servomotoren werden, ähnlich wie die Scheinwerfer, mithilfe von PWM-Signalen (Pulsweitenmodulation) angesteuert. Diese Signale ermöglichen es, die Position der Servomotoren präzise zu steuern, indem die Breite der Impulse variiert wird. Weitere Informationen zur Funktionsweise und Anwendung von PWM findest du hier.

 

Im folgenden Codebeispiel wird gezeigt, wie beide Servomotoren des Joy-Cars mithilfe ihrer jeweiligen Kanäle angesteuert und gedreht werden können. Jeder Servomotor ist einem separaten Kanal zugeordnet, wodurch sie unabhängig voneinander gesteuert werden können.

Servomotor ansteuern

Die beiden optionalen Servomotoren können hiermit angesteuert und in einem Winkel zwischen 0 und 180 Grad eingestellt werden.

Codebeispiel

JoyCar.initJoyCar(RevisionMainboard.OnepThree)
basic.forever(function () {
    JoyCar.servo(1, 0)
    JoyCar.servo(2, 180)
    basic.pause(1000)
    JoyCar.servo(1, 90)
    JoyCar.servo(2, 90)
    basic.pause(1000)
    JoyCar.servo(1, 180)
    JoyCar.servo(2, 0)
    basic.pause(1000)
})

Setup Servomotor

 

Um die Servomotoren mit einem micro:bit anzusteuern, werden Pin 1 und Pin 13 für die Steuerung konfiguriert. Dabei wird die analoge Periode auf 10 Mikrosekunden(entspricht 100 kHz) eingestellt, was für die meisten Servomotoren geeignet ist.

# Pins für Servomotor einrichten
pin1.set_analog_period(10)
pin13.set_analog_period(10)

Ansteuerung Servomotor

Die Methode servo dient zur Steuerung der Servomotoren des Joy-Cars. Dabei wird über den Parameter channel festgelegt, welcher Servomotor angesteuert werden soll, und über den Parameter position die Zielposition des Servomotors in Grad, im Bereich von 0 bis 180 Grad, definiert.

Zu Beginn der Methode wird überprüft, ob die angegebene Position innerhalb des zulässigen Bereichs liegt. Falls die Position außerhalb des Intervalls von 0 bis 180 liegt, wird ein entsprechender Fehler zurückgegeben. Anschließend wird für den gewählten Kanal ein PWM-Signal (Pulsweitenmodulation) generiert, das die gewünschte Position des Servomotors festlegt. Dieses Signal steuert die Länge der Impulse. Die Methode gewährleistet, dass der Servomotor präzise die angeforderte Position einnimmt.

# Methode zur Positionsänderung bei Servomotoren
def servo(channel, position):
    # Methode zur Skalierung von 0-180 (°) auf 100-200 (us)
    def scale(num, in_min, in_max, out_min, out_max):
        # Rückgabe des auf eine ganze Zahl gerundeten Werts
        return (round((num - in_min) * (out_max - out_min) /
                (in_max - in_min) + out_min))
    # Prüfen, ob die Position im Bereich liegt
    if position < 0 and position > 180:
        return "position not in range"
    # Position an den ausgewählten Kanal senden
    if channel == 1:
        pin1.write_analog(scale(position, 0, 180, 100, 200))
    elif channel == 2:
        pin13.write_analog(scale(position, 0, 180, 100, 200))

Codebeispiel

# Notwendige Bibliotheken importieren
from microbit import *

# Definiere deine Joy Car Mainboard Revision
joycar_rev = 1.3

# Pins für Servomotor einrichten
pin1.set_analog_period(10)
pin13.set_analog_period(10)

# Methode zur Positionsänderung bei Servomotoren
def servo(channel, position):
    # Methode zur Skalierung von 0-180 (°) auf 100-200 (us)
    def scale(num, in_min, in_max, out_min, out_max):
        # Rückgabe des auf eine ganze Zahl gerundeten Werts
        return (round((num - in_min) * (out_max - out_min) /
                (in_max - in_min) + out_min))
    # Prüfen, ob die Position im Bereich liegt
    if position < 0 and position > 180:
        return "position not in range"
    # Position an den ausgewählten Kanal senden
    if channel == 1:
        pin1.write_analog(scale(position, 0, 180, 100, 200))
    elif channel == 2:
        pin13.write_analog(scale(position, 0, 180, 100, 200))

while True:
    # Servomotor auf Kanal 1 auf 0° einstellen
    servo(1, 0)
    # Servomotor auf Kanal 2 auf 180° einstellen
    servo(2, 180)
    sleep(1000)

    # Stellmotor auf beiden Kanälen auf 90° einstellen
    servo(1, 90)
    servo(2, 90)
    sleep(1000)

    # Servomotor auf Kanal 1 auf 180° einstellen
    servo(1, 180)
    # Servomotor auf Kanal 2 auf 0° einstellen
    servo(2, 0)
    sleep(1000)