4 x 3 Zeichen Keypad am Raspberry Pi

4 x 3 Zeichen Keypad am Raspberry Pi Titelbild

Mit dem nächsten kleinen Helferlein kann man viele tolle Projekte umsetzen. Was? Du glaubst uns nicht, dass ein einfaches Keypad das Potenzial hat, die Welt zu verändern? Na dann erzähl uns doch mal bitte, wie man sonst Telefonnummern auf einem Tastentelefon eingeben sollte!

Da wir die unverkennliche Wichtigkeit eines Keypads geklärt haben, können wir uns im Folgenden ja an die Grundlagen dessen Nutzung machen.

Alles, was du brauchst, ist ein 4x3 Keypad, Female -> Male Jumper Kabel und deinen laufenden Raspberry Pi. Die Funktionsweise eines Keypads ist sehr simpel. Jede Taste kannst du dir dabei wie einen einzelnen Button vorstellen. Wenn die Taste gedrückt wird, verbinden sich zwei Metallplättchen und es fließt Strom. Durch ein ausgeklügelten Mechanismus müssen wir nicht alle zwölf Buttons einzeln auslesen, sondern werden mit dem Programm zuerst durch die drei Spalten Strom fließen lassen und dann die einzelnen Zeilen ausmessen, ob Strom fließt. Wenn das der Fall ist, wissen wir genau welche Taste gedrückt wurde. Das kann der Pi so schnell, dass zu jedem Zeitpunkt gemessen werden kann, welche Taste gerade gedrückt wurde.

272.png

Da das Keypad weder an GND noch an 3,3V/5V angeschlossen werden muss, ist es am einfachsten es direkt an den Raspberry Pi anzuschließen.

Anschlüsse Pi Anschlüsse am Keypad
GPIO 6 1
GPIO 13 2
GPIO 19 3
GPIO 26 4
GPIO 16 5
GPIO 20 6
GPIO 21 7

Zum Programm

nano keypad.py
import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BCM)

matrix = [['1','2','3'],
    ['4','5','6'],
    ['7','8','9'],
    ['*', '0', '#']]

spalte = [16, 20, 21]
zeile = [6, 13, 19, 26]

for j in range(3):
    gpio.setup(spalte[j], gpio.OUT)
    gpio.output(spalte[j], 1)

for i in range(4):
    gpio.setup(zeile[i], gpio.IN, pull_up_down = gpio.PUD_UP)

def keypad():
    while True:
        for j in range(3):
            gpio.output(spalte[j], 0)
            for i in range(4):
                if gpio.input(zeile[i]) == 0:
                    benutzerEingabe = matrix[i][j]
                    while gpio.input(zeile[i]) == 0:

                        pass
                    return benutzerEingabe                  
            gpio.output(spalte[j], 1)
    return False

try:
    while True:
        print(keypad())
        time.sleep(0.2)
except KeyboardInterrupt:
    gpio.cleanup()

[Lass dich nicht von dem Zeilenumbruch in Zeile 20 irritieren]

Schritt für Schritt erklärt

In den ersten 4 Zeilen importieren wir die benötigten Bibliotheken und legen die Pinnnummerrierung fest. In Zeile 6 erstellen wir eine mehrdimensionale Liste, welche unser Keypad abbildet. Wenn wir uns eine Liste vorstellen mit einer Box, in der wir verschiedenste Sachen speichern können, ist eine mehrdimensionale Liste eine Box mit weiteren Boxen in der dann viele Sachen gespeichert werden können. Diese Listen in der Liste bekommen auch eine Nummerierung. Das heißt, wenn wir jetzt print(matrix[0][0]) eingeben würden, würde dort "a" ausgegeben werden. [panel-info][panel-body]Es kann sein, dass Nano dir anzeigt, dass es in der letzten Zeile einen Kommentar gibt. Die # wird aber von Python nicht als Kommentar verstanden, weil sich diese in einem String befindet[/panel-body][/panel] In Zeile 11 und 12 werden die verschiedenen Spalten und Zeilen gespeichert. Es ist wichtig, dabei zwischen Spalten und Zeilen zu unterscheiden, da diese haben unterschiedliche Funktionen haben. In Zeile 14 kümmern wir uns zuerst darum, dass alle Spalten Pins auch als Output gesetzt werden. Um uns Arbeit zu ersparen, benutzen wir dafür eine for Schleife. In Zeile 17 werden die Output dann auch gleich so geschaltet, dass diese Strom abgeben. In Zeile 18 und 19 machen wir genau das Gleiche nur mit den Zeilen und natürlich setzen wir diese als Input, denn die sollen ja Strom messen. In Zeile 22 starten wir unsere eigene Funktion und nennen sie passenderweiser keypad. In Zeile 23 fängt die while Schleife an. Diese läuft solange, wie die Funktion noch keinen Wert zurückgeben hat. Das heißt, wenn die Funktion aufgerufen wird und mit return ein Wert zurückgegeben wird, wird auch die while Schleife beendet. Wie oben schon gesagt, gehen wir zuerst alle Zeilen durch und schalten Strom an. Das Durchgehen der einzelnen Zeilen machen wir in Zeile 24 mal wieder mit der for Schleife. In Reihe 25 lassen wir dann Strom durch alle Zeilen laufen. In Zeile 26 benutzen wir die for Schleife und messen dann in Zeile 27, ob dort Strom fließt, denn wenn gpio.input(gpioPIN) etwas misst, wissen wir, dass ein Button gedrückt wurde, weil nur dann dort Strom fließen kann.

Im nächsten Schritt speichern wir in der Variablen benutzerEingabe, welcher Button gedrückt wurde, denn die Vorarbeit haben wir schon mit der mehrdimensionalen Liste gemacht. Jetzt können wir aber nicht sofort diesen Wert zurückgeben, weil der Pi das alles so schnell misst, dass selbst wenn wir nur kurz eine Taste drücken, es trotzdem doppelt angezeigt werden könnte. Deswegen gibt es in Zeile 29 eine while Schleife, die solange läuft, wie der Button gedrückt wurde. Solange das der Fall ist, macht unser Programm nichts, denn mit pass sagen wir dem Pi, dass er einfach nichts machen soll. Danach geben wir einfach den Wert zurück. In Zeile 39 rufen wir dann die Funktion auf und weil es erstmal nur simpel sein soll, geben wir sie einfach aus. Wichtig ist, dass wir dann in Zeile 40 erst mal 0.2 Sekunden warten, damit es nicht zu doppelten Eingaben kommt. Jetzt haben wir es endlich geschafft!

Damit du dir das besser vorstellen kannst, gibt es hier einmal die Rückseite eines Keypads, wenn die Schutzfolie entfernt wurde: 282.JPG

Noch Fragen oder Feedback?

Bevor du eine Frage stellen kannst musst du dich zuerst Anmelden oder Regestrieren!