Raspberry PI 3 LED ansteuern

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)

Verwandte Beiträge

Quellen

http://pi4j.com/example/control.html

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert