Aus Raspberry Pi Geek 12/2017

Gruselspaß zu Halloween mit dem RasPi (Seite 4)

Programm

Listing 5 zeigt das Steuerprogramm des Projekts, aus Platzgründen in gekürzter Form. Den vollständigen Quelltext finden Sie auf der Heft-DVD. Es dient als Beispiel, wie Sie die gruseligen Gesellen zum Leben erwecken. Es steht Ihnen frei, es anzupassen oder auch nur Teile davon zu verwenden.

Die Funktion init() initialisiert alle GPIOs. Da wir fast nur Outputs verwenden, initialisieren wir sie mit einer Schleife, eine weitere behandelt die Inputs. Für jeden der drei Gesellen existiert eine Funktion move(), die über “sprechende” Variablennamen (arm, head, eyes, …) die relevanten GPIOs ansteuert. In diesen Funktionen nehmen Sie auch Anpassungen der Servopositionen vor. Falls Sie beim Anschließen einige GPIOs verwechselt haben, lässt auch das sich in dieser Funktion geradeziehen. Als Übergabeparameter für die Funktion move() fungieren die Werte für den Software-PWM-Generator der Wiring-Pi-Bibliothek.

Bei den in diesem Projekt verwendeten Servos stellt 14 die Mittelposition dar, 23 den Maximal- und 5 den Minimalwert. Diese Werte hängen von den verwendeten Servos ab, Sie müssen sie entsprechend anpassen. Testen Sie deswegen vor dem Einbau, welche Werte die von Ihnen verwendeten Servos für bestimmte Positionen benötigen. Beachten Sie auch den spiegelverkehrten Einbau der Servos auf den beiden Seiten: 5 bedeutet für die eine Seite unten, für die andere aber oben.

Die action()-Funktionen bündeln die unterschiedlichen Bewegungen zu einer kleinen Choreografie, in die Sie auch Sounddateien einbinden. Die Funktion loop() fragt kontinuierlich die Inputs ab und startet die entsprechende action()-Funktion beim Drücken eines Schalters am Funkmodul. Innerhalb der Endlosschleife befindet sich ein time.sleep(), der das Programm verlangsamt und damit dafür sorgt, dass es nicht zu viel CPU-Zeit mit der Abfrage der Schalter verwendet.

Die etwas knifflige Funktion move_quax() enthält die Logik zum Steuern der Getriebemechanik. Wir gehen hier davon aus, dass Quax entspannt in seiner Lauerposition hängt. Kommt von der Fernsteuerung das Signal, gibt der RasPi über GPIO14 die Kupplung frei. Quax saust dann nach unten, wo er fünf Sekunden wartet. Danach koppelt das Getriebe wieder ein, und GPIO16 aktiviert den Motor, der die Spinne wieder hochzieht. Oben angekommen, berührt sie den Taster, der Motor stoppt an der Ausgangsposition. Da der RasPi auch ihn über ein PWM-Signal ansteuert, lassen sich Geschwindigkeit und Kraft an den mechanischen Aufbau anpassen.

Alles in allem fällt dieser Part des Projektes am kompliziertesten aus. Es kostet einige Zeit, den Servo, den Motor und die Kupplung so aneinander anzupassen, dass sie einwandfrei arbeiten.

Um das Programm zu starten, geben Sie auf der Kommandozeile den Befehl sudo python halloween.py ein. Achten Sie darauf, die Python-Skripte mit Root-Rechten laufen zu lassen.

Listing 5

 

import os
import time
import wiringpi
def init():
  wiringpi.wiringPiSetup()
  i=0
  while i < 17:
    if (i<8) or (i>12):
      wiringpi.pinMode(i, wiringpi.GPIO.PWM_OUTPUT)
      wiringpi.softPwmCreate(i,0,100)
    else:
      wiringpi.pinMode(i, wiringpi.GPIO.INPUT)
    i=i+1
def loop():
  while True:
    if wiringpi.digitalRead(11)==1:
      print "A pressed"
      action_skeleton1()
[...]
    if wiringpi.digitalRead(8)==1:
      print "D pressed"
      action_quax()
    time.sleep(0.1)
def move_tekla(eyes,legs,sleep):
  wiringpi.softPwmWrite(15,eyes)
  wiringpi.softPwmWrite(13,legs)
  time.sleep(sleep)
def move_quax():
  # Kupplung frei geben
  wiringpi.softPwmWrite(14,10)
  time.sleep(0.3)
[...]
  wiringpi.softPwmWrite(16,23)
  # warten bist Taster gedrueckt wird
  while wiringpi.digitalRead(12)!=1:
    time.sleep(1)
  # Motor aus schalten
  wiringpi.softPwmWrite(16,0)
  wiringpi.softPwmWrite(14,0)
def move_skeleton(eye_l,eye_r, head, \
teeth,arm_r_v, arm_r_h, arm_l_v, arm_l_h, sleep):
  wiringpi.softPwmWrite(0,eye_r)
[...]
  wiringpi.softPwmWrite(7,arm_l_h)
  time.sleep(sleep)
def action_tekla():
  for i in xrange(0,10):
    move_tekla(100,0,0.1)
[...]
  move_tekla(0,0,0)
def action_quax():
  move_quax()
def action_skeleton1():
  # 5=unten, 14=Mitte, 23=oben
  os.system("/usr/bin/mpg123 -a hw:1,0 /home/pi/sound.mp3 &")
  for i in xrange(0,10):
    move_skeleton(100,100,0,5,0,0,0,0,0.5)
    move_skeleton(10,10,0,23,0,0,0,0,0.5)
    move_skeleton(0,0,0,0,0,0,0,0,0.5)
def action_skeleton2():
  move_skeleton(100,100,0,0,0,0,0,0,0.5)
[...]
  move_skeleton(0,0,0,0,0,0,0,0,0.5)
init()
loop()

Fazit

In Projekten wie diesem stellt der Raspberry Pi unter Beweis, wie vielseitig und flexibel er sich einsetzen lässt. Wegen seiner vielschichtigen und keineswegs trivialen Aufgabenstellungen eignet sich das Halloween-Trio eher für erfahrene Bastler mit Elektronik-Know-how und Programmierkenntnissen. Vor allem das Skelett bietet wegen seiner vielfältigen Bewegungsmöglichkeiten aber noch reichlich Potenzial für Verbesserungen. 

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 9 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