Aus Raspberry Pi Geek 09/2025

Fischertechnik Maker Kit Omniwheels (Teil 2)

© Computec

Omnidirektional

Martin Mohr

Im ersten Teil dieses Artikels haben wir den kleinen Transportroboter aus dem Fischertechnik Maker Kit Omniwheels aufgebaut und mit einer Elektronik zur Steuerung versehen. Nun erwecken wir das Gefährt zum Leben.

Die Bibliothek zur Ansteuerung der WS2812 RGB-LEDs haben wir bereits im vorhergehenden Artikelteil [1] installiert. Die Lichter dienen dazu, auf das autonome Gefährt aufmerksam zu machen und so unbeabsichtigte Kollisionen zu vermeiden. In Listing 1 sehen Sie ein kleines Beispielprogramm, das sich für einen Testlauf eignet.

Nachdem Sie sämtliche Bibliotheken importiert haben, erzeugen Sie ein Objekt leds (Zeile 10). Es bildet die realen LEDs als Array ab. Dabei übergeben Sie außerdem die zum Aufbau passenden Parameter. Danach folgt die Initialisierung des Objekts leds.begin(). Ab sofort können Sie die einzelnen LEDs im Array mit Farbwerten beschreiben. Bitte beachten Sie die Farbreihenfolge beim Color-Befehl (grün, rot, blau).

In der While-Schleife lassen Sie die Variable i (Zeile 13) bei jeden Durchlauf um eins erhöhen. Mit dem Modulo-Operator erzeugen Sie aus i eine sich immer wiederholende Zahlenfolge von 0 bis 3. So lassen Sie die LEDs reihum aufleuchten. Das Ausschalten der LEDs erledigen Sie über i-1 in Zeile 16. Zu guter Letzt schreiben Sie das mit dem Kommando leds.show() in die realen LEDs.

Listing 1

Testprogramm für die LEDs (ws2812.py)

import time
from rpi_ws281x import PixelStrip, Color
LED_COUNT = 4        # Anzahl der LED?s.
LED_PIN = 10             # GPIO Pin (SPI).
LED_FREQ_HZ = 800000  # Taktrate der LEDs
LED_DMA = 10          # DMA Kanal
LED_BRIGHTNESS = 32  # Helligkeit (0-255)
LED_INVERT = False    # Signal invertieren
LED_CHANNEL = 0       # PWM Kanal (nicht ändern)
leds = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
leds.begin()
#grün, rot, blau
i=1
while True:
        leds.setPixelColor(i%4, Color(0,255,0))
        leds.setPixelColor((i-1)%4, Color(0,0,0))
        i=i+1
        leds.show()
        time.sleep(0.2)

Distanzsensor

Der Distanzsensor wird mit einem Impuls am TRIGGER-Eingang gestartet und erzeugt am ECHO-Ausgang ein Signal. Die Länge des Signals entspricht dabei der gemessenen Entfernung. Anschließend braucht es nur noch die Umrechnung der Impulslänge in Zentimeter zur Weiterverwendung. Listing 2 enthält ein Beispielprogramm, um den Sensor abzufragen.

Listing 2

distanz_test.py

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
TRIGGER = 12
ECHO = 6
GPIO.setup(TRIGGER, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
def messure():
    GPIO.output(TRIGGER, True)
    time.sleep(0.00001)
    GPIO.output(TRIGGER, False)
    while GPIO.input(ECHO) == 0:
        start = time.time()
    while GPIO.input(ECHO) == 1:
        stop = time.time()
    return ((stop-start) * 34300) / 2
while True:
    print ("%.1f cm" % messure())
    time.sleep(1)

Liniensensor

Bei unserem Liniensensor handelt es sich um eine Infrarotreflexlichtschranke. Je nachdem, ob das Licht zurückgeworfen wird oder nicht, schaltet sie um. So lassen sich beispielsweise berührungslose Schalter oder auch ein Liniensensor aufbauen.

Bei Letzterem müssen Sie dafür sorgen, dass zwischen Linie und Hintergrund ein möglichst hoher Farbkontrast besteht. So kann der Sensor den Übergang gut erkennen. Die Reichweite und damit auch die Empfindlichkeit stellten Sie über das Potentiometer auf dem Sensor ein. Ein Programm zum Test des Sensors im Fahrzeugaufbau finden Sie in Listing 3.

Listing 3

sensor_test.py

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
SENSOR = 5
GPIO.setup(SENSOR, GPIO.IN)
while True:
        print(not(GPIO.input(SENSOR)))
        time.sleep(0.2)

Impulsgeber

Im ersten Teil des Artikels kamen schon kurz die Impulsgeber in den Motoren zur Sprache. Wenn der Motor sich bewegt, kommen sehr schnell viele Impulse zusammen. Mit linearer Programmierung lässt sich nicht adäquat auf diese Signale reagieren. Deshalb müssen Sie auf die Möglichkeit der Interruptverarbeitung zurückgreifen. Dabei wird der aktuelle Programmablauf unterbrochen, sobald ein Ereignis aufritt, um darauf reagieren. Danach läuft das ursprüngliche Programm wieder an.

Die Codestückchen, die solche Ereignisse verarbeiten, heißen Handler. Der Code in den Handlern muss sich auf ein Minimum beschränken, um den Ablauf von anderen Programmteilen nicht zu beeinträchtigen. In unserem Fall benötigen wir für die Impulsgeber der Motoren Handler. Sie binden sie an bestimmte Ereignisse an den Eingängen des RasPis, zum Beispiel fallende oder steigende Flanke.

Über die Anzahl der Impulse lässt sich die zurückgelegte Strecke ermitteln. Hierbei kann man einen Wert von ungefähr 68 Impulsen pro 10 Zentimeter Fahrstrecke annehmen. Da dieser Wert jedoch mit Toleranzen behaftet ist, müssen Sie ihn gegebenenfalls anpassen. Die vollständige Beschreibung, wie es zu diesem Wert kommt, finden Sie in der entsprechenden Dokumentation [2].

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben