Ich habe mir für mein Sensorprojekt ein PiTFT-Display von Adafruit über EXP-Tech bestellt und vor einigen Tagen erhalten.
Dabei handelt es sich um ein kleines 2,8″ Touchscreen-TFT mit einer Auflösung von 320×240, dass zusätzlich vier Tasten/Buttons besitzt, die direkt auf vier GPIO-Pins geschaltet sind.
Was Adafruit in ihrem ausführlichen HowTo für Montage + Einrichtung vergessen hat, war eine Anleitung, wie man die einzelnen Tasten ansprechen kann.
Im Internet findet man dazu quasi nichts, da das TFT-Display noch relativ neu ist (Dez. 2013). Ich habe mich nun einige Zeit damit beschäftigt und habe einen Lösungsansatz gefunden.Die einzelnen Taster, die separat geordert und aufgelötet werden müssen, sind auf der einen Seite mit einem GPIO-Pin und auf der anderen mit GND verbunden. Es ist also kein Widerstand dazwischen – und das scheint aber in jedem „RPI-Button-HowTo“ der Fall zu sein.
Damit man einen Tastendruck erkennt, muss der interne PullUp-Widerstand für den jeweiligen GPIO-PIN aktiviert werden.
Dabei funktioniert die Logik „negativ„; d.h. wir prüfen, ob ein Button den Wert „False“ zurückliefert (=Tastendruck), da der Pegel standardmäßig HIGH ist und damit True zurückliefert.
Der Sketch in Python3 zum Abfragen sieht wie folgt aus und muss mit „sudo python3 …“ gestartet werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(18,GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(27,GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(22,GPIO.IN, pull_up_down=GPIO.PUD_UP) while True: if not GPIO.input(18): print("18 gedrückt!") if not GPIO.input(27): print("27 gedrückt!") if not GPIO.input(22): print("22 gedrückt!") GPIO.cleanup() # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4 |
Eigentlich sind die GPIO-Pins, die auf der Adafruit-Platine des PiTFT für die Buttons aufgedruckt sind folgende: 23, 22, 21, 18.
Den GPIO 23 nutze ich, wie im Adafruit-HowTo beschrieben, als Shutdown- und Startbutton für den Pi. 22, 21 und 18 hätte ich also frei.
Nur habe ich festgestellt, dass Pin 21 auf einem RPI rev 2.0-Board keinen internen PullUp-Widerstand besitzt, und darüber auch keine 3V Spannung kommen – ergo auch kein Tastendruck erkannt wird. Durch einen Post im Adafruit-Forum wurde ich darauf hingewiesen, statt Pin 21 die Nummer 27 zu verwenden – der GPIO-Pin ist wohl intern doppelt belegt.
Das Script kurz abgeändert, aus 21 die 27 gemacht, und schwupp – funktioniert! Habe 3 Tage nach einer Lösung gesucht… 🙂
Update: Das ist doch ein Witz! 🙂 Auf der mir gelieferten Adafruit-Platine ist tatsächlich 27 als GPIO-Belegung unter dem Taster aufgedruckt! Auf allen Bildern im Internet steht dort statt 27 die 21 – hätte man mal besser bei der Montage aufgepasst 🙂
[…] zuvor erwähnt, arbeite ich gerade an einem Adafruit PiTFT, dass auf einen Raspberry Pi gesteckt […]