Vom Start bis zur Home-Automation - Raspberry Pi Teil 3 – Ein- und Ausgabe

0,00
Aus ELVjournal 06/2015     0 Kommentare
 Vom Start bis zur Home-Automation - Raspberry Pi Teil 3 – Ein- und Ausgabe

Inhalt des Fachbeitrags

PDF- / Onlineversion herunterladen

In diesem Teil der Raspberry-Pi-Artikelserie werden Ein- und Ausgabemöglichkeiten des Raspberry Pi dargestellt. Speziell geht es um die Nutzung der I/O-Pins. Dabei bilden die im Teil 2 vorgestellten Programmiermöglichkeiten die Basis.

Verbindungen zur Außenwelt

Auf der Raspberry-Pi-Platine sieht man sehr viele verschiedene Anschlussmöglichkeiten (Bild 1).
Bild 1: Die wichtigsten Schnittstellen des Raspberry Pi
Bild 1: Die wichtigsten Schnittstellen des Raspberry Pi
Für die Grundinstallation und für die Interaktion über einen HDMI-Monitor werden genutzt: Spannungsversorgung, SD-Karte, HDMI, USB, LAN. Außerdem gibt es noch Anschlüsse für Audio, Kamera und Spezial-Display sowie den sogenannten GPIO-Header (= Erweiterungsanschluss/ Erweiterungsleiste), auf den im Folgenden detaillierter eingegangen wird. In Bild 1 kann man sehen, dass der GPIO-Header für einen Raspberry Pi 2 aus zwei Reihen zu je 20 Pins besteht. (Je nach Raspberry-Version sind es ggf. auch zwei Reihen zu je 13 Pins). Der Pin 1 ist auf der Platinenunterseite quadratisch statt rund gekennzeichnet. Von oben gesehen ist Pin 1 der Pin, der dem Kartenslot am nächsten ist. Die untere Reihe enthält Pins mit ungerader Nummer. Die obere Reihe enthält die geraden Pin-Nummern. GPIO steht für „General Purpose Input Output“ – frei übersetzt: „Eingabe und Ausgabe zur universellen Verwendung“. Die meisten Pins des GPIO-Headers lassen sich als Ausgangs- Pin oder als Eingangs-Pin nutzen. Einige Pins des GPIO-Headers liegen an 3,3 V, 5 V oder 0 V (Gnd). Viele Pins haben besondere Funktionen (über digitale Ausgabe/Eingabe hinaus). Die Spannung an einem Ausgangs-Pin ist 3,3 V (nicht 5 V) oder 0 V. Man kann an einen als Ausgang definierten Pin zum Beispiel eine (Low-Current-)LED mit Vorwiderstand gegen Gnd anschließen (Bild 2).
Bild 2: GPIO-Header des Raspberry Pi 2 inklusive angeschlossener LED und angeschlossenem Schalter/Taster/Kontakt
Bild 2: GPIO-Header des Raspberry Pi 2 inklusive angeschlossener LED und angeschlossenem Schalter/Taster/Kontakt

Achtung: Die Pins können nur sehr geringe Ströme liefern! Man muss daher größere Lasten per Treiber (Transistor, MOSFET, Treiber-IC) schalten. Man kann die LED mit dem Vorwiderstand auch mit ihrer Anode an einen 3,3-V-Pin anschließen und die Katodenseite an einen als Ausgang geschalteten Pin. Ein GPIO-Pin kann per Software als Eingangs-Pin geschaltet werden. Das ist auch die Standardeinstellung. An einen Eingangs-Pin lässt sich zum Beispiel ein Taster, Schalter oder Kontakt anschließen. Je nach Projekt kann gegen 3,3 V bzw. gegen Gnd geschaltet werden. Beim Schalten nach Gnd sollte ein Pull-up-Widerstand (R2 in Bild 2, ca. 10 kΩ) verschaltet werden, damit bei offenem Kontakt klare Spannungspegel anliegen.
Bei Schalten gegen 3,3 V sollte ein Pull-down-Widerstand verwendet werden. Je nach Programmierumgebung kann man diesen externen Pull-up- bzw. Pull-down-Widerstand durch einen intern per Software aktivierten Widerstand ersetzen. Der Widerstand R3 in Bild 2 (ca. 1 kΩ) ist ein Schutzwiderstand für den Pin für den Fall, dass durch ungünstige Konfigurationsverhältnisse 3,3 V direkt mit Gnd verbunden wäre.

