© istockphoto.com/AlexeyPushkin, © istockphoto.com/jara3000, © S&S Media
Mit Java die GPIO des Raspberry Pi 2 ausreizen

Kaffeebohne trifft Himbeere


Seit einigen Jahren erfreut sich der Raspberry Pi steigender Beliebtheit. Er wird als Mediacenter oder auch als Miniserver im Heimnetzwerk eingesetzt. Ein weiterer interessanter Aspekt des Raspberry Pi ist allerdings seine GPIO. Mit ihr ist es möglich, die unterschiedlichste Hardware an den Rasp­berry Pi anzubinden.

Mit dem Raspberry Pi Typ 2 ist Anfang des Jahres ein wirklich sehr leistungsfähiger Vertreter der Pi-Familie auf den Markt gekommen. Mit seinem ARM-Cortex-A7-Chip ist er seinen Vorgängern um Längen überlegen. Auf dem Raspberry Pi Typ 2 kann man ohne Probleme Java als Programmiersprache verwenden. Dieser Artikel wird Schritt für Schritt erklären, was zu tun ist, um mit Java die GPIO des Raspberry Pi zu verwenden. Im zweiten Abschnitt zeigen wir am Beispiel einer Dachfenstersteuerung, was alles mit der GPIO und Java möglich ist.

GPIO im Detail

Der Rasperry Pi ist von Haus aus mit einer flexiblen und leistungsfähigen IO-Schnittstelle ausgestattet, die GPIO (General Purpose Input/Output). Wie wir in Tabelle 1 sehen, sind die einzelnen Anschlüsse der GPIO nicht nur einfache IOs – es gibt auch einige Anschlüsse, die für Spezialaufgaben wie I2C- und SPI-Bus vorgesehen sind. I2C und SPI sind serielle Bussysteme, an die zusätzliche IO-Bausteine angeschlossen werden können. Diese Bausteine müssen keine einfachen IOs sein; es können sehr komplexe A/D-, D/A-Wandler, digitale Sensoren, Timer oder auch Speicher sein. Für unsere Dachfenstersteuerung werden wir I2C, SPI, PWM und natürlich auch die einfache IO verwenden. Wer nicht mit diesen Schnittstellen vertraut ist, sollte sich einen Moment gedulden – wir werden gleich einen Blick darauf werfen.

Funktion

Pin des GPIO-Headers

Funktion

3,3 Volt

1

2

5 Volt

SDA.1

3

4

5 Volt

SCL.1

5

6

0 Volt

GPIO. 7

7

8

TxD

0 Volt

9

10

RxD

GPIO. 0

11

12

GPIO. 1

GPIO. 2

13

14

0 Volt

GPIO. 3

15

16

GPIO. 4

3.3v

17

18

GPIO. 5

MOSI

19

20

0 Volt

MISO

21

22

GPIO. 6

SCLK

23

24

CE0

0 Volt

25

26

CE1

SDA.0

27

28

SCL.0

GPIO.21

29

30

0v

GPIO.22

31

32

GPIO.26

GPIO.23

33

34

0v

GPIO.24

35

36

GPIO.27

GPIO.25

37

38

GPIO.28

0v

39

40

GPIO.29

Tabelle 1: Die einzelnen Anschlüsse der GPIO

Pi from scratch

Um den Raspberry Pi verwenden zu können, benötigen wir zu allererst ein Betriebssystem – Raspbian ist hier die erste Wahl. Wie der Name schon vermuten lässt, handelt es sich dabei um eine Debian-Portierung. Man kann sich einfach die aktuelle Version unter [1] herunterladen. In der Zip-Datei steckt ein Image, das man mit einem geeigneten Tool auf eine mindestens 4 GB große SD-Karte schreiben muss:

sudo dd if=2015-05-05-raspbian-wheezy.img of=/dev/sdf 6400000+0 Datensätze ein 6400000+0 Datensätze aus 3276800000 Bytes (3,3 GB) kopiert, 1209,78 s, 2,7 MB/s

Danach kann man die Karte in seinen Raspberry Pi stecken und booten. Nach dem Booten landet man direkt in der raspi-config (Abb. 1). Hier kann man alle nötigen Einstellungen vornehmen, damit der Raspberry Pi sein volles Potenzial entfalten kann. Falls Sie später eine Einstellung noch einmal ändern wollen, ist das kein Problem: Mit sudo raspi-config kann man das Programm einfach noch einmal aufrufen.

