Lokale Peripheriefunktionen

I. GPIO (General Purpose Input/Output)

In diesem Tutorial wird gezeigt, wie mit Hilfe der Klasse GPIO über Java direkt auf digitale Ein-/Ausgabe-Kanäle der JControl-Geräte zugegriffen und damit extern angeschlossene Hardware gesteuert werden kann.

Vorraussetzungen: Für dieses Tutorial wird eine Installation der JControl-Tools sowie ein JControl-Modul (SmartDisplay, Stamp, Sticker oder PLUI) benötigt.

Download: http://www.jcontrol.org/examples/RelayExample.zip Dieses Tutorial mit allen Quelltexten und Ressourcen als JControl/IDE-Projekt (ZIP-Archiv).




Die GPIO-Kanäle

Die Klasse GPIO ist die hardwarenächste Klasse der JControl-API. Mit dieser Klasse können die universellen digitalen Ein-/Ausgabekanäle (GPIO-Kanäle) eines JControl-Moduls direkt angesteuert werden. Dazu stehen die Methoden setState und getState zur Verfügung, mit denen der Zustand jedes einzelnen GPIO-Kanals gesetzt oder abgefragt werden kann. Die Konstanten HIGH (true) und LOW (false) repräsentieren dabei den jeweiligen Zustand. Ausserdem kann mit den Methoden setMode und getMode die jeweilige Betriebsart der GPIO-Kanäle kontrolliert werden. Die Betriebsarten werden ebenfalls durch Konstanten definiert. Es stehen folgende Betriebsarten zur Verfügung:

BetriebsartDatenrichtungBeschreibung
FLOATINGEingangDigitaler (ggf. analoger) Eingang
PULLUPEingangDigitaler (ggf. analoger) Eingang mit internem Pullup-Widerstand
PUSHPULLAusgangDigitaler Ausgang
OPENDRAINAusgangDigitaler Ausgang, HIGH schaltet Ausgang hochohmig
Tabelle 1: Betriebsarten der GPIO-Kanäle

Hinweis: Bei einem GPIO-Eingang darf die von außen angelegte Spannung nicht die Versorgungsspannung des JControl-Moduls überschreiten. Ein GPIO-Ausgang hat den Zustand LOW (=0V) oder HIGH (= Versorgungsspannung; idR. 5V). Nähere Informationen können sie den Datenblättern http://www.domologic.de/support/ch1/index_de.html entnehmen.

Es ist zu beachten, dass die GPIO-Kanäle bei den verschiedenen JControl-Modulen unterschiedlich an externe Pins herausgeführt sind. Die Belegung im Einzelnen kann der API Dokumentation http://www.jcontrol.org/current/docs/api/jcontrol/io/GPIO.html von GPIO entnommen werden. Die Verdrahtung der GPIO-Kanäle an die externen Pins der JControl-Geräte wird in den entsprechenden Datenblättern der Produkte beschrieben.

In einigen Fällen wird es nicht nötig sein, die Klasse GPIO zu verwenden. Dann werden Sie wahrscheinlich "übergeordnete" Klassen (z.B. PWM und ADC) benutzen, um komfortabel auf die Hardware zuzugreifen. Für Anwendungen jedoch, die eine direkte Ansteuerung der GPIO-Kanäle benötigen, soll im folgenden Abschnitt ein kleines Beispiel vorgestellt werden.



GPIO-Beispiel: Ansteuerung eines extern angeschlossenen Relais

Schritt 1: Ein Relais, das an den GPIO-Kanal mit der Nummer 0 angeschlossen ist, soll per Software ein- und ausgeschaltet werden. Bild 1 zeigt eine Möglichkeit, eine solche Schaltung zu realisieren.

Bild 1: Anschluss eines Relais an einen GPIO-Kanal

Das Relais ist hier LOW-aktiv mit dem GPIO-Kanal verbunden, d.h. der GPIO-Kanal muss initial auf HIGH geschaltet werden, um das Relais in Ruhestellung zu halten. In der Schaltung erledigt dies der Widerstand R101.

Schritt 2: Es soll nun eine Java-Klasse zur Ansteuerung der obigen Schaltung implementiert werden. Diese soll das Relais bei der Instantiierung in Ruhestellung initialisieren und Methoden zum Ein- und Ausschalten des Relais zur Verfügung stellen. Der folgende Quelltext zeigt, wie diese Aufgaben mit Hilfe der Klasse GPIO erledigt werden können:

1    import jcontrol.io.GPIO;
2    import jcontrol.lang.ThreadExt;
3    
4    /**
5     * RelayExample shows how to control a hardware relay
6     * connected to a GPIO channel.
7     *
8     * <p>(C) DOMOLOGIC Home Automation GmbH 2003</p>
9     */
10    public class RelayExample {
11    
12    
13        /** GPIO channel the relay is connected to */
14        static final int GPIO_RELAY = 0;
15    
16    
17        /** init relay control */
18        public RelayExample() {
19            GPIO.setMode(GPIO_RELAY, GPIO.PUSHPULL);
20            release();
21        }
22    
23    
24        /**
25         * Switch relay to released state.
26         */
27        void release() {
28            GPIO.setState(GPIO_RELAY, GPIO.HIGH);
29        }
30    
31    
32        /**
33         * Switch relay to attracted state.
34         */
35        void attract() {
36            GPIO.setState(GPIO_RELAY, GPIO.LOW);
37        }
38    
39    
40        /**
41         * Main method. Init relay and attract it for one second.
42         * @param args
43         */
44        public static void main(String args[]) {
45    
46            RelayExample r = new RelayExample();
47    
48            // endless loop
49            for (;;) {
50    
51                // attract relay
52                r.attract();
53    
54                // sleep one second
55                try {
56                    ThreadExt.sleep(1000);
57                } catch (InterruptedException e) {}
58    
59                // release relay
60                r.release();
61    
62                // sleep one second
63                try {
64                    ThreadExt.sleep(1000);
65                } catch (InterruptedException e) {}
66            }
67        }
68    }
Listing 1: RelayExample.java

Im Konstruktor der Klasse RelayExample wird der GPIO-Kanal, an den das Relais angeschlossen ist, zunächst in den Modus PUSHPULL versetzt, um das Relais danach durch einen Aufruf der Methode release() in den Ruhezustand zu bringen. Die Methode release() benutzt die Konstante HIGH, um den GPIO-Kanal einzuschalten (logisch '1'). Als Antagonist steht die Methode attract() zur Verfügung, um das Relais zu aktivieren. Diese versetzt den Portpin in den Zustand LOW (logisch '0'), wodurch das Relais "anzieht". Ein angeschlossener Verbraucher würde nun eingeschaltet.

Schritt 3: Wenn Sie obige Schaltung nachgebaut haben, probieren Sie das RelayExample damit aus. Erstellen Sie ein neues JControl/IDE-Projekt, laden Sie den Quelltext herunter und fügen Sie ihn dem Projekt hinzu. Nach dem Hochladen auf Ihr JControl-Gerät und Druck auf den Reset-Schalter wird das Relais 1 Sekunde (100ms) lang aktiviert werden. Diese Zeitspanne läßt sich durch Anpassung des Parameters millis der Funktion ThreadExt.sleep() in der main-Methode verändern.

Damit der ganze Vorgang besser nachvollzogen werden kann, wird das Relais in einer Endlosschleife immer wieder ein- und ausgeschaltet. Die Ausschaltzeit beträgt dabei ebenfalls 1000ms. Sie können den Vorgang auch mit der Simulationsumgebung überprüfen, wenn Sie sich einfach den aktuellen Zustand der GPIO-Kanäle anzeigen lassen.



© 2000-2006 DOMOLOGIC Home Automation GmbH. All Rights Reserved.