I. GPIO (General Purpose Input/Output)In diesem Tutorial wird gezeigt, wie mit Hilfe der Klasse |
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 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:
Betriebsart | Datenrichtung | Beschreibung |
---|---|---|
FLOATING | Eingang | Digitaler (ggf. analoger) Eingang |
PULLUP | Eingang | Digitaler (ggf. analoger) Eingang mit internem Pullup-Widerstand |
PUSHPULL | Ausgang | Digitaler Ausgang |
OPENDRAIN | Ausgang | Digitaler Ausgang, HIGH schaltet Ausgang hochohmig |
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.
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.
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 | } |
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.