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

06/2019
Home Improvement

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Verschlungene Pfade

    Mit Schleifen, Fallunterscheidungen und Funktionen programmieren Sie komplexe Skripte auf einfache und elegante Weise.

  • Extrem genau

    Mit einem A/D-Wandler messen Sie bei Bedarf Spannungen. Der MCP3424 macht dabei konstruktionsbedingt eine gute Figur.

  • Verbindungsaufnahme

  • Süßer Wecker

    Dem RasPi fehlen sowohl eine Echtzeituhr als auch ein BIOS, ein zeitgesteuertes Wecken erfordert also Zusatzkomponenten. Hier springt der Witty Pi Mini in die Bresche, ein µHAT von UUGear.

  • Windows to go

    Das Aufsetzen zuverlässiger und sicherer Remote-Desktop-Lösungen erfordert einiges Know-how. Die RasPi-basierte Pinbox von Pintexx reduziert den Konfigurationsaufwand auf ein Minimum.

  • Prima Klima

    In Museen ist es Pflicht, zu Hause nützlich: das permanente Prüfen und zentrale Erfassen der Feuchtigkeit und Temperatur in Räumen.

  • Auf einen Blick

    Ein maßgeschneiderter Infoscreen auf RasPi-Basis mit stromsparendem E-Ink-Display zeigt Termine, Bilder, Mitteilungen und Wetterinformationen an.

  • Sanft berührt

    Mit einem RasPi und dem Controllermodul PiXtend lassen sich mühelos Roboterarme ansteuern und deren Bewegung automatisieren.

  • Popcorn-Kino

    Mit Kodi 18.0 unterstützt LibreELEC 9.0 jetzt die von vielen Streaming-Diensten genutzte DRM-Verschlüsselung. Die Integration von Netflix, Amazon und Co. erfordert allerdings Handarbeit.

  • So nah und doch so fern

    Der RasPi kommt häufig als Server oder Steuerrechner für spezielle Zwecke zum Einsatz. Mit Anydesk erhalten Sie dazu eine Steuersoftware mit grafischer Oberfläche.