Achtung: An einen GPIO-Pin dürfen niemals mehr als 3,3 V angelegt werden!
Die Pins 2 und 4 stellen jeweils 5 V zur Verfügung und lassen einen höheren Strom zu: Stromlieferung Netzteil (z. B. 1 A) minus Raspberry-Verbrauch (700 mA, je nach Modell) ergibt den möglichen Strom für die Pins (z. B. 300 mA).
Je nach Board-Revision hat der GPIO-Header insgesamt 26 bzw. 40 Pins und je nach Board-Revision gibt es Unterschiede bei der Pinbelegung. Man muss sich deshalb über die vorliegende Revision des Raspberry- Boards im Klaren sein.
Informationen über den eingesetzten Raspberry Pi kann man aus der Datei /proc/cpuinfo auslesen:

pi@raspberrypi ~ $ cat/proc/cpuinfo

Hardware: BCM2709
Revision: a01041
Serial: 00000000c9579632
pi@raspberrypi ~ $


Wichtig ist die Angabe der Revision (hier a01041). Aus Tabelle 1 (vorletzte Zeile) ersehen wir, dass ein Raspberry Pi 2 mit einem 40-Pin-GPIO-Header vorliegt. Die Belegung der Pins zeigt Bild 2.


Alternativ kann man auch in der Python-Umgebung mit GPIO.RPI_REVISION oder (neuer und umfangreicher) mit GPIO.RPI_INFO Informationen über den vorliegenden Raspberry Pi erhalten – und ggf. im Programm verwenden. Nach Aufruf der Python-Umgebung mit python (bzw. python3) werden die entsprechenden Befehle eingegeben und man erhält die entsprechenden Informationen über das Board. Das funktioniert unter Python 2.7 ebenso wie unter Python 3. Als Ausgabe erfährt man die PCB-Revision (hier 3):

pi@raspberrypi ~ $ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import RPi.GPIO as GPIO
                    (oder from RPi import GPIO )
>>> GPIO.RPI_REVISION
3
>>> GPIO.RPI_INFO
{‘P1_REVISION’: 3, ‘RAM’: ‘1024M’, ‘REVISION’:
‘a01041’, ‘TYPE’: ‘Pi2 Model B’, ‘PROCESSOR’: ‘BCM2836’,
‘MANUFACTURER’: ‘Sony’}
>>> GPIO.RPI_INFO[‘P1_REVISION’]
3
>>> quit() pi@raspberrypi ~ $

Kommandozeile

Bild 3: Dateisystem für GPIO
Bild 3: Dateisystem für GPIO
Als Einstieg bzw. für schnelle Aktionen kann man die GPIO-Pins von der Linux-Kommandozeile ansteuern. Dabei lernt man, dass die GPIO-Pins – wie bei Linux üblich – als (virtuelle) Dateien betrachtet werden. Standardmäßig besitzt ein Raspbian-System unter dem Root-Verzeichnis ein Verzeichnis mit dem Namen /sys/class/gpio (Bild 3). In diesem Verzeichnis gibt es eine Datei namens export.

Ausgabe (LED ansteuern):

Mit einem echo-Befehl in der Kommandozeile und dem Umleitungszeichen (>) wird die Nummer eines GPIOPins in die export-Datei geschrieben:

pi@raspberrypi ~ $ echo “25” > /sys/class/gpio/export

Dadurch wird ein entsprechendes Verzeichnis (gpio25) mit verschiedenen Dateien, zum Beispiel direction und value, angelegt. Die Dateien direction bzw. value müssen mit entsprechenden Schreibrechten versehen werden:
pi@raspberrypi ~ $ sudo chmod 666 /sys/class/gpio/gpio25/direction
pi@raspberrypi ~ $ sudo chmod 666 /sys/class/gpio/gpio25/value

In die Datei direction wird nun „out“ (für einen Ausgabe-Pin) bzw. „in“ (für einen Eingabe-Pin) geschrieben:
pi@raspberrypi ~ $ echo “out” > /sys/class/gpio/gpio25/direction

Nachdem der Pin auf diese Weise als Ausgabe-Pin definiert wurde, kann der Pin durch Schreiben einer „1“ bzw. einer „0“ auf „high“ (3,3 V) bzw. „low“ (0 V) geschaltet werden:
pi@raspberrypi ~ $ echo “1” > /sys/class/gpio/gpio25/value
pi@raspberrypi ~ $ echo “0” > /sys/class/gpio/gpio25/value
….
pi@raspberrypi ~ $ echo “1” > /sys/class/gpio/gpio25/value


Eine angeschlossene LED bzw. ein anderer Verbraucher (über eine Treiberstufe) kann damit ein- und ausgeschaltet werden. Am Schluss sollte man das System wieder „aufräumen“, indem man die GPIO-Pins wieder freigibt:
pi@raspberrypi ~ $ echo “25” > /sys/class/gpio/unexport
pi@raspberrypi ~ $

Eingabe (Schalter/Taster abfragen):

Das Ansprechen von Eingabe-Pins funktioniert ähnlich. Erzeugen des entsprechenden GPIO-Verzeichnisses durch Schreiben in die Datei export:
pi@raspberrypi ~ $ echo “24” > /sys/class/gpio/export

Schreibrechte definieren:
pi@raspberrypi ~ $ sudo chmod 666 /sys/class/gpio/gpio24/direction
pi@raspberrypi ~ $ sudo chmod 666 /sys/class/gpio/gpio24/value


Abfragen des am Pin anliegenden Spannungslevels durch Auslesen der Datei value mit dem cat-Befehl. Als Ergebnis wird eine 0 bzw. eine 1 ausgegeben:
pi@raspberrypi ~ $ cat /sys/class/gpio/gpio24/value
0
pi@raspberrypi ~ $ cat /sys/class/gpio/gpio24/value
1
pi@raspberrypi ~ $ cat /sys/class/gpio/gpio24/value
0

Auf diese Weise kann abgefragt werden, ob ein angeschlossener Kontakt offen oder geschlossen ist.

Zum Schluss sollten die GPIO-Pins wieder freigegeben werden:
pi@raspberrypi ~ $ echo “25” > /sys/class/gpio/unexport
pi@raspberrypi ~ $

Skript-Programmierung

Das Eingeben der einzelnen Befehle in der Kommandozeile ist sehr zeitaufwendig und fehlerträchtig. In der Praxis wird man daher – besonders für wiederkehrende Aufgaben – lieber ein kleines Skript erstellen. Mit sudo nano blinken.sh und Eingeben der Befehle im Editor wird beispielsweise ein Skript mit dem Namen blinken.sh erstellt (Bild 4), welches eine LED 10-mal blinken lässt.
Bild 4: Skript-Programm blinken.sh im Editor
Bild 4: Skript-Programm blinken.sh im Editor

Erläuterungen:
Das Doppelkreuz leitet Kommentare ein. Durch Schreiben in die export- Datei wird der Pin für die Benutzung eingerichtet. Nach Einrichtung der Schreibrechte für die Dateien direction und value und Schreiben von „out“ in die Datei direction kann eine „1“ o der eine „0“ in die Datei value geschrieben werden, was im Beispielskript in einer for-Schleife erfolgt. Am Schluss des Skripts wird der Pin wieder deaktiviert (unexport).

