Last Updated on 31. Mai 2019 by sfambach
Hier der erste Versuch eine LED mit dem Raspberry PI 3 anzusteuern. Aufgebaut wird das Ganze auf einem Brotboard mit Freiluft-Verkabelung.
Hardware
PI3 (oder älter bitte auf die richtigen Pins achten)
LED (Ich habe ne grüne Standard-Led 1,5V)
220 Ohm (Vorwiderstand für die LED)
Brot-Board (zum leichteren Aufbau)
Diverse Kabel ( Vorgefertigte Pin-Header Kabel)
Aufbau
Schaltplan
Verdrahtung
Software
Entwicklungsumgebung
Als Entwicklungsumgebung habe ich zum ersten mal BlueJ auf dem PI verwendet. Mir gefällt daran, dass man hier mit Klassendiagrammen erst einmal die Struktur definiert und im nächsten Schritt mit dem gleichen Tool die Implementierung realisieren kann.
Ein weiterer Vorteil bietet die Testumgebung. Es ist möglich Instanzen von Klassen per Knopfdruck zu erstellen und deren Methoden mit ein paar Klicks zu testen.
Code
LED-Klasse
Klasse zur Steuerung einer LED mit den Methoden On, Off und Toggle.
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.GpioPin;
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class Led
{
// instance variables - replace the example below with your own
private GpioPinDigitalOutput pin;
/**
* Constructor for objects of class Led
*/
public Led(Pin pinId)
{
if(pinId == null){
pinId = RaspiPin.GPIO_01;
}
GpioController gpio = GpioFactory.getInstance();
try{ // create gpio controller
pin = gpio.provisionDigitalOutputPin(pinId);
} catch(Exception e){
// sollte er noch offen sein schliess mal alles und versuche es nochmal
gpio.shutdown();
gpio.unprovisionPin(gpio.getProvisionedPins().toArray(new GpioPin[]{}));
gpio = GpioFactory.getInstance();
pin = gpio.provisionDigitalOutputPin(pinId);
}
}
void on(){
pin.high();
}
void off(){
pin.low();
}
void toggle(){
if(pin.isHigh()){
pin.low();
}else {
pin.high();
}
}
public void close(){
GpioController gpio = GpioFactory.getInstance();
gpio.unprovisionPin(gpio.getProvisionedPins().toArray(new GpioPin[]{pin}));
}
}
Der Try/Catch Block im Konstruktor ist dem Umstand geschuldet, dass meine ersten Tests auch mal schief gingen und dann die GPIOs nicht frei gegeben wurden.
Die Freigabe mache ich aktuell wenig elegant im Konstruktor. Schöner wäre vorher abzufragen ob der Pin schon initialisiert wurde und dann entsprechend weiter zu machen.
Test-Klasse
Klasse mit Main-Methode zum Testen der LED Klasse. In der Main-Methode ist eine Endlosschleife, welche die LED in einem Intervall von 2 Sekunden an und wieder aus schaltet.
public class TestLED
{
// instance variables - replace the example below with your own
private int x;
/**
* Constructor for objects of class TestLED
*/
public void main(String args[])
{
Led led = new Led(null);
while (true){
led.toggle();
try{
Thread.sleep(2000);
} catch(InterruptedException ex){
// do nothing
}
}
}
}
Tips
Starten des Programms als Root
Die GPIOs müssen als Root angesprochen werden. Im BlueJ gibt es in den Einstellungen einen Button aber dieser scheint nicht richtig initialisiert zu sein. Diesen einfach nochmal rausnehmen und wieder setzten, die Einstellungen speichern, dann sollte es gehen.
Fehlende pi4j Klassen
Wenn es beim compilieren Probleme mit fehlen pi4j Klassen gibt muss das entsprechende Paket installiert werden. (Hier gibt es Hilfe)
LED geht nicht an
Die LED geht einfach nicht an, evtl. mal mit GPIO auf der Console testen. Vielleicht stimmt die Verdrahtung nicht, es fehlen Einstellungen oder die Pinbelegung stimmt nicht (Hier gibt es Hilfe dazu)