Die Raspberry-Pi-Kamera und der Bewegungsmelder von TinkerForge im Zusammenspiel

Internet of Things mit Java 8 und TinkerForge, Teil 10

Sven Ruppert
© S&S Media

Bitte lächeln! Heute werden wir uns ein wenig mit der Kombination aus einem TinkerForge-Bewegungsmelder und der Kamera des Raspberry Pi beschäftigen. 

Für den Raspberry Pi kann man eine Kamera kaufen. Diese dann für verschiedene Dinge einzusetzen ist heute das Ziel. Wir werden uns damit beschäftigen, wie man die Kamera in Betrieb nimmt, aber auch, wie sie von Java aus angesteuert werden kann.

Raspberry Pi und die Kamera

Der Raspberry Pi ist ein Allrounder. Das sieht man immer wieder, wenn man sich ein wenig mit den zusätzlichen Add-ons beschäftigt, die es für diesen Kleinrechner gibt. Die Kamera ist recht gut: Sie liefert Bilder in einer Auflösung von bis zu 2592 x 1944 Pixel. Bei einem Preis von ca. 30 EUR ist sie zudem recht günstig. Die Installation besteht eigentlich nur aus zwei Schritten: Der erste ist die mechanische Montage an der dafür vorgesehenen Schnittstelle des Raspberry Pi. Nachdem man der Raspberry Pi erneut gestartet hat, muss man in dem Tool raspi-config den Menüpunkt Enable/Disable camera addon support aktivieren. Fertig ist der Aufbau.

Das erste Bild

Da nun die Kamera aktivierbar ist, stellt sich die Frage, wie man ein Bild damit aufnehmen kann. Das Programm „raspistill“ ist genau dafür gemacht. Ich werde mich hier nur mit der Kommandozeilen-Version beschäftigen, da ich den Raspberry Pi ausschließlich über eine SSH Shell bediene. Mit dem Kommandozeilenaufruf raspistill -o image.jpg wird ein Bild mit dem Namen image.jpg aufgenommen und im aktiven Verzeichnis abgelegt. Das Bild selber kann man z. B. per SCP auf den Rechner versenden, auf dem das Bild betrachtet werden soll.

Ein Beispiel: Der Zeitraffer

Als erstes Beispiel werden wir einen Zeitraffer mit Bordmitteln realisieren. Das ist die Grundlage für spätere Anwendungen. In einem festgelegten Intervall werden Bilder zu definierten Zeitpunkten aufgenommen. Diese Bilder kann man dann nachfolgend zu einem Video zusammenfassen. Fertig ist der Zeitraffer. Als Objekt habe ich hier etwas ausgewählt, was sich möglichst langsam bewegt. Ich habe eine Pflanze, die dringend ein wenig Wasser benötigt, genommen und vor die Kamera gestellt. Nachdem die Aufnahmefunktion gestartet worden ist, habe ich die Pflanze gegossen und dann festgehalten, wie sich die Blätter langsam wieder aufrichten. Der Vorgang benötigt bei dieser speziellen Pflanze ca. 2 Stunden. Die Grundfunktionen sind schon in dem Programm raspistill enthalten. Mit dem Commandline-Aufruf

raspistill -o /home/pi/tmp/zeiraffer/cam_%04d.jpg -n -tl 5000 -t 7200000

werden alle fünf Sekunden Bilder aufgenommen und in dem angegebenen Verzeichnis gespeichert. Der Zusatz %04d in den Dateinamen sorgt dafür, dass der Dateiname bei jedem Bild mit einer aufsteigenden Zahl, beginnend mit 0001, versehen wird. Damit können dann später die Bilder in der richtigen Reihenfolge automatisch zu einem Video verarbeitet werden. Zeiten von unter fünf Sekunden führen oft zu Verlusten einzelner Bilder. Sollte das der Fall sein, so muss für das nachfolgende Verarbeiten die streng monotone Durchnummerierung wieder hergestellt werden. Wird dieses nicht gemacht, bricht der Prozess zur Konvertierung der Bilder in ein Video ab. Das Programm „ffmpeg“ kann mit dem folgenden Befehl gestartet werden: ffmpeg -i cam* zeitraffer.mp4 Das folgende Video zeigt eine Beispielaufnahme:

Starten von externen Prozessen

Der Prozess soll nun von Java aus gestartet werden. Dafür gibt es in Java den ProcessBuilder. Diesen kann man nun verwenden, um die Kommandos zu starten und auf die Ergebnisse zu warten. Eine Besonderheit sei hier vermerkt: Wenn man unter Linux arbeitet, ist es einfach möglich, die getesteten Kommandos inklusive der Parameter in einen String zu verwandeln und zu starten. Unter Windows ist es leider nicht so. Hier ist es notwendig, die Kommandos explizit als Parameter dem Programm „cmd“ zu übergeben. Da auf dem Raspberry Pi Linux zum Einsatz kommt, ist es für uns an der Stelle recht angenehm. In Listing 1 ist zu sehen, wie man einmalig den Prozess startet. In diesem Beispiel wird ein Bild mit der Kamera und unter dem Namen pic_ plus Zeitstempel als JPG aufgenommen. 

public class CamTest {
  public static void main(String[] args) {
    String pFileName = "pic_" + Instant.now();
    try {
      Runtime run = Runtime.getRuntime();
      Process pr = run.exec("raspistill -o " + pFileName + ".jpg");
      pr.waitFor();
    } catch (IOException
        | InterruptedException ex) {
      System.out.println("ex = " + ex);
    }
  }
}

Auslösen per Bewegungsmelder

Um das nun automatisch zu starten, benötigen wir an dieser Stelle noch eine Verbindung zu dem MotionDetector von TinkerForge. Der MotionDetector kann in einem Winkel von 100 Grad Bewegungen in einer Entfernung von bis zu sieben Metern detektieren. Auch hier wird wieder das Event in einem ActionListener, in diesem Fall der BrickletMotionDetector.MotionDetectedListener, ausgewertet. Da es sich hier ausschließlich um eine Ein-Bit Information handelt, gibt es keine Übergabeparameter, wie es bei den Sensoren sonst üblich ist. Wenn wir nun beides zusammenführen, erhalten wir unsere erste Heimüberwachung. In diesem Beispiel werden die Bilder nicht weiterverarbeitet.  

public class MotionDetectorTest {

  public static void main(String[] args) {
    IPConnection con = new IPConnection();
    try {
      BrickletMotionDetector motionDectector = 
          new BrickletMotionDetector("xyz", con);
      con.connect("192.168.0.106",4223);

      motionDectector.addMotionDetectedListener(() -> {
        String pFileName = "pic_" + Instant.now();
        try {
          Runtime run = Runtime.getRuntime();
          Process pr = run.exec("raspistill -o " 
          + pFileName + ".jpg");
          pr.waitFor();
        } catch (IOException
            | InterruptedException ex) {
          System.out.println("ex = " + ex);
        }

      });
    } catch (IOException
        | AlreadyConnectedException e) {
      e.printStackTrace();
    }
  }
}

Fazit

Wir können nun bei ausreichenden Lichtverhältnissen Bilder erzeugen, wenn eine Bewegung detektiert wird. Die Bilder werden in diesem Artikel nicht weiter verarbeitet. Open-Source-Entwickler sind herzlich eingeladen, sich hierbei einzubringen. Wer Interesse hat, meldet sich bitte direkt bei mir – auch bei Ideen, Anregungen oder Fragen. Twitter: @SvenRuppert

Stay tuned. Happy coding!

Die Quelltexte zu diesem Text sind unter [1] zu finden. Wer umfangreichere Beispiele zu diesem Thema sehen möchte, dem empfehle einen Blick auf [2]. 

Geschrieben von
Sven Ruppert
Sven Ruppert
Sven Ruppert arbeitet seit 1996 mit Java und ist Developer Advocate bei Vaadin. In seiner Freizeit spricht er auf internationalen und nationalen Konferenzen, schreibt für IT-Magazine und für Tech-Portale. Twitter: @SvenRuppert
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: