Zum Inhalt springen
BetaEN
Lektion 2 von 8Robotik mit LEGO SPIKE

Robotik mit LEGO SPIKE · Lektion 2 · 30 Minuten

Fahren mit der DriveBase

Das lernst du

  • Zwei Motoren zu einer DriveBase verbinden
  • Mit straight(), turn() und arc() genau fahren
  • Bewegungen mit wait=False nebenbei überwachen

Der Code in dieser Lektion stammt aus dem Buch „Python für Roboter“, Kapitel 2.4 und 2.5, und läuft hier unverändert im Simulator. Zum Buch bei Amazon ↗

Zwei Motoren als Team

Ein fahrender Roboter hat meist zwei Antriebsmotoren, einen links und einen rechts. Damit du nicht jeden Motor einzeln steuern musst, gibt es die DriveBase: Du sagst ihr nur „fahr 20 cm geradeaus“ oder „dreh dich um 90 Grad“, und sie rechnet aus, wie sich jedes Rad drehen muss.

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase

hub = PrimeHub()

# Ein Motor pro Rad, jeweils am eigenen Port
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)

# DriveBase braucht den Rad-Durchmesser und den Radabstand in Millimetern
# (beides an deinem Roboter nachmessen und hier eintragen!)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

# Geradeaus fahren: 200 Millimeter (20 cm)
antrieb.straight(200)

# Auf der Stelle drehen: 90 Grad nach rechts
antrieb.turn(90)

# Rueckwaerts fahren
antrieb.straight(-100)

Die DriveBase braucht zwei Maße in Millimetern: den Raddurchmesser (wheel_diameter) und den Radabstand (axle_track). Am echten Roboter misst du sie nach – im Simulator passen 56 und 114 genau.

Merke: Die beiden Motoren sind spiegelverkehrt eingebaut. Deshalb bekommt der linke Motor Direction.COUNTERCLOCKWISE und der rechte Direction.CLOCKWISE.

Schleifen machen Figuren

Mit einer for-Schleife wird aus vier Fahrbefehlen ein Quadrat. Mit settings() stellst du Tempo und Drehgeschwindigkeit ein:

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase

hub = PrimeHub()
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

# Geschwindigkeit und Beschleunigung individuell einstellen:
# (Geschwindigkeit mm/s, Drehrate Grad/s, Beschleunigung, Drehbeschleunigung)
antrieb.settings(straight_speed=150, straight_acceleration=200,
                  turn_rate=100, turn_acceleration=200)

# Ein kleines Quadrat abfahren
for seite in range(4):
    antrieb.straight(150)
    antrieb.turn(90)

Probier im Simulator auch das Tempo 2× oder 4× aus, wenn dir der Roboter zu langsam ist.

Kurven fahren

arc() fährt einen Bogen: zuerst der Radius in Millimetern, dann der Winkel.

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase

hub = PrimeHub()
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

# arc(radius_mm, winkel_grad): faehrt einen Bogen mit 200mm Radius, 90 Grad.
# Positiver Radius = Bogen nach rechts, positiver Winkel = vorwaerts.
antrieb.arc(200, 90)

Nebenbei etwas tun: wait=False

Normalerweise wartet dein Programm, bis eine Bewegung fertig ist. Mit wait=False startet die Bewegung nur – und dein Programm läuft sofort weiter. So kannst du während der Fahrt etwas messen:

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
from pybricks.tools import wait

hub = PrimeHub()
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

# wait=False: Der Befehl startet die Bewegung, blockiert aber NICHT.
antrieb.straight(500, wait=False)

# Waehrend der Roboter faehrt, koennen wir parallel etwas ueberwachen
while not antrieb.done():
    strecke_bisher = antrieb.distance()
    print(f"Bereits gefahren: {strecke_bisher} mm")
    wait(100)

print("Bewegung abgeschlossen!")

antrieb.done() ist True, sobald die Fahrt beendet ist, und antrieb.distance() liefert die bisher gefahrene Strecke.

Deine Aufgabe

Jetzt bist du dran

Übung 2.4 aus dem Buch: Fahre mit einer for-Schleife ein gleichseitiges Dreieck mit 200 mm Seitenlänge ab. Tipp: An jeder Ecke muss sich der Roboter um 120 Grad drehen (360 Grad geteilt durch 3 Ecken). Am Ende soll er wieder an seinem Startpunkt stehen.

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase

hub = PrimeHub()

# Ein Motor pro Rad, jeweils am eigenen Port
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)

# DriveBase braucht den Rad-Durchmesser und den Radabstand in Millimetern
# (beides an deinem Roboter nachmessen und hier eintragen!)
antrieb = DriveBase(linker_motor, rechter_motor,
                     wheel_diameter=56, axle_track=114)

# Geradeaus fahren: 200 Millimeter (20 cm)
antrieb.straight(200)

# Auf der Stelle drehen: 90 Grad nach rechts
antrieb.turn(90)

# Rueckwaerts fahren
antrieb.straight(-100)

Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.

Lösung anzeigen

Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase

hub = PrimeHub()
linker_motor = Motor(Port.A, positive_direction=Direction.COUNTERCLOCKWISE)
rechter_motor = Motor(Port.B, positive_direction=Direction.CLOCKWISE)
antrieb = DriveBase(linker_motor, rechter_motor, wheel_diameter=56, axle_track=114)

for seite in range(3):
    antrieb.straight(200)
    antrieb.turn(120)