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

04/2019
TV & Multimedia

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Finger weg

    Ein Temperatursensor verrät, ob Sie einen Gegenstand gefahrlos berühren dürfen. Beim Messen brauchen Sie dabei noch nicht einmal Kontakt zum Objekt.

  • Aus einer Hand

    Um einen Mikrocontroller zu programmieren, genügt ein Raspberry Pi. Wir zeigen, was Sie dazu noch benötigen.

  • Im Gleichtakt

    Synchronisierte Live-Loops und selbst erstellte Funktionen helfen dabei, Sonic Pi wie ein Live-Instrument zu spielen.

  • Mach mal

    Das Ftduino-Modul schlägt die Brücke zu Fischertechnik und ermöglicht es unter anderem, einen Drei-Achsen-Roboter anzusteuern.

  • Eleganter Diener

    Jeden Morgen dieselben Handgriffe, um zu sehen, ob die S-Bahn fährt und wie das Wetter wird? Ein cleverer Infoscreen auf RasPi-Basis automatisiert den Vorgang.

  • Bienenflüsterer

    Bienenzüchter, die ihre Völker besser kennenlernen möchten, müssen die fleißigen Insekten nicht pausenlos stören. Mit einem Raspberry Pi und verschiedenen Sensoren überwachen sie Temperatur, Luftfeuchtigkeit und bald auch das Gewicht des Bienenstocks.

  • Beerige Musik

    Für echten Hi-Fi-Sound braucht es mehr als einen kleinen Bluetooth-Brüllwürfel. Mit Volumio und einem Raspberry Pi rüsten Sie Ihre klassische Hi-Fi-Anlage mit smarten Funktionen auf.

  • Ton ab!

    Auf den ersten Blick erscheint der RasPi zu schwachbrüstig für den Betrieb leistungshungriger DAW-Software. Doch der Schein trügt.

  • Himbeer-TV

    Der DVB TV µHAT rüstet den Raspberry Pi mit einem DVB-T/T2-Tuner auf. Die deutsche TV-Landschaft schränkt dessen Möglichkeiten allerdings ein.

  • Git à la RasPi

    Mit wenigen Handgriffen zum Git-Hoster: Die dezentrale Arbeitsweise von Git erleichtert in Kombination mit der Netzwerkfähigkeit des RasPi das Verwalten von Quellcode.