Raspberry Pi Keypad anschließen – Codeschloss

23. June 2016
30 Comments

Für den Arduino und Raspberry Pi gibt es einige Keypad Matrizen, welche relativ einfach angeschlossen und ausgelesen werden können. Ähnlich zum Numpad an einer Tastatur besitzen diese Keypads 3×4 oder 4×4 Tasten. Eingesetzt werden können diese Module bspw. als Codeschlösser oder zum Bau eines kleinen Taschenrechners. Mithilfe ein paar kleiner Veränderungen kann sogar eine T9 Tastatur erstellt werden, womit Texte wie auf älteren Handys eingetippt werden können.

In diesem Tutorial zeige ich den Anschluss einer solchen Keypad Matrix und wie man diese mit den GPIOs einfach auslesen kann. Um weniger GPIOs zu benutzen ist auch ein Anschluss über den I2C Port Expander MCP23017 möglich.

 

Zubehör

Wie bereits erwähnt gibt es einige verschiedene Modelle dieser „Membranschalter“, wobei sich hauptsächlich die Größe und Beschriftung unterscheidet. In diesem Tutorial habe ich eine 3×4 Tastatur verwendet, jedoch ist es kein Problem das ganze für ein 4×4 (oder größeres) Keypad anzupassen.
Folgende Modelle stehen zur Auswahl:

Außerdem solltest du noch Male-Female Jumper Kabel zur Hand haben.

Welches Raspberry Pi Model du verwendest spielt keine Rolle, solange du mindestens 7 bzw. 8 freie GPIOs hast.

 

Anschluss und Funktion des Raspberry Pi Keypad

Im Grunde können alle freien und ansteuerbaren GPIOs dafür gewählt werden. Je nachdem ob du eine 3×4 bzw. 4×4 Matrix Membran hast werden 7 bzw. 8 Pins belegt. Am besten eignen sich Male-Female Jumper Kabel, welche in die Anschlüsse des Keypads passen. Der grundsätzliche Aufbau einer solchen Tastatur Matrix ist wie folgt:

Raspberry Pi Keypad schema

Die ersten 4 Pins von links sind hierbei für die Zeilen, die weiteren 3 bzw. 4 Anschlüsse für je eine Spalte. Sobald eine Taste gedrückt wird werden zwei Leitungen miteinander verbunden. Um herauszufinden ob und falls ja, welche Taste gedrückt wurde, wird jeweils durch die ersten vier Leitungen kurz ein Signal gesendet. Die restlichen Pins werden „abgehört“.

Wurde z.B. nur Taste 6 gedrückt, so würden die Leitungen „Zeile 2“ und „Spalte 3“ verbunden sein. Senden wir also an dem GPIO für Zeile 2 einen Strom wird nur am GPIO für Spalte 3 ein HIGH Signal empfangen. Alle anderen GPIOs empfangen kein Signal. Indem wir also durch alle Zeilen ein Signal schicken und daraufhin alle Spalten überprüfen, so können wir feststellen, ob eine Taste gedrückt wurde und natürlich auch welche.

 

Nun, wie bereits erwähnt ist es egal welche 7 bzw. 8 GPIOs man verwendet, jedoch muss dies im Code später ggf. angepasst werden. In diesem Beispiel verwende ich ein 3×4 Keypad, also habe nur 7 GPIOs zu belegen. Von links nach rechts ist die Belegung wie folgt:

3×4 Keypad Raspberry Pi
Pin 1 GPIO 7 (Pin 26)
Pin 2 GPIO 8 (Pin 24)
Pin 3 GPIO 11 (Pin 23)
Pin 4 GPIO 25 (Pin 22)
Pin 5 GPIO 9 (Pin 21)
Pin 6 GPIO 10 (Pin 19)
Pin 7 GPIO 15 (Pin 10)

 

Schematisch sieht es dann wie folgt aus:

Raspberry Pi Keypad Numpad 3x4 Steckplatine

 

 

Code zum Ansteuern des Keypads

Um die kleine Tastatur nun benutzen zu können, laden wir uns eine kleine Bibliothek von GitHub. Zuerst erstellen wir einen Ordner.

mkdir keypad-rpi && cd keypad-rpi

Anschließend downloaden wir die Datei:

wget -O keypad.py https://raw.githubusercontent.com/rainierez/MatrixKeypad_Python/master/matrix_keypad/RPi_GPIO.py

Falls du eine 4×4 Tastatur bzw. andere GPIOs als ich verwendest, musst du die GPIO Nummern im Code entsprechend anpassen (sudo nano keypad.py).

 

Nun können wir jene Klasse verwenden. Um die Funktionsweise zu verdeutlichen habe ich ein kleines Beispiel erstellt. Um dieses nachzumachen, erstelle eine neue Datei

sudo nano example.py

mit folgendem Code:

Die Datei kannst du mit STRG+O, STRG+X speichern und beenden.

Führen wir die Datei nun aus, können die Eingaben auslesene werden.

sudo python example.py

 

Im nachfolgenden Video siehst du wie das Auslesen der Zahlen aussehen kann:

30 Kommentare

    • Hi,
      ich habe doch ein 3×4 Keyboard verwendet 🙂
      Falls du eine 4×4 Matrix hast, kannst du irgendeinen freien weiteren GPIO nehmen. Dann musst du das nur noch im Code angeben und es mit kp = keypad(columnCount = 4) initialisieren.
      LG, Felix

      Antworten
    • Hallo Felix,
      tut mir leider ich meinte 4×4.
      Reicht es nur kp = keypad(columnCount = 4) auf 4 zu ändern?

      Antworten
  1. Klasse!!!!!!
    Immer, wenn ich auf deine Seite gehe, bin ich gespannt was du uns als nächstes wieder Neues präsentierst…!

    Antworten
  2. Hallo,

    bei der Umstellung auf 4×4 ist noch ein kleiner Fehler zu beseitigen:
    In der Keypad.py steht:

    # if colVal is not 0 thru 2 then no button was pressed and we can exit
            if colVal 2:
                self.exit()

    Hierbei werden nur Spalten von 0-2 akzeptiert, die 3 als Wert für die 4. Spalte (A, B, C, D auf dem Keypad) wird damit ignoriert.
    Einfach in colVal >3:
    ändern und schon geht’s 😀

    Gruß
    Cornel

    Antworten
    • Ja, dafür müsstest du den Code aber ein wenig verändern. Im Moment wird ja abgebrochen, sobald eine Taste gedrückt wurde und danach nicht mehr geprüft wird, ob ggf. noch eine andere Taste gedrückt ist.

      Antworten
  3. Also in einer Endlosschleife hab ich es schon drin. Über try: except: kann beendet werden. Mein Ziel ist es Ausgänge zu schalten, Zum Test erstmal LEDs. Das klappt auch schon wenn ich z.B. sage wenn eine 1 gedrückt wurde, schalte Pin x 5sec ein. Ich möchte aber das der PIN (bzw. eben auch 2 gleichzeitig) für die Dauer des Tastendruckes geschaltet wird. da steh ich grad echt aufm Schlauch. Mit sleep() ist es eh schlecht da dann während dieser Zeit gar nix anderes geht.

    Antworten
  4. Hallo,
    mich würde interessieren, ob es auch „Klingelboards“ für Bastler gibt die man mit dem Raspi kombinieren kann. Ich möchte DoorPI nutzen und benötige dazu passende Klingeltableaus; 16er und 32er. Ich finde aber nur diese Keypads.
    Hat jemand eine Idee?

    VG
    Matthias

    Antworten
  5. Hallo Felix,

    hast du zufälligerweise den anschluss des Keypad über den MCP23017 schonmal realisiert und könntest uns den Quellcode zur Verfügung stellen?

    Gruß Micha

    Antworten
    • Hallo Michael,
      nein leider nicht. Allerdings sollte sich die Anpassung dazu in Grenzen halten – da nur jene Stellen umgeschrieben werden müssten, wo die GPIO Bibliothek benutzt wird.

      Antworten
  6. Hallo,
    was mache ich wenn mein Numernpad bloß Löcher in unten in der Platine hat und kein Kabel? z.B: sowas hier: aliexpress.com/item/Free-Shipping-16-4×4-Matrix-Keyboard-Keypad-Use-Key-PIC-AVR-Stamp-Sml/1072484015.html?spm=2114.13010308.0.0.ZLcjBP

    Antworten
  7. Gibt ein Keypad das Kabellos ist und dafür aber funktioniert?
    Da mein RPi am ganz anderen Ende des Raumes steht.

    Antworten
    • Nein, leider nicht. Du kannst das Keyboard schon benutzen, aber eben nicht mit diesem Tutorial – es sollte im Normalfall wie eine Tastatur ohne weiteres erkannt werden.

      Antworten
  8. Hi I did the same code, but just I can put a 1 digit, the other doesn’t appear, I mean dont work like your video my results is :
    1
    [2, 2, 3, 3]

    Why if I push 1, 2, 3 ….. dont appear :
    1
    2
    3

    I have same code like your example. Any help? regards

    Antworten
  9. Hallo.

    Ich benötige das Keypad um bei richtiger Codeeingabe ein anderes Script zu schliessen.
    Dazu würde ich gerne bei jedem Tastendruck eine LED aufleuchten lassen. Wo müsste ich das einfügen? Ausserdem wäre eine Löschfunktion sehr nützlich. Hättest du eine Idee?
    Und was muss man einfügen, damit das Script nicht geschlossen wird, nachdem man den Code eingegeben hat.?

    Antworten
    • LEDs kannst du super einfach schalten (siehe z.B. dieses Tutorial). Einfach die Taste per Nummer identifizieren (if..) und den entsprechenden GPIO schalten. Ein anderes Skript kannst du z.B. mit dem Linux Befehl pkill beenden. Das aufgerufene Skript beendest du z.B. mit exit()

      Antworten
  10. Hallo,

    Wenn ich example.py ausführe kommt ein indentationError.
    Jedoch habe ich keine Ahnung warum und wie ich den beheben kann:
    Wenn ich example.py ausführe, wird mir folgendes angezeigt
    Traceback (most recentcall latest):
    File „example.py“, line 3, in
    from keypad import keypad
    File „/home/pi/keyboard-rpi/keyboard.py“, line 18
    self.row = [12,24,23,22]
    ^
    IndentationError: unexpected indent

    Antworten
  11. Hallo Felix reicht es die GPIOs nur in das verzeichnis zuschreiben also so:

    GPIO 23
    GPIO 11
    …….

    oder wie muss ich das machen

    Antworten
      • import time
        import RPi.GPIO as GPIO
        from keypad import keypad

        GPIO.setwarnings(False)

        keypad = [ [„1″,“2″,“3″,“A“]
        [„4″,“5″,“6″,“B“]
        [„7″,“8″,“9″,“C“]
        [„*“,“0″,“#“,“D“] ]

        COL_PINS = [3,5,6,13] # BCM numbering
        ROW_PINS = [19,26,20,21] # BCM numbering

        factory = rpi_gpio.KeypadFactory()

        keypad = factory.create_keypad(keypad=KEYPAD, row_pins=ROW_PINS, col_pins=COL_P$

        keypad.registerKeyPressHandler(processKey)

        def processKey(key):
        if (key==“1″):
        print(„number“)
        elif (key==“A“):
        print(„letter“)

        Das ist mein aktueller Code aber er bringt mir folgenden Fehler:

        Traceback (most recent call last):
        File „example.py“, line 9, in
        [„4″,“5″,“6″,“B“]
        TypeError: list indices must be integers, not tuple.

        Ich habe auch schon deinen Code versucht aber da tippt er dann statt ne 9 ne 1 usw. Ich habe die gleichen GPIOs wie du verwendet + einen GPIO für den 8 Slot.
        Manchmal kommt das eingetippte gefühlt 10 Std später.
        Deshalb meine Fragen wo ändert man die GPIOs genau und kann man meinen aktuellen Code zum laufen bringen.

        LG

      • OK der Code davor hat zu viele Fehler in sich da stimmt die datei zum download zu dem code gar nicht. Also vergessen wir das wieder und gehen zu deinem Code der nämlich richtig ist für 3×4 (wer hätte es gedacht? 😉 ) Aber wenn ich den columnCount = 4 setzte bringt er den Fehler:

        Traceback (most recent call last):
        File „example.py“, line 14, in
        digit = kp.getKey()
        File „/home/pi/keypad-rpi/keypad.py“, line 38, in getKey
        GPIO.setup(self.COLUMN[j], GPIO.OUT)
        ValueError: The channel sent is invalid on a Raspberry Pi.

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!