Kommen wir jetzt aber zu den wichtigen Einstellungen. Auf jeden Fall mit Punkt 1 das Filesystem erweitern, sonst verwendet der Raspberry Pi nur einen kleinen Teil der Speicherkapazität Ihrer SD-Karte. Unter Punkt 2 sollten Sie auf jeden Fall das Passwort für den User pi neu setzen. Wenn man auf dem Raspberry Pi eher remote arbeiten möchte, sollte man unter den Advanced Options (Punkt 8) den SSH Deamon starten. Möchte man direkt auf dem Raspberry Pi arbeiten, ist es sinnvoll, im Punkt 4 (Internationalisation Options) die Umgebung richtig einzustellen. Das waren erst einmal die Einstellungen, die unbedingt gemacht werden sollten, damit wir später nicht in Probleme laufen. Wenn wir jetzt die raspi-config verlassen, möchte der Raspberry Pi rebooten. Ohne den Reboot sind unsere eben gemachten Änderungen wirkungslos. Nach dem Reboot zeigt uns der Raspberry seine aktuelle IP. Wir können uns jetzt bequem von unseren PC aus per SSH mit dem Raspberry Pi verbinden und remote auf ihm arbeiten. Das war es erst einmal mit Pi from scratch.

mohr_raspberry_1.tif_fmt1.jpgAbb. 1: Nach dem Booten des Raspberry Pi landet man direkt in der „raspi-config“

Die Schnittstellen

Wie bereits angesprochen, verfügt der Raspberry Pi über verschiedene Schnittstellen, die wir uns jetzt etwas genauer ansehen wollen.

I2C-Bus: Der I2C-Bus (ausgesprochen: I Quadrat C) ist ein serieller Datenbus, der für die Kommunikation über kurze Distanzen gedacht ist, das heißt nur innerhalb von Platinen oder Geräten. Die Datenübertragung erfolgt synchron über zwei Leitungen: Eine Datenleitung SDA und eine Taktleitung SCL. Beide Leitungen werden über Pull-up-Widerstände auf ein positives Potenzial gezogen. Die Kommunikation wird dabei immer vom Busmaster aus initiiert. Der Bus verfügt über einen 7-Bit-Adressbereich, das entspricht 128 Teilnehmern. 16 Adressen sind schon reserviert, also bleiben netto 112 freie Adressen. Üblicherweise kann man nur die unteren drei Bits der Adressen an den Clients frei wählen, die oberen Bits sind fest verdrahtet.

Die möglichen Adressen für einen Baustein können dem Datenblatt entnommen werden. Hier einige Beispiele:

  • PCF8574 Port Expander 0x20 – 0x27

  • PCF8574A Port Expander 0x38 – 0x3F (der Typ A unterscheidet sich nur durch den Adressraum von seinem Bruder)

  • PCF8591 A/D and D/A Converter 0x90 – 0x9F

  • PCF8583 Clock/Calendar + 240x8 Bit RAM 0xA0-0xA2

Die Daten werden Byte- oder Wortweise übertragen. Die Übertragungsgeschwindigkeit beträgt zwischen 100 KBit/s bidirektional (Standard Mode) bis zu 5 MBit/s unidirektional (Ultra Fast Mode). Es gibt verschiedene Möglichkeiten, die Reichweite des I2C-Busses zu erhöhen. Sie reichen vom Verringern der Pull-up-Widerstände bis zum Tunneln durch CAN-Bus-Treiber.

SPI-Schnittstelle: Die SPI-Schnittstelle (Serial Peripheral Interface ) wurde von Motorola entwickelt und ist dazu gedacht, unterschiedliche Peripheriebausteine (Slaves) an einen Busmaster anzuschließen. Die Kommunikation erfolgt synchron; das bedeutet, der Busmaster gibt einen festen Takt für die Datenübertragung vor. Dies erfolgt über die mit „CLK“ bezeichnete Leitung. Neben der Taktleitung gibt es noch die Leitungen MOSI (Master Out Slave In) und MISO (Master In ­Slave Out), über welche die Daten übertragen werden. Es gibt bei SPI keine festen Adressen für die einzelnen Busteilnehmer; die Daten werden von einem Teilnehmer heraus in den nächsten Teilnehmer hinein geschoben. Man kann sich den SPI-Bus wie ein langes Schieberegister vorstellen. Damit die Slaves wissen, dass der Zustand in den Schieberegistern konsistent ist, gibt es noch eine Leitung CE (Chip Enable). Wenn der Master alle Daten an die richtigen Stellen geschoben hat, setzt er das CE-Signal, damit die Slaves wissen, dass sie jetzt den Bus lesen oder schreiben können. Damit dieses Verfahren fehlerfrei funktionieren kann, muss der Busmaster die komplette Topologie des Busses kennen. Um dem letzten Teilnehmer am Bus ein Datenpaket zu schicken, muss dieses Paket durch alle davor liegenden Teilnehmer hindurch geschoben werden. Normalerweise verfügen die Slaves über eine NOOP-Funktion (No Operation), die den ­Slave dazu veranlasst, die Daten auf dem Bus nicht zu verarbeiten. Wenn man den SPI-Bus einsetzen möchte, muss man die Software zur Steuerung exakt an die Hardware anpassen. Dazu ist es notwendig, sich die Datenblätter der einzelnen Busteilnehmer sehr genau anzusehen.

