Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke

Grundlagen: Abfrage eines GPIO Ports

Die Vorteile eines Raspberry Pis sind die GPIO Ports, dadurch kann man mit der großen bösen Außenwelt kommunizieren. Diese Ports können als Ein- oder Ausgang geschaltet werden - je nachdem ob man etwas Abfragen oder Schalten möchte.

Wenn Ihr per SSH auf eurem Raspberry Pi (Als Beispiel ein A+) eingeloggt seid, solltet ihr durch folgende eingabe eine Übersicht aller Ports bekommen z.b: (Wiring Pi ist Voraussetzung!)

gpio readall
 +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5V | | |
| 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 1 | OUT | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 0 | OUT | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | IN | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+

Wenn das klappt, dann ist WiringPi auch installiert und es kann losgehen.

Diese Befehle bewirken folgendes:

gpio mode 2 in Schaltet GPIO27 (Pin 13) auf Eingang (ideal für Sensoren, Taster, Schalter)
gpio read 2 Fragt den GPIO 27 (Pin 13) ab, die Ausgabe lt. Beispiel oben liefert eine "0" (Low).
gpio mode 2 out Schaltet GPIO27 (Pin 13) auf Ausgang (ideal für Relais, LEDs, etc)
gpio write 2 1 Schaltet den GPIO27 (Pin 13) auf "1" (High), jetzt könnte man damit etwas ansteuern.

Bevor es WiringPi gab konnte man die GPIO Ports auch schon Umschalten und Abfragen, das war etwas komplizierter und man musste als Admin Rechte haben. Hier nur zur Vollständigkeit, so habe ich auch mal angefangen:

echo "27" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio27/direction

Schaltet GPIO27 (Pin 13) auf Eingang
cat /sys/class/gpio/gpio27/value Fragt den GPIO 27 (Pin 13) ab - 1 oder 0 wird zurück geliefert
echo "27" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio27/direction
Schaltet GPIO27 (Pin 13) auf Ausgang
echo "1" /sys/class/gpio/gpio27/value Schaltet GPIO27 (Pin 13) auf "1" also High

Das aber nur zur Theorie...

 

Grundlagen: Einen GPIO Port in der Praxis abfragen - Teil 1.

Wir wollen jetzt einen Taster an Port 2 (GPIO27) oder auch Pin 13 anschließen und abfragen.

Die Hardware:

Vom Raspberry PI Pin 1 (3,3V) geht es zum 10 KOhm Widerstand
Vom Raspberry PI Pin 9 (GND) geht es zu der einen Seite des Tasters
Vom Raspberry PI Pin 13 (GPIO27) geht es zu der anderen Seite des Tasters und des Widerstandes

Warum der 10 KOhm Widerstand ?

Damit der GPIO27 auf "High" gehalten wird und nur bei Drücken des Tasters geht er durch die direkte Verbindung mit GND (Masse) auf "Low".

Die Software :

Bash:

#!/bin/sh

gpio mode 2 in

while true
do

result="$( gpio read 2 )"
if [ "$result" = "1" ]; then
echo "Nicht Gedrueckt"
fi
if [ "$result" = "0" ]; then
echo "Gedrueckt"
fi

sleep 0.5
done

Die Datei könnt ihr beispielsweise als "Taster.sh" bei /var/www/ speichern.

Der GPIO 27 wird als Eingang deklariert und dann wird in einer kleinen Schleife abgefragt wie der Status des GPIOs ist. Je nachdem ob er 1 oder 0 ist wird ausgegeben "Gedrückt" oder "nicht Gedrückt". Der Zustand wird alle 0,5 Sekunden abgefragt.

Aufgerufen wird es vom Terminal wie folgt (wenn ihr in euren Raspberry Pi eingeloggt seid):

sudo bash /var/www/Taster.sh

Abbrechen tut man es mit CTRL + C.

Wenn das Bash Script mit "&" aufgerufen wird ( "sudo bash /var/www/Taster.sh &" ), läuft es im Hintergrund. Das ist sinnvoll wenn man einen Eingang dauerhaft überwachen will um spontan auf etwas zu reagieren. Natürlich sieht man so nicht die Ausgabe wie z.b. "Gedrückt" oder "Nicht Gedrückt" - aber man könnte lustige andere Sachen machen, z.b. eine email versenden oder eine Webseite aufrufen, einen Motor starten, oder oder oder....

 

 

Grundlagen: Einen GPIO Port in der Praxis abfragen - Teil 2

Nun wollen wir beim drücken des Tasters ein PHP Script starten.

Die folgende Datei speichern wir als "phpdemo.sh" unter /var/www/ ab.

#!/bin/sh

gpio mode 2 in

while true
do

result="$( gpio read 2 )"
if [ "$result" = "0" ]; then
curl "
192.168.0.1"
fi

sleep 0.5
done

Jetzt starten wir das Script wie folgt:

sudo bash /var/www/phpdemo.sh

Jetzt sollte, wenn das Script gestartet wurde und der Taster gedrückt wird, die Url oder Webseite die ihr im Script angegeben habt aufgerufen werden (Hier als Beispiel 192.168.0.1). Die Ausgabe kriegt ihr nicht zu Gesicht, die wird nur intern abgearbeitet, aber wenn ihr z.b. ein PHP Script dort angebt, welches eine email versendet, dann wird durch Tastendruck eben eine Mail versendet.

Jetzt hat man nicht immer Lust erst das Script per Hand zu starten und dann den Taster zu betätigen - Wir wollen das die Tastenabfrage beim hochbooten des Raspberry Pis automatisch im Hintergrund gestartet wird, das ist aber auch ganz einfach:

Sudo crontab -e

Das legt einen neuen Cronjob an, der festlegt wann welches Script oder Programm intervall mässig gestartet werden soll.

Dort fügt ihr folgenden Eintrag hinzu der dafür sorgt das beim Reboot das Script im Hintergrund gestartet wird.

@reboot bash /var/www/phpdemo.sh &

Wenn ihr jetzt das Script verändert, hat das keinerlei effekt - erst nach dem nächsten Reboot wird das aktuelle ausgeführt. Wie man sieht ist es eigentlich recht "simpel". Einfach mal ein bischen "rumprobieren" und testen um zu sehen was es für möglichkeiten gibt - nichts anderes habe ich hier gemacht.

Vorraussetzung ist die Installation von WiringPi, damit die Abfrage der Ports auch funktioniert.

Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke