Mit dem RasPi zu Halloween richtig spuken

Das Geister-Programm

Das komplette Programm für unser Halloween-Gespenst finden Sie auf der Heft-DVD. Nach den in Java üblichen Importen definiert es die Klasse, in der sich die main()-Methode befindet. Im zweidimensionalen Array eye[][] stecken alle Daten, um mithilfe der LEDs die "Augen" und den "Mund" zu erzeugen. Beim Berechnen der Werte für die Anzeige handelt es sich um eine zwar einfache, aber recht zeitaufwendige Aufgabe.

Listing 7 zeigt einen der entscheidenden Abschnitte, der einen Input-Port für den PIR-Sensor definiert. An diesen Port hängen Sie jetzt einfach einen Event-Listener mit einer anonymen Klasse des Typs GpioPinListenerDigital(). In dieser Klasse überschreiben Sie die Methode handleGpioPinDigitalStateChangeEvent() mit Ihrem eigenen Code.

Listing 7

 

final static File soundFile = new File("gost.wav");
static AudioInputStream audioIn=null;
static Clip clip=null;
public static void main(String args[])throws Exception  {
  final GpioController gpio = GpioFactory.getInstance();
  final GpioPinDigitalInput pir = gpio.provisionDigitalInputPin(RaspiPin.GPIO_00,PinPullResistance.PULL_DOWN);
  audioIn = AudioSystem.getAudioInputStream(soundFile);
  clip = AudioSystem.getClip();
  clip.open(audioIn);
  pir.addListener(new GpioPinListenerDigital() {
    @Override
    public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
      if((event.getState()==PinState.HIGH) && !running) {
        running=true;
        System.out.println("wake up");
        eyeOpen();
        slp(1000);
        gost.clip.setFramePosition(0);
        gost.clip.start();
        spuk();
        spuk();
        spuk();
        eyeClose();
        eyeInit();
        slp(60000);
        gost.clip.stop();
        running=false;
      }
    }
  });
  int fd = Spi.wiringPiSPISetup(SPI_CHANNEL, 1000000);
  if (fd <= -1) {System.out.println("Can't init SPI");return;}
  init(SPI_CHANNEL, MODULES, INTENSITY);
  initBuffer();
  eyeInit();
  SoftPwm.softPwmCreate( 1, 0, 100 );
  SoftPwm.softPwmCreate( 2, 0, 100 );
  SoftPwm.softPwmWrite( 1, 20 );
  SoftPwm.softPwmWrite( 2, 10 );
  SoftPwm.softPwmWrite( 1, 0 );
  SoftPwm.softPwmWrite( 2, 0 );
  slp(1000*60*60*10);// 10 Stunden bleibt das Programm aktiv
} //main

Als Erstes prüfen Sie, ob der Pin auf HIGH steht. Damit verhindern Sie, dass das Gespenst weiterspukt, wenn der PIR-Sensor wieder abschaltet. Damit der Rechner die Methode nicht mehrmals ausführt, setzt das Skript die Variable running, die dafür sorgt, dass der Code nur einmal läuft. Die folgenden Methoden haben sprechende Namen, aus denen sich ergibt, was Sie tun.

Das Programm spielt die WAV-Datei asynchron ab: Es läuft also weiter, sobald das Abspielen begonnen hat, und wartet nicht etwa, bis die Audiodatei zu Ende gelaufen ist. Darum ruft es die Methode spuk() dreimal hintereinander auf: Die Zeit, die diese drei Aufrufe benötigen, entspricht ziemlich genau der Abspieldauer des WAV-Files.

Alles Wichtige spielt sich also in diesem Abschnitt ab. Bei der Methode slp() handelt es sich um einen Wrapper für die Java-Methode Thread.sleep(), der das lästige Try/Catch versteckt. Am Ende der Methode handleGpioPinDigitalStateChangeEvent() erkennen Sie noch einen Aufruf von slp(). Er verhindert, dass das Gespenst in einer Tour spukt. Die vorgegebene Zeitspanne passen Sie ganz nach Bedarf an.

Die Methode main() enthält nur Schritte zum Initialisieren der Hardware. Listing 8 zeigt einen weiteren wichtigen Abschnitt des Codes: die Methode copyBufferToLed(). Sie überträgt den lokalen Puffer, der sich in der Variablen buffer[][] befindet, über die SPI-Schnittstelle in die LED-Module. Alle für die Animationen zuständigen Methoden, wie etwa eyeClose(), arbeiten zunächst nur auf dem lokalen Puffer.

Listing 8

 

public static void copyBufferToLed(){
  byte packet[] = new byte[MODULES*2];
  for (int row = 0; row <= 7; row++) {
    for (int col = 0; col < MODULES; col++) {
      packet[0+(2*col)] = (byte)(row+1);
      packet[1+(2*col)] = (byte) buffer[col][row];
      Spi.wiringPiSPIDataRW(0, packet, MODULES * 2);
    }
  }
}

Die Servomotoren steuern Sie mit den Softpwm-Methoden der Pi4j-Bibliothek an, was überraschend gut klappt. Sollten Sie in einem Projekt jedoch eine etwas genauere Steuerung von Servos benötigen, lohnt es sich, auf das Projekt Servoblaster zurückzugreifen.

Zu guter Letzt gibt es noch eine Reihe von Methoden, die für das Initialisieren der SPI-Geräte zuständig sind. Um diese zu verstehen, sollten Sie das Datenblatt des MAX7219 [8] genau studieren. Anschließend übertragen Sie das Programm auf den RasPi, beispielsweise via SFTP. Auf dem Raspberry Pi kompilieren und starten Sie das Programm dann (Listing 9). Jetzt steht dem Halloween-Spuk nichts mehr im Weg: Sobald sich jemand in die Nähe des "Gespenstes" begibt, geht es los.

Listing 9

 

$ pi4j -c gost.java
+ javac -classpath '.:classes:*:classes:/opt/pi4j/lib/*' -d . gost.java
$ pi4j -r gost
+ sudo java -classpath '.:classes:*:classes:/opt/pi4j/lib/*' gost

Fazit

Dieses Projekt zeigt wieder einmal, wozu der kleine Raspberry Pi fähig ist. Das Programm beweist, dass die Pi4j-Bibliothek es ermöglicht, sehr elegant auf Hardware zuzugreifen. Dabei dient die vorgestellte Spuk-Software nur als Beispiel, wie sich ein solches Gespenst konstruieren ließe, und lässt sich nach Belieben anpassen und weiter ausbauen. So könnte der Geist etwa grimmiger heulen oder mehr Möglichkeiten bieten, um mit seiner Umgebung zu interagieren. Relativ unwahrscheinlich ist aber, dass er selbst die Tür aufmacht und Süßigkeiten verteilt. Dennoch werden die kleinen Besucher sicher viel Spaß mit dem Halloween-RasPi haben. 

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

02/2019
Neue Energien

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Scheibchenweise

    Zu den Stärken von Sonic Pi gehört es, mit wenigen Zeilen Code Samples dynamisch auszuwählen und zu zerlegen.

  • Unter Strom

    Für einen kleinen Spannungsmesser wie den INA3221 gibt es viele Einsatzmöglichkeiten. Wir zeigen, wie Sie den flexiblen Baustein richtig verdrahten.

  • Vermittlungsstelle

    Fischertechnik-Modelle bieten sich zum Fernsteuern an. Mit dem Ftduino schlagen Sie die Brücke zwischen dem RasPi und dem Technik-Spielzeug.

  • Durchgeschlängelt

    Mit den M0-Boards steigen Sie unkompliziert in die Welt der Mikrocontroller ein – ganz ohne C-Kenntnisse.

  • Gesiebt und gefiltert

    Filter und Werbeblocker einzurichten ist besonders auf Smartphones aufwendig. Den eBlocker hingegen schließen Sie einfach nur an Ihren Router an.

  • Es werde Licht

    Wollen Sie bei beginnender Dämmerung nicht ständig die Helligkeit der heimischen Beleuchtung nachregeln, überlassen Sie das einfach einem RasPi – der macht es automatisch.

  • Energiekontrolle

    Der Gesetzgeber erschwert das Direktvermarkten von Strom durch technische Hürden: So muss sich die Einspeisung etwa aus der Ferne abschalten lassen. Der RasPi löst das Problem.

  • H<->2<->-Power

    Gilt es, Energie aus einer regenerativen Quelle zu speichern, erweist sich die Kombi aus einer Brennstoffzelle und dem RasPi als ideale Lösung.

  • Kleine Wolke

    Lokale Cloud-Lösungen im Heimnetz finden immer mehr Nutzer. Mit dem RasPi und Seafile haben Sie eine Lösung zur Hand, die selbst professionellen Ansprüchen genügt.

  • Planvoll verdrahtet

    Die Leiterplattendesign-Software KiCad leistet trotz einer etwas umständlichen Bedienung auch Hobbybastlern gute Dienste.