PWM: PWM ist die Abkürzung für Pulsweitenmodulation. Bei diesem Verfahren wird ein Rechtecksignal mit konstanter Frequenz erzeugt. Es wird nur das Verhältnis zwischen Puls- und Pausenzeiten variiert (Abb. 2). Mit diesem Verfahren ist es möglich, die Leistung, die an einem Verbraucher ankommt, genau einzustellen. Der Grund, warum es so gemacht wird, ist recht einfach zu erklären: Eine Transistorendstufe erzeugt im gesperrten und vollständig leitenden Zustand kaum Verlustleistung, es wird also keine überschüssige Energie in Abwärme verwandelt. Stellt man einen Arbeitspunkt ein, der einer bestimmten Leistung entspricht, würde man im ungünstigsten Fall fast die Maximalleistung aus Verlustleistung produzieren – alte Netzteile mit linearer Regelung arbeiten auf diese Weise. Moderne Schaltnetzteile verwenden ein ähnliches Verfahren und kommen so auf einen Wirkungsgrad über 90 Prozent. Oft wird am Ausgang einer PWM-Stufe ein Tiefpassfilter installiert, um wieder eine saubere Gleichspannung zu bekommen. Das PWM-Verfahren wird auch bei Servomotoren verwendet, dort entspricht das Verhältnis zwischen Puls und Pause dem Winkel, den der Servo annimmt.

mohr_raspberry_2.tif_fmt1.jpgAbb. 2: Beim PWM-Verfahren wird das Verhältnis zwischen Puls und Pause variiert

Let’s go to Java

Die „Götter“ haben vor das Java-Programmieren der GPIO einen echten Installationsmarathon gestellt. Als Allererstes müssen wir uns natürlich erst einmal ein Betriebssystem für unseren Raspberry Pi besorgen und installieren. Die dazu nötigen Schritte sind im Abschnitt „Pi from scratch“ beschrieben. Dort wird auch beschrieben, was zu tun ist, um die Treiber, die I2C und die SPI-Schnittstelle zu laden.

Um auf die GPIO zugreifen zu können, müssen wir als Basis die WiringPi Library installieren; sie stellt uns ein C-API und ein komfortables Kommandozeilentool zur Verfügung. Die Installation der WiringPi ist im Kasten „WiringPi installieren“ beschrieben. Nachdem sie installiert wurde, können wir die ersten kleinen Experimente mit der GPIO durchzuführen. Abbildung 3 zeigt einen Versuchsaufbau mit einer Sieben-Segment-Anzeige und zwei Tastern, die über die GPIO angesteuert werden können. In Schaltplan eins sehen wir genau, wie wir die einzelnen Komponenten anschließen müssen, damit wir ein erstes Versuchsfeld bekommen. Der Schaltplan (Abb. 4) kann im gEDA- und EPS-Format von der Website zu dieser Ausgabe heruntergeladen werden [2].

mohr_raspberry_3.tif_fmt1.jpgAbb. 3: Unser erster Testaufbau auf einem Prototyping-Board
mohr_raspberry_4.tif_fmt1.jpgAbb. 4: Der Schaltplan zu unserem Testaufbau

Um einen neuen Wert in die Sieben-Segment-Anzeige zu schreiben, müssen wir einfach die entsprechenden Anschlüsse der GPIO als Ausgänge definieren und beschreiben. Das machen wir mit dem Kommandozeilentool GPIO, das mit WiringPi installiert wurde. Es ist zwar etwas umständlich, die einzelnen Bits von Hand zu setzen, gibt einem aber die Möglichkeit, jeden Anschluss einzeln zu testen:

pi@raspberrypi ~ $ gpio mode 0 out pi@raspberrypi ~ $ gpio mode 1 out pi@raspberrypi ~ $ gpio mode 2 out pi@raspberrypi ~ $ gpio mode 3 out pi@raspberrypi ~ $ gpio write 0 0 pi@raspberrypi ~ $ gpio write 0 1 pi@raspberrypi ~ $ gpio write 1 1 pi@raspberrypi ~ $ gpio w...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang