Raspberry Pi – GPIO Pins unter Java verwenden
In diesem Beitrag zeige ich euch wie man GPIO Pins unter Java verwenden kann. Wie so oft hat sich recht schnell eine kleine Community gebildet, die für Java eine einfach zu benutzende Bibliothek zusammengestellt hat um unter Java alles aus dem Raspberry Pi heraus zu holen.
Raspberry Pi – GPIO Pins unter Java verwenden
Als Basis einer einfachen Java Implementierung der GPIO Ansteuerung ist die Bibliothek pi4j die man von der pi4j Webseite laden kann. Nach fast 2 Jahren Stillstand wurde Ende April 2018 wieder eine neue Version veröffentlicht, die unter anderem auch den aktuellen Raspberry Pi 3 unterstützt. Grund genug sich das einmal näher anzusehen. Dem einen oder anderen treuen Leser wird aufgefallen sein, dass Java Themen langsam mehr werden in meinem Blog…
pi4j verwenden
Im folgenden zeige ich in einem einfachen Beispiel die Verwendung von pi4j. Falls ihr nur wenig bis keine Java Kenntnisse habt ist das kein Problem, ich beschreibe Schritt für Schritt wie man den Java Quellcode kompiliert und ausführt. Zuerst holen wir uns die aktuelle Version von pi4j:
wget http://get.pi4j.com/download/pi4j-1.1.zip unzip pi4j-1.1.zip
Nun haben wir das komplette Package zur weiteren Verwendung am Pi. Wir können die pi4j Bibliothek auch gleich testen, denn mit den *.jar Dateien der einzelnen Bibliotheken gibt es auch eine ganze Reihe von Beispielen im examples Ordner. Wir nehmen uns eines davon heraus und kompilieren es mit folgendem Befehl:
javac -cp ../lib/pi4j-core.jar:. ControlGpioExample.java
Wir sehen nun, dass der Java Compiler eine *.class Datei erstellt hat.
Wir können nun deshalb aus dem aktuellen Verzeichnis heraus dieses Programm wie folgt aufrufen:
java -cp ../lib/pi4j-core.jar:. ControlGpioExample
Mit dem Parameter -cp geben wir den Classpath an, darin muss sich die verwendete Bibliothek befinden, das ist in unserem Fall die pi4j core JAR Datei. Anstatt eines erfolgreichen Programmlaufs bekommen wir eine Fehlermeldung:
Unable to determine hardware version. I see: Hardware : BCM2835 , - expecting BCM2708 or BCM2709.
Laut dieser wird der BCM2708 bzw. BCM2709 Baustein auf der Hardware nicht gefunden, eine neuere Versionsnummer BCM2835 aber schon. Das ist offenbar ein Problem mit der aktuellen Raspberry Pi 3 Hardware. Nach einiger Recherche war die überwiegende Meinung, dass nicht pi4j sondern WiringPi schuld an dem Problem seien.
Problem lösen (1. Ansatz)
Bevor wir das Problem lösen, sollten wir uns über die aktuell installierte Version von GPIO informieren:
gpio -v
Wir wollen nun auf die aktuellste Version von WiringPi wechseln, deshalb schmeißen wir kurzerhand die über den Paketmanager von Linux installierte Version weg:
sudo apt-get purge wiringpi hash -r
Im folgenden holen wir uns die aktuellste Version von WiringPi über Git. Sollte Git auf deinem Raspberry Pi noch nicht installiert sein, dann kannst du das wie folgt ändern:
sudo apt-get install git-core
Wir holen uns nun den aktuellen WiringPi Source Code, am besten ins pi home Verzeichnis:
cd git clone git://git.drogon.net/wiringPi
Wir brauchen den Code nur noch kompilieren:
cd ~/wiringPi ./build
Mit dem build Skript wird WiringPi kompiliert und auch gleich installiert. Ein neuerlicher Aufruf von gpio -v zeigt uns nun, dass wir eine aktuellere Version haben:
Funktioniert nun das pi4j Programm?
Obwohl GPIO nun in jedem Fall die aktuellste Version hat funktioniert es nicht. Offenbar besteht das Problem doch bei pi4j.
Problem lösen (2. Ansatz)
Nachdem pi4j Version 1.1 offenbar das Problem ist gibt es nur noch einen Ansatz, wir verwenden statt dem 1.1 Release den 1.2 Snapshot von pi4j. Wir wiederholen nun deshalb die Schritte vom „pi4j verwenden“ Absatz dieses Artikels, jedoch laden wir den Snapshot:
wget http://get.pi4j.com/download/pi4j-1.2-SNAPSHOT.zip unzip pi4j-1.2-SNAPSHOT.zip
Funktioniert nun das pi4j Programm?
Ja!
Warum Java?
Der Raspberry Python Interpreter (wie er tatsächlich heißt) hat ja bereits die beliebte Sprache Python im Namen, folglich ist es besonders einfach unter Python mit den GPIO Pins zu arbeiten. Ich habe darüber bereits ausführlich in GPIO in der Praxis berichtet. Weiters kann man auch recht einfach mit der GPIO Schnittstelle und einem einfachen Bash Script arbeiten. Daneben bietet sich Java vor allem deshalb an:
- beliebte Sprache
- läuft auf jeder Hardware
- „echte“ Programmiersprache (wird nicht zur Laufzeit übersetzt)
- einfache Einbindung in existierende Java Applikationen
Warum man aber persönlich Java verwendet muss jeder Entwickler für sich entscheiden. Aktuell ist es immer noch so, dass mehr Java als Python Entwickler gesucht werden. Die Sprache am Pi zu lernen ist also nie ein Fehler!
Fazit
Ich habe gezeigt wie man GPIO Pins unter Java verwenden kann. Wie so oft gibt es eine gute Bibliothek mit der man recht schnell ein eigenes Programm zur Steuerung der angeschlossenen Sensoren oder Hardware realisieren kann. Java ist dabei eine beliebte Objekt orientierte Hochsprache die so auch einen sinnvollen Einsatz am Raspberry Pi erhält.
Nach anfänglichen Schwierigkeiten hab ich euch recht gut dokumentiert, wie man bei einem Problem vorgeht und systematisch alle Fehlerquellen beseitigt. Für Raspberry Pi 3 Besitzer sei erwähnt, dass man unbedingt pi4j 1.2 verwenden muss, die früheren Versionen sind mit älteren Raspberry Pi Modellen kompatibel, nicht jedoch mit dem aktuellen Pi 3.
Wer von euch hatte Java am Raspberry Pi schon laufen? Welche Java Applikationen für den Pi kennt ihr bzw. habt ihr im Einsatz?