Die Ausführung der Skript-Datei erfolgt mit:
pi@raspberrypi ~ $ bash blinken.sh

Die Rechte für die Datei blinken.sh sind standardmäßig: rw-r--r--  (644).
Nun werden Ausführungsrechte vergeben (statt 644 = rw-r—r-- auf 777 = rwxrwx):
pi@raspberrypi ~ $ sudo chmod 777 blinken.sh
   und dann erfolgt der Aufruf mit:
pi@raspberrypi ~ $ ./blinken.sh

Bild 5: Ausführung der Skript-Datei blinken.sh (die LED blinkt im Sekundenrhythmus).
Bild 5: Ausführung der Skript-Datei blinken.sh (die LED blinkt im Sekundenrhythmus).
Jetzt könnte man noch das User-Verzeichnis (~ also / home/pi) in die PATH-Umgebungsvariable aufnehmen oder umgekehrt die Datei in ein Verzeichnis verschieben/ kopieren, das in PATH enthalten ist (z. B. /usr/ bin). Bild 5 zeigt die Ausführung der Skript-Datei. Die Ausgabe der Texte erfolgt zur Ablaufkontrolle. Wesentlich ist, dass die am Pin angeschlossene LED blinkt.
Bild 7: Ausführung der Skript-Datei eingabe.sh
Bild 7: Ausführung der Skript-Datei eingabe.sh
Ein Skript zur Verwendung eines GPIO-Pins als Eingabe-Pin (zum Abfragen eines Kontaktes) zeigt Bild 6 und die Ausführung des Skript-Programms zeigt Bild 7.
Bild 6: Skript eingabe.sh
Bild 6: Skript eingabe.sh

Erläuterungen:
Die Vorbereitungen (export, Benutzerrechte) entsprechen dem Output-Beispiel oben. Dann wird „in“ in die Datei direction geschrieben und mit dem cat-Befehl wird der Spannungspegel am Pin als 1 bzw. 0 ausgegeben. Im Skript in Bild 6 wurde dieser Zustand mit IF abgefragt und ein entsprechender Text ausgegeben.

Mit WiringPi:

Eine sehr mächtige Bibliothek mit Befehlen für die Nutzung der GPIO-Pins stellt WiringPi dar („Elektronikwissen“ und [1]). Zum Testen, ob WiringPi installiert ist und welcher Raspberry vorliegt, gibt man gpio –v ein: pi@raspberrypi ~ $ gpio -v gpio version: 2.26 Copyright (c) 2012-2015 Gordon Henderson This is free software with ABSOLUTELY NO WARRANTY. For details type: gpio -warranty Raspberry Pi Details: Type: Model 2, Revision: 1.1, Memory: 1024MB, Maker: Sony
Sehr nützlich ist der Befehl gpio readall, mit dem man eine Tabelle mit den Pinbelegungen und -stati bekommt (Bild 8). Bild 8 zeigt neben den „normalen“/ BCM-Pinbezeichnungen auch die Pin-Nummern nach dem WiringPi-System und die Alternativfunktionen der Pins. Außerdem wird angezeigt, ob ein Pin als Ausgang oder als Eingang konfiguriert ist und wie der Wert des Pins ist.
Bild 8: WiringPi-Pinanzeige
Bild 8: WiringPi-Pinanzeige

Bei Benutzung von WiringPi in der Kommandozeile (oder anderen Umgebungen) werden zunächst wieder die gewünschten Pins als Ausgabe- oder Eingabe-Pin definiert:
pi@raspberrypi ~ $ gpio export 25 out
pi@raspberrypi ~ $ gpio export 24 in

Danach können Ausgaben mit gpio write und Eingaben mit gpio read erfolgen.
Dabei kann man (mit dem Parameter -g) die BCM-GPIO-Nummerierung, (mit Parameter -1) die physikalische Pin-Nummerierung oder (ohne Parameter) die WiringPi-Pin-Nummerierung verwenden.

