Aus Raspberry Pi Geek 06/2015

Mit dem RasPi zu Halloween richtig spuken (Seite 2)

Listing 2

 

$ gpio readall
 +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+

Java und Pi4j einrichten

Haben Sie die WiringPi-Library auf dem RasPi eingerichtet, fahren Sie im nächsten Schritt mit der Installation des aktuellen Java-Development-Kits (JDK) von Oracle fort. Sie laden es direkt von der Oracle-Homepage [6] herunter.

TIPP

Nutzen Sie Linux, übertragen Sie das Paket zum Beispiel mittels SFTP auf den RasPi. Anwender, die kein Linux verwenden, erledigen diesen Schritt mit Winscp [7].

Um das JDK auf dem Raspberry zu installieren, legen Sie zunächst einen neuen Ordner dafür an. Der Unix Filesystem Hierarchy Standard (FHS) sieht für zusätzliche Software das Verzeichnis /opt/ vor. Daher speichern Sie das JDK genau dort ab (Listing 3, Zeile 1 bis 3). Jetzt teilen Sie dem System noch mit, wo es die neue Java-Version findet (Zeile 4) und – zu guter Letzt – dass Sie ab jetzt ebendiese verwenden möchten (Zeile 5).

Listing 3

 

$ sudo mkdir -p -v /opt/java
$ gunzip jdk-8u51-linux-arm-vfp-hflt.tar.gz
$ sudo tar -xvf jdk-8u51-linux-arm-vfp-hflt.tar -C /opt/java/
$ sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/jdk1.8.0_51/bin/java" 1
$ sudo update-alternatives --set java /opt/java/jdk1.8.0_51/bin/java

Damit steht das Oracle-JDK nun zum Einsatz bereit. Nun starten Sie einen kleinen Test, um zu sehen, ob die frische Installation fehlerfrei arbeitet (Listing 4). Eine Kleinigkeit gilt es noch anzupassen: Einige Programme erwarten, dass Sie die Umgebungsvariable JAVA_HOME korrekt gesetzt haben. Um diese nur für die aktuelle Session manuell anzupassen, verwenden Sie das folgende Kommando:

$ export JAVA_HOME="/opt/java/jdk1.8.0_51/bin"

Für erste Versuche genügt es bereits, die Variable stattdessen mit in die eigene ~/.bashrc aufzunehmen (Listing 4). Nach dem nächsten Login haben Sie die Variable dann in der Umgebung Ihres Accounts. Um die Variable systemweit für alle Benutzer zu setzen, passen Sie als root die Datei /etc/environment entsprechend an.

Listing 4

 

$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b07)
Java HotSpot(TM) Client VM (build 25.51-b07, mixed mode)
$ javac -version
javac 1.8.0

Listing 5

 

$ echo 'export JAVA_HOME="/opt/java/jdk1.8.0_51/bin"' >> ./.bashrc

Zu guter Letzt steht nun die Installation der Pi4j-Bibliothek an. Der schnellste Weg besteht darin, die Library direkt aus dem Internet zu laden (Listing 6, Zeile 1). Die Entwickler der Pi4j-Library haben, um uns das Leben etwas leichter zu machen, das Pi4j Utility Script geschrieben. Es setzt den Klassenpfad richtig, damit sich kleine Java-Programme schnell und einfach kompilieren und testen lassen. Der Befehl pi4j --? zeigt eine umfangreiche Hilfe, mit dem Befehl pi4j -c übersetzen Sie Programme (Listing 6, Zeile 2). Meldet der Aufruf keine Fehler zurück, erstellt er für den kompilierten Code eine gleichnamige Class-Datei im aktuellen Verzeichnis, die sich direkt ausführen lässt (Zeile 3).

Listing 6

 

$ curl -s get.pi4j.com | sudo bash
$ pi4j -c Java-Programm
$ pi4j -r Class-Datei

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.

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