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

12/2019
RasPi-Alternativen

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Grußbotschaften

    Mit Sonic Pi zaubern Sie komplexe Sounds, die Sie bei Bedarf sogar noch während des Abspielens modifizieren.

  • Das Runde und das Eckige

    Mit dem MCP4725 ergänzen Sie einen RasPi um einem D/A-Wandler, der bei Bedarf noch weitere Funktionen erfüllt.

  • Alles unter Kontrolle

    Schon ein einfaches Mikrocontrollerboard wie das CY8CKIT-049-42xx bietet erstaunlich viele Möglichkeiten beim Ansteuern von Hardware.

  • Viele Kerne

    Das Spresense Development Board von Sony lässt sich mit der Arduino IDE programmieren und bringt auch ein eigenes Entwickler-SDK mit.

  • Exotische Früchte

    Der aus China stammende Orange Pi positioniert sich mit einem guten Preis und interessanten Features gegen die RasPi-Truppe. Kann er sich auch behaupten?

  • Flexibler Surfer

    Mit dem neuen RasPi 4 setzen Sie einen öffentlichen Webkiosk schnell und kostengünstig auf.

  • Auskunftsfreudig

    Viele Devices, so auch der E.ON-Aura-Controller, verwenden eine Schnittstelle namens REST, um Zustandsdaten zu übermitteln. Mit ein wenig Bastelei lesen Sie diese auch über Ihr Smartphone aus.

  • Doppelt gemessen

    Mit wenig Aufwand und einem Pi Zero realisieren Sie einen mobilen Zweikanal-Spannungsprüfer.

  • Elegant zusammengeführt

    Tizonia streamt Musik von Online-Quellen und lokalen Sammlungen. Die schlanke Architektur macht den Player zur guten Wahl für den Einsatz auf dem RasPi.

  • Kommunikativ

    Nicht jeder traut sich zu, sein eigenes Smartphone zu bauen. Allerdings kann jeder Linux-Nutzer den Raspberry Pi im Handumdrehen zu einem VoIP-Telefon aufrüsten.