Mit BCM-GPIO-Nummerierung (mit Parameter -g):
pi@raspberrypi ~ $ gpio -g write 25 1
pi@raspberrypi ~ $ gpio -g write 25 0
pi@raspberrypi ~ $ gpio -g read 24
1
pi@raspberrypi ~ $ gpio -g read 24
0


Mit physikalischer Nummerierung (mit Parameter -1):
pi@raspberrypi ~ $ gpio -1 write 22 1
pi@raspberrypi ~ $ gpio -1 write 22 0
pi@raspberrypi ~ $ gpio -1 read 18
1
pi@raspberrypi ~ $ gpio -1 read 18
0

Mit WiringPi-Nummerierung (ohne Parameter -g oder -1):
pi@raspberrypi ~ $ gpio write 6 1
pi@raspberrypi ~ $ gpio write 6 0
pi@raspberrypi ~ $ gpio read 5
1
pi@raspberrypi ~ $ gpio read 5
0

Am Ende werden die GPIO-Pins wieder freigegeben:
pi@raspberrypi ~ $ gpio unexportall

Mit man gpio bekommt man das WiringPi-Manual.

Python

Das Listing in Bild 9 zeigt das Python-Programm eines LED-Blinkers. Es wird im Nano-Editor erstellt durch:
pi@raspberrypi ~ $ sudo nano blinken.py

Bild 9: Python-Programm LED-Blinker
Bild 9: Python-Programm LED-Blinker
Bild 10: Laufzeit blinken.py
Bild 10: Laufzeit blinken.py

Erläuterungen: Durch den import-Befehl werden die benötigten GPIO-Module eingebunden. Mit GPIO.setmode wird festgelegt, welche Nummerierungsart verwendet werden soll. Durch GPIO.setwarnings wird eingestellt, dass nicht unnötig viele Warnungen ausgegeben werden. Mit GPIO.setup erfolgt die Festlegung als Ausgabe- Pin und mit GPIO.output wird in einer Schleife der Zustand des Pins auf 1 bzw. auf 0 gesetzt. Das Ausführen des Programms erfolgt mit:
pi@raspberrypi ~ $ sudo python blinken.py
Das „sudo“ ist nötig, weil Root-Rechte erforderlich sind. Zur Laufzeit sieht es auf dem Bildschirm aus wie in Bild 10, wobei eine am Pin angeschlossene LED im Sekundentakt blinkt. Ein Programm zum Testen eines GPIO-Pins als Eingabe- Pin wird erstellt durch:
pi@raspberrypi ~ $ sudo nano eingabe.py
und ist in Bild 11 zu sehen. Hier wird der GPIO-Pin 24 mit GPIO.setup als Eingabe-Pin mit intern aktiviertem Pull-up-Widerstand definiert.

Bild 11: Python-Programm Eingabe
Bild 11: Python-Programm Eingabe
Bild 12: Laufzeit Python-Programm blinken.py
Bild 12: Laufzeit Python-Programm blinken.py

Durch GPIO.input wird der Status eines GPIO-Pins abgefragt. Zur Laufzeit sieht es auf dem Bildschirm aus wie in Bild 12. Dabei blinkt die angeschlossene LED und der Eingabe-Pin wird abgefragt.

Grafische Oberfläche mit Tkinter programmieren

 Mit der bereits im ELVjournal 5/2015 vorgestellten Tkinter-Umgebung lassen sich sehr schnell grafische Anwendungen zur Ansteuerung der GPIO-Pins erstellen, weil ein Tkinter-Programm ein Pythonprogramm ist und deshalb wiederum dieselben Techniken wie oben benutzt werden können. Eine Tkinter-Datei mit dem Namen ein_ausgabe.py und dem Programm gemäß Bild 13 wird erstellt mit:
pi@raspberrypi ~ $ sudo nano ein_ausgabe.py

Bild 13: Tkinter-Programm
Bild 13: Tkinter-Programm

GPIO-Pins die Anweisungen wie oben im Python-Programm benutzt werden. Der Eingabe-Pin GPIO24 wird in diesem Beispiel durch einen Interrupt überwacht (GPIO.add_event_detect).
Alternativ könnte man den Pin auch per Polling regelmäßig abfragen. Zur Ausführung des Tkinter-Programms startet man mit startx die grafische Oberfläche von Raspbian:
pi@raspberrypi ~ $ startx
Dann öffnet man ein Terminalfenster unter: Menü – Zubehör – Lxterminal. Im Terminalfenster wird das Tkinter-Programm zur Ausführung gebracht:
pi@raspberrypi ~ $ sudo python ein_ausgabe.py

Bild 14: Tkinter LED an/aus und Taster abfragen
Bild 14: Tkinter LED an/aus und Taster abfragen
Es erscheint ein Fenster gemäß Bild 14. Durch Klicken auf „LED an“ bzw. „LED aus“ wird die LED geschaltet. Im unteren Textlabel steht der Zustand des Eingabe-Pins. Per Interrupt wird auf Pegeländerungen am Pin reagiert. Der Button „Zustand Taster?“ wird nicht gebraucht – er dient im Programm zum Aufzeigen einer Alternative zum Interrupt.

Ausblick

Hier wurden die Basismöglichkeiten der GPIO-Pin- Nutzung dargestellt. Man kann auch relativ schnell I2C, 1-Wire (DS18x20), SPI, UART usw. einbinden. Anleitungen und Beispiele findet man reichlich in den zahlreichen Büchern sowie auf sehr vielen sehr guten Internetseiten. Im vierten Teil unserer Raspberry-Artikelserie wird der Zugriff auf den Raspberry über das (W)LAN und über das Internet beschrieben. Damit wird es möglich, über das Netz am Raspberry angeschlossene Geräte anzusteuern oder Sensoren usw. abzufragen, und die Basis für eigene Home-Automatisierungs- Projekte ist gelegt.

Fachbeitrag als PDF-Download herunterladen

Inhalt

Sie erhalten den Artikel in 1 Version:

pdf  als PDF (9 Seiten)

Sie erhalten folgende Artikel:
  • Vom Start bis zur Home-Automation - Raspberry Pi Teil 3 – Ein- und Ausgabe
Produkteweitere FachbeiträgeForenmehr Wissen
Raspberry Pi 2 B, 1 GB

Raspberry Pi 2 B, 1 GB


EUR 32,50*
sofort versandfertig Lieferzeit:1-2 Werktage2
EDIMAX EW-7811Un Nano-USB-WLAN-Adapter, 150 Mbps

EDIMAX EW-7811Un Nano-USB-WLAN-Adapter, 150 Mbps


EUR 6,61*
sofort versandfertig Lieferzeit:1-2 Werktage2
Verbindungskabel für Raspberry Pi, 2x 20-polig, 30 cm

Verbindungskabel für Raspberry Pi, 2x 20-polig, 30 cm


EUR 5,95*
sofort versandfertig Lieferzeit:1-2 Werktage2
Verbindungskabel für Raspberry Pi, 2x 20-polig female, 25 cm

Verbindungskabel für Raspberry Pi, 2x 20-polig female, 25 cm


EUR 3,85*
sofort versandfertig Lieferzeit:1-2 Werktage2
FRANZIS Raspberry Pi: Mach's einfach!

FRANZIS Raspberry Pi: Mach's einfach!


Keine Lieferung in folgende Länder: Österreich
EUR 30,00*
Lieferzeit 1 Woche(n)


Hinterlassen Sie einen Kommentar:
(Anmeldung erforderlich)
  Name
  E-Mail
KATEGORIEN
DAS KÖNNTE SIE AUCH INTERESSIEREN