- Official Post
Ansteuerung der GPIO Ports mit Pi4J
Halli Hallo,
Ich möchte euch einfach mal zeigen wie ihr eure GPIO Ports mittels Pi4J ansteuern könnt
Ich werde versuchen einiges zu erklären aber ein gewisses Grundwissen in Elektrotechnik und Java solltet ihr für diese Anleitung schon mit bringen.
Inhalt
- Vorbereitung
- Ansteuerung einer LED
- Taster abfragen
- kleines Spielchen
Vorbereitung
Auf dem Pi sollte folgendes Installiert sein:
- Java (JRE reicht)
- WiringPi
Da die Entwicklung von Java Programmen auf dem Pi sehr umständlich ist, ist es besser auf dem PC zu programmieren ![]()
Dazu sollte folgendes installiert sein:
- Java (JDK)
- Filetransfer Programm (zbs WinSCP)
- Eclipse | IntelliJ | Netbeans
- Pi4J runterladen
Sobald ihr Pi4J runter geladen habt und ein neues Eclipse Projekt geöffnet habt, müsst ihr den lib Ordner direkt in euer Projekt Verzeichnis kopieren und in den Buildpath einbinden.
Erst dann können die Pi4J Funktionen auch genutzt werden. Außerdem ist eine kleine Einarbeitung in Eclipse ratsam ![]()
Ansteuerung einer LED
Zunächst werden wir eine einfache LED zum leuchten und danach zum blinken bringen.
Diesen Teil könntet ihr auch auf Webseite von Pi4J unter den Beispiel Control nachlesen
Bauplan
Um eine LED anzusteuern brauchen wir fast nichts, außer einer LED und einen Vorwiderstand.
Doch wie hoch muss dieser Vorwiderstand sein? Dazu gibt es eine Formel mit der Ihr den Wert berechnen könnt.
Mehr zu dieser Berechnung kann man im Elektronik Kompendium nachlesen.
Ich werde den GPIO Port 1 für die LED benutzen.
So oder Ähnlich könnte eurer Schaltplan dann aussehen:![]()
Software
Kommen wir nun zur Software...
Egal was ihr mit Pi4J vorhabt - Ihr braucht einen GpioController... dieser bietet diverse funktionen an um
die GPIO Ports anzusteuern. Alles weitere erleutere ich mit Kommentaren im Quellcode ![]()
Die Pin belegung von Pi4J / WiringPi entspricht nicht den tatsächlichen Pins. Siehe hier
"Beispiel Software zur LED ansteuerung"
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class LEDAnsteuerung {
public static void main(String[] args) throws InterruptedException {
System.out.println("<--Pi4J--> GPIO LED Example ... started.");
// Erstellt einen GpioController welcher diverse Funktionen anbietet um
// Ein- Ausgabe Operation durchzuführen.
final GpioController gpio = GpioFactory.getInstance();
// Stellt den GPIO Port 1 als einen Ausgangs-Pin bereit. Dieser GPIO Pin
// sollte direkt auf HIGH geschaltet sein
final GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "LED", PinState.HIGH);
System.out.println("--> LED Zustand: ON");
// Kleine Pause...
Thread.sleep(5000);
// Schalte den Pin aus
pin.low();
System.out.println("--> LED Zustand: OFF");
Thread.sleep(5000);
// Soweit so gut... die LED kann an oder aus geschaltet werden
// Nun wollen wir aber die LED noch 20x Blinken lassen
// Dazu lassen wir die while Schleife 20x durchlaufen...
int count = 20;
while (count > 0) {
// ...und schalten den Pins unabhaengig vom Zustand an oder aus
pin.toggle();
// getState gibt uns informationen zu dem Zustand des Pins
System.out.println("--> LED Toogle: " + pin.getState());
Thread.sleep(1000);
count--;
}
// Wichtig
// Wenn ihr die GPIOs nicht mehr braucht dann solltet ihr diese auch
// schliessen... Oeffnen koennt ihr wieder mit dem
// GpioFactory.getInstance() welches
// euch ein neuen GpioController zur verfuegung stellt
gpio.shutdown();
System.out.println("<--Pi4J--> GPIO LED Example ... exit.");
}
}
Display More
Wenn ihr mit dem Programm soweit fertig seit könnt ihr das Projekt als Ausführbare JAR exportieren und es zbs. via WinSCP auf euren Pi verschieben.
Auf dem Pi könnt ihr unter root (oder sudo) euer Programm mit folgendem Befehl ausführen:
Taster abfragen
Ich werde hier einen einfach mechanischen Taster verwenden. Auch Pi4J liefert hierzu ein Beispiel.
Bauplan
Auf dem Raspberry Pi sind bereits Pullup Widerstände eingebaut, somit brauchen wir kein extra Widerstand in unserer Schaltung einbauen.
Der Taster wird auf GPIO Port 2 geschaltet sein

Software
Auch hier wieder die Klasse inclusive Kommentare:
"Beispiel Software zur Taster ansteuerung"
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
public class TasterAnsteuerung {
public static void main(String[] args) throws InterruptedException {
System.out.println("<--Pi4J--> GPIO Taster Example ... started.");
// Erstellt einen GpioController welcher diverse Funktionen anbietet um
// Ein- Ausgabe Operation durchzuführen.
final GpioController gpio = GpioFactory.getInstance();
// Stellt den GPIO Port 2 als einen Eingangs-Pin bereit. Zusaetzlich
// wird der interne Pullup Widerstand eingeschaltet
// somit braucht man selbst keinen Widerstand einbauen in die
// Schaltung...
final GpioPinDigitalInput taster = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02, PinPullResistance.PULL_DOWN);
// Erstellt ein neues Objekt welches die GPIO Pins "abhoeren" kann
taster.addListener(new GpioPinListenerDigital() {
// Jedesmal wenn irgendetwas auf dem Pin passiert (High / Low) wird
// folgende Methode aufgerufen
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
// display pin state on console
System.out.println(" --> GPIO PIN Zustand hat sich veraendert: " + event.getPin() + " = " + event.getState());
// Optional sollte hier gewartet werden um das prellen des
// Tasters zu vermeiden...
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// Damit das Programm nicht gleich einfach aufhoert kann eine
// endlos-Schleife erzeugt werden und verhindert somit das beenden
// Abbrechen kann nur der Nutzer via (CTRL+C)
while (true) {
Thread.sleep(500);
}
}
}
Display More
Zur ausführung gilt das gleiche wie bei dem LED Projekt (Export; auf den Pi verschieben; starten) ![]()
Kleines Spielchen
Das alles war relativ viel theoretisch und irgendwie gar nicht spaßig ... Daher sollte an dieser Stelle auch noch etwas spaßiges auf dem Plan stehen ![]()
Wenn ihr die Schritte zuvor erledigt habt dann habt ihr die Hardware schon zusammen...
"Kleines Beispiel Spielchen"
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;
public class Spielchen implements GpioPinListenerDigital {
private GpioController gpio;
private GpioPinDigitalInput taster;
private GpioPinDigitalOutput led;
private boolean running = false;
private long startTime = 0;
private long endTime = 0;
public Spielchen() {
this.gpio = GpioFactory.getInstance();
this.led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, "LED", PinState.LOW);
this.taster = gpio.provisionDigitalInputPin(RaspiPin.GPIO_02, PinPullResistance.PULL_DOWN);
this.taster.addListener(this);
}
public void start() throws InterruptedException {
System.out.println("--> Starte Spielchen");
this.running = true;
this.led.low();
for (int i = 5; i > 0; i--) {
System.out.println("--> start in: " + i);
Thread.sleep(1000);
}
System.out.println("--> LOS!!!: ");
this.startTime = System.currentTimeMillis();
this.led.high();
while (this.running) {
Thread.sleep(500);
}
long dif = this.endTime - this.startTime;
System.out.println("--> Reaktionszeit: "+dif +"ms");
if(dif < 300){
System.out.println("--> super reaktion!!!");
}
else if(dif < 1000){
System.out.println("--> toll gemacht!");
}
else if(dif > 1000){
System.out.println("--> Du hast reflexe wie ein Faultier!!");
}
this.gpio.shutdown();
}
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
this.endTime = System.currentTimeMillis();
this.led.low();
System.out.println("--> Fertig");
this.running = false;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//nichts...
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("<--Spielchen--> kleines GPIO Spielchen ... init.");
Spielchen spiel = new Spielchen();
Thread.sleep(1000);
spiel.start();
System.exit(0);
}
}
Display More
Das wars dann auch schon
Hoffentlich hilft es euch bei dem ein oder anderem Problem weiter...
auch noch ein lieben Gruß an Steeef für die Idee des Spielchen ![]()
Wenn ich wieder mal ein wenig Zeit habe werde ich ein Tutorial erstellen zum Thema, wie man mit Pi4J auch aus dem Web auf die GPIO Ports zugreifen kann...
viele Grüße
Turael
Anhang:
Eclipse Projekt mit allen Beispielen GPIOAnsteuerung.zip