oiooiooioiioooiioiioiooo
Goto Top

GPIO Erfassung Keypad für Raspberry PI unter einem Bash Script Linux

Guten Tag,

ich stehe vor einem Problem und suche eine Lösung.

Ich möchte ein einfachen Script mit Dialog für einen PI schreiben:

Beispiel

#!/bin/bash
CODE=$(dialog --passwordbox "Ihre Karte bitte" 10 30 3>&1- 1>&2- 2>&3-)  

Mein Problem ist es, ich möchte zur dem PI das 4x4 Keypad verwenden. Und die Tasten wie '*' als Enter und '#' als ESC anwenden. (Ich weiß zwar noch nciht wie, aber das ist mein Plan. face-smile)

Aus der nachfolgenden Seite habe ich den Script genommen.

https://codingworld.io/project/das-keypad

import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BCM)

matrix = [["1","2","3", "A"],  
    ["4","5","6", "B"],  
    ["7","8","9", "C"],  
    ["*", "0", "#", "D"]]  

spalte = [12, 16, 20, 21]
zeile = [18, 23, 24, 25]

for j in range(4):
  gpio.setup(spalte[j], gpio.OUT)
  gpio.output(spalte[j], 1)
  gpio.setup(zeile[j],gpio.IN, pull_up_down=gpio.PUD_UP)

def keypad():
  while True:
      for j in range(4):
          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()

Und stelte fest, das Funktioniert so nicht. face-sad

Der Script für Keypad läuft für sich allein und hat mit Bash erst mal nichts zu tun. Dann habe ich überlegt, man könnte mit hohe Sicherheit auch über Bash das GPIO überwachen lassen, nur wie mache ich das?

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO

Content-ID: 546319

Url: https://administrator.de/contentid/546319

Ausgedruckt am: 21.11.2024 um 22:11 Uhr

Bitboy
Bitboy 12.02.2020 um 12:53:16 Uhr
Goto Top
Hi,

es ist zwar nicht genau klar was du zu tun versuchst aber GPIO kannst du über bash ganz einfach abfragen:
https://raspberrypi.stackexchange.com/questions/15283/how-to-get-the-sta ...

wiringpi bzw das gpio programm ist in rasbian vorinstalliert.


Grüße
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 12.02.2020 um 14:15:53 Uhr
Goto Top
Guten Tag @Bitboy,

vielen Dank für deine Antwort.

es ist zwar nicht genau klar was du zu tun versuchst aber GPIO kannst du über bash ganz einfach abfragen:

Meine Absicht ist es die Tasten von Keypad unteranderem in das in das Passwort Feld zu übertragen, genau so wie in weiteren Menü mit Zifern 1-9 für die Vorauswahl zu arbeiten.

https://raspberrypi.stackexchange.com/questions/15283/how-to-get-the-sta ...
wiringpi bzw das gpio programm ist in rasbian vorinstalliert.

Mit dem Script bekomme ich leider keine Ausgabe.

#!/bin/bash
while :
do
gpio mode 0 in
b=$(gpio read 0)
echo "$b"  
sleep 0.2
done



Auch wenn ich jede einzelne Taste gedrückt halte und in der Konsole

gpio read 11

eingebe. Bekomme ich immer nur 0 ausgegeben.

Viele Gürße

@OIOOIOOIOIIOOOIIOIIOIOOO
Bitboy
Lösung Bitboy 12.02.2020 um 14:55:37 Uhr
Goto Top
Wenn du möchtest, dass dein keypad wie eine Tastatur funktioniert, dann wirste einen entsprechenden Treiber benötigen.

Mit gpio kannst du nur einzelne gpio pins abfragen. Das Keypad benutzt aber pro Tastendruck mehr als einen pin, die Info allein hilft dir also nicht weiter. Sofern das von dir gepostete Script "funktioniert" also Tastendrücke erkennt lässt sich erahnen dass gpio 11 gar nicht benutzt wird.
spalte = [12, 16, 20, 21]
zeile = [18, 23, 24, 25]
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 12.02.2020 um 15:51:25 Uhr
Goto Top
Wenn du möchtest, dass dein keypad wie eine Tastatur funktioniert, dann wirste einen entsprechenden Treiber benötigen.

Einen Treiber gibt es dafür glaube ich nicht...

Mit gpio kannst du nur einzelne gpio pins abfragen. Das Keypad benutzt aber pro Tastendruck mehr als einen pin, die Info allein hilft dir also nicht weiter. Sofern das von dir gepostete Script "funktioniert" also Tastendrücke erkennt lässt sich erahnen dass gpio 11 gar nicht benutzt wird.
spalte = [12, 16, 20, 21]
zeile = [18, 23, 24, 25]

Der Python Script funktioniert.

Zwischen durch habe ich mal das Export ausprobiert.

echo "12" > /sys/class/gpio/export  
echo "16" > /sys/class/gpio/export  
echo "18" > /sys/class/gpio/export  
echo "20" > /sys/class/gpio/export  
echo "21" > /sys/class/gpio/export  
echo "23" > /sys/class/gpio/export  
echo "24" > /sys/class/gpio/export  
echo "25" > /sys/class/gpio/export  

cat /sys/class/gpio/gpio12/value 

Hier wird mir mal 1 und mal 0 ausgegeben egal ob ich eine taste drücke oder nicht face-smile

Also ich suche mal weiter....
Bitboy
Bitboy 12.02.2020 um 16:30:34 Uhr
Goto Top
Hm. mir scheint du hast noch sehr wenig erfahrung damit.
Die Erklärung find ich recht gut: https://tutorials-raspberrypi.de/raspberry-pi-keypad-tastatur/

Mit dem Echo Befehl von dir schaltest du einzelne GPIO ein oder aus.
Du setzt also einen Wert, aber du liest ihn nicht.
Hängt auch etwas davon ab wie du es verkabelt / konfiguriert hast. Stichwort pullup / pulldown Widerstand.
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 13.02.2020 aktualisiert um 15:55:36 Uhr
Goto Top
Guten Tag @Bitboy,

Hm. mir scheint du hast noch sehr wenig erfahrung damit.
Wenig? Ich würde mal bei ein Skala vor 10 auf 0,1-0,4 schätzen. face-smile

Die Seite habe ich bereits versucht zu verstehen, bin jedoch auf den Entschluss gekommen, dass ich ohne einen Treiber für das Keypad nicht voran kommen würde. Man muss ja das Rad nicht neu erfinden. Außerdem würde es meinen geplanten Script unnötig komplexer machen.

Ich hab folgende Seiten gefunden und ausprobiert:
http://blog.gegg.us/2017/08/a-matrix-keypad-on-a-raspberry-pi-done-righ ...
https://debianforum.de/forum/viewtopic.php?t=52662
https://www.raspberrypi.org/documentation/configuration/device-tree.md

Und nun habe ich folgendes gemacht.

Die Datei von der Seite blog.gegg.us gegriffen und wie folgt umgeschrieben:

 /dts-v1/;
    /plugin/;
    / {
           compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";  

           fragment@0 {
              target-path = "/";  
              __overlay__ {
                 keypad: MATRIX4x4 {
                    compatible = "gpio-matrix-keypad";  
                    debounce-delay-ms = <10>;
                    col-scan-delay-us = <10>;
                    /* 
		       try to use GPIO only lines
                       to keep SPI and I2C usable
                    */
                    row-gpios = <&gpio 18 0    // 1
                                 &gpio 23 0    // 2
                                 &gpio 24 0    // 3
                                 &gpio 25 0>;  // 4

                    col-gpios = <&gpio 12 0    // 5
                                 &gpio 16 0    // 6
                                 &gpio 20 0    // 7
                                 &gpio 21 0>;  // 8
                    /*
                      Keycodes from /usr/include/linux/input-event-codes.h
                      converted to hex using printf '%02x\n' 
                    */

                    linux,keymap = <
                                    // col0 row0 KEY_KPENTER
                                    0x03000060
                                    // col0 row1 KEY_KP0
                                    0x01000052
                                    // col0 row2 KEY_ESC
                                    0x03010001
                                    // col0 row3 KEY_RIGHT
                                    0x0200006a
				    // col1 row0 KEY_KP7
                                    0x00010047
                                    // col1 row1 KEY_KP8
                                    0x01010048
                                    // col1 row2 KEY_KP9
                                    0x02010049
                                    // col1 row3 KEY_LEFT
                                    0x00000069
                                    // col2 row0 KEY_KP4
                                    0x0002004b
                                    // col2 row1 KEY_KP5
                                    0x0102004c
                                    // col2 row2 KEY_KP6
                                    0x0202004d
                                    // col2 row3 KEY_DOWN
                                    0x0302006c
                                    // col3 row0 KEY_KP1
                                    0x0003004f
                                    // col3 row1 KEY_KP2
                                    0x01030050
                                    // col3 row2 KEY_KP3
                                    0x02030051
                                    // col3 row3 KEY_UP
                                    0x03030067>;
                 };
              };
           };
      };
unter /root/4x4matrix.dts gespeichert.

Bei der eingabe von modeinfo, bekomme ich jetzt schon die passende Ausgabe:

$ modinfo matrix-keypad
filename:       /lib/modules/4.19.97-v7l+/kernel/drivers/input/keyboard/matrix_keypad.ko
alias:          platform:matrix-keypad
license:        GPL v2
description:    GPIO Driven Matrix Keypad Driver
author:         Marek Vasut <marek.vasut@gmail.com>
srcversion:     DD9CE2D3AB1816B2A6662F0
alias:          of:N*T*Cgpio-matrix-keypadC*
alias:          of:N*T*Cgpio-matrix-keypad
depends:        matrix-keymap
intree:         Y
name:           matrix_keypad
vermagic:       4.19.97-v7l+ SMP mod_unload modversions ARMv7 p2v8 

Trotzdem habe ich mir das " make menuconfig " angeschaut und musste jedoch feststellen, dass die Option "GPIO driven matrix keypad support" dort nicht aufzufinden war. So bin ich vorgegangen:

$ cd /usr/src/
$ ls -l
$ apt-get install linux-source-4.18 
$ ls -l
$ tar xfJ linux-source-4.18.tar.xz 
$ ls -l
$ cd linux-source-4.18/
$ ls -l
$ make menuconfig
  HOSTCC  scripts/basic/fixdep
  UPD     scripts/kconfig/.mconf-cfg
  HOSTCC  scripts/kconfig/mconf.o
  YACC    scripts/kconfig/zconf.tab.c
/bin/sh: 1: bison: not found
make[1]: *** [scripts/Makefile.lib:196: scripts/kconfig/zconf.tab.c] Fehler 127
make: *** [Makefile:534: menuconfig] Fehler 2
$ apt-get install bison
$ apt-get install flex
make menuconfig

Unter "Devece Drivers" ---> "GPIO Support" eionen Sternchen geschenkt.

menuconfig

dtc -W no-unit_address_vs_reg -I dts -O dtb -o 4x4matrix.dtbo /root/4x4matrix.dts

wie angegeben in die /boot/config.txt in die letzte Zeile das hinzugefügt:

dtoverlay=4x4matrix

lsinput ist leider nicht vorhanden. Also einfach gleich neugestartet, und ..... es funktioniert nicht face-sad

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO
Bitboy
Bitboy 13.02.2020 um 15:56:11 Uhr
Goto Top
Sry, bei linux Treibern muss ich auch aussteigen, ich hätte gedacht vllt gibt es etwas fertiges für das Keypad.

Meine Empfehlung wäre gewesen: Python ist ja verhältnismäßig einfach. Du nutzt das Script was du hast und funktioniert und baust die Anwendung die eigentlich in bash machen wolltest in python um das funktionierende Script herum.
Halte ich aus dem Bauch raus für die einfachste Variante.
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 13.02.2020 um 16:02:49 Uhr
Goto Top
Sry, bei linux Treibern muss ich auch aussteigen, ich hätte gedacht vllt gibt es etwas fertiges für das Keypad.
Du hast mich doch auf den Treiber für das Keypad gebarcht face-smile

Meine Empfehlung wäre gewesen: Python ist ja verhältnismäßig einfach. Du nutzt das Script was du hast und funktioniert und baust die Anwendung die eigentlich in bash machen wolltest in python um das funktionierende Script herum.
Mein Bashscript ist bereits fertig und Python muss ich erst bei 0 lernen.

Vielleicht könnte mir einer, bei den Treiber für den Keypad, unter die Arme greifen face-sad
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 13.02.2020 um 16:24:28 Uhr
Goto Top
Noch ein Nachtrag:
lsinput ist leider nicht vorhanden. Also einfach gleich neugestartet, und ..... es funktioniert nicht
lsimput zeigt leider alle angeschlossene USB Geräte an, aber leider nicht das Keypad. face-sad
Bitboy
Bitboy 13.02.2020 aktualisiert um 17:12:51 Uhr
Goto Top
Hab leider nix zum ausprobieren zur Handaber neugierig wär ich ja schon....

Also die Anleitung geht erstmal von nem älteren Kernel aus der ohne den matrix Treiber erstellt wurde.
Auf Github ist allerdings eine Kerneländerung dokumentiert sodass für mein Verständnis, der komplette makemenu schritt wegfällt.

modeinfo liefert ja auch das richtige Ergebnis.

dieses dtc Kommando? war das erfolgreich?
dtc -W no-unit_address_vs_reg -I dts -O dtb -o 4x4matrix.dtbo /root/4x4matrix.dts

deine 4x4matrix.dtbo liegt im Verzeichnis /boot/overlays/ ? da liegen zumindest alle anderen dieser Dateien.
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 13.02.2020 um 17:15:25 Uhr
Goto Top
Hab leider nix zum ausprobieren zur Handaber neugierig wär ich ja schon....
wenn du ein Pi hast, kann ich dir ein Keypad zuschicken face-smile Habe noch eins da und muss so wie so noch einige bestellen. Und das nur dann wenn es funktioniert.

dieses dtc Kommando? war das erfolgreich?
dtc -W no-unit_address_vs_reg -I dts -O dtb -o 4x4matrix.dtbo /root/4x4matrix.dts
es wurde eine 4x4matrix.dtbo, ohne Fehler, erstellt. Und von Innen schaut diese auch gut aus.

You may need to install a package called input-utils first if this command ist not available on your Pi.
Hab ich bereits nachgerüstet und gibt das gewünschte Gerät leider nicht aus.
Bitboy
Bitboy 13.02.2020 um 17:17:47 Uhr
Goto Top
Ah sry hatte eben meinen Beitrag editiert weil ich zu spät gesehen hab dass du das Kommando nachinstalliert hast.

due dtbo liegt im Verzeichnis /boot/overlays/ vom pi?
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 13.02.2020 um 17:36:13 Uhr
Goto Top
due dtbo liegt im Verzeichnis /boot/overlays/ vom pi?

Diesen Schritt habe ich überflogen!!! -.-

Jetzt habe ich das Keypad im System

/dev/input/event1
   bustype : BUS_HOST
   vendor  : 0x0
   product : 0x0
   version : 0
   name    : "MATRIX4x4"  
   bits ev : EV_SYN EV_KEY EV_MSC EV_REP

root@raspberrypi:~# input-events 1
/dev/input/event1
   bustype : BUS_HOST
   vendor  : 0x0
   product : 0x0
   version : 0
   name    : "MATRIX4x4"  
   bits ev : EV_SYN EV_KEY EV_MSC EV_REP

Mit den Eingaben stimmt jedoch etwas nicht.... Ich muss mal die Matrix noch einmal mir angucken! Wenn das läuft bin ich vooooll glücklich!!! face-smile

Vielen Dank erstmal. Morgen mache ich weiter. Muss erstmal zur den Kindern.
Bitboy
Lösung Bitboy 13.02.2020 um 17:40:06 Uhr
Goto Top
Juhu face-smile

Ja, wahrscheinlich haste lustiges Pin tauschen vor dir, aber das is ja jetz die kleinste Hürde.
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 14.02.2020 um 09:01:06 Uhr
Goto Top
Guten Morgen,

warum Pins tauschen? Meinst du ich habe die Pins falsch gesteckt? Ich hätte ja gedacht, dass ich in der Matrix etwas falsch angeordnet habe.

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO 14.02.2020 um 14:57:30 Uhr
Goto Top
Guten Tag,

das Problem ist nun dank dem Verfasser von blog.geggus.net endgültig gelöst. face-smile

Mein Problem war, dass ich das hoch codierte Schlüssel nicht encodieren konnte.... Und somit den Wald vor lauter Bäumen nicht erkennen konnte!

Also:


Das steht da doch:

row << 24 | column << 16 | key-code

Gezählt wird ab 0.

Konkret aus meinem Beispiel:

KEY_LEFT
0x00000069


Da ist row und column 0.
KEY_KP0
0x01000052


Da ist row 1 und column 0

Was ich jedoch bis jetzt noch nicht heraus finden konnte ist wie man zum Beispiel bei KP0 auf 52 kommt....

Und der Treiber schaut bei mir nun so aus:

 /dts-v1/;
    /plugin/;
    / {
           compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709";  

           fragment@0 {
              target-path = "/";  
              __overlay__ {
                 keypad: MATRIX4x4 {
                    compatible = "gpio-matrix-keypad";  
                    debounce-delay-ms = <10>;
                    col-scan-delay-us = <10>;
                    /* 
		       try to use GPIO only lines
                       to keep SPI and I2C usable
                    */
                    row-gpios = <&gpio 18 0    // 1
                                 &gpio 23 0    // 2
                                 &gpio 24 0    // 3
                                 &gpio 25 0>;  // 4

                    col-gpios = <&gpio 12 0    // 5
                                 &gpio 16 0    // 6
                                 &gpio 20 0    // 7
                                 &gpio 21 0>;  // 8
                    /*
                      Keycodes from /usr/include/linux/input-event-codes.h
                      converted to hex using printf '%02x\n' 
                    */

                    linux,keymap = <
                                    // row0 col0 KEY_KP1
                                    0x0000004f
                                    // row1 col0 KEY_KP4
                                    0x0100004b
                                    // row2 col0 KEY_KP7
                                    0x02000047
                                    // row3 col0 KEY_KPENTER
                                    0x03000060

				     // row0 col1 KEY_KP2
                                    0x00010050
                                    // row1 col1 KEY_KP5
                                    0x0101004c
                                    // row2 col1 KEY_KP8
                                    0x02010048
                                    // row3 col1 KEY_KP0
                                    0x03010052

                                    // row0 col2 KEY_KP3
                                    0x00020051
                                    // row1 col2 KEY_KP6
                                    0x0102004d
                                    // row2 col2 KEY_KP9
                                    0x02020049
                                    // row3 col2 KEY_ESC
                                    0x03020001

                                    // row0 col3 KEY_LEFT
                                    0x00030069
                                    // row1 col3 KEY_RIGHT
                                    0x0103006a
                                    // row2 col3 KEY_UP
                                    0x02030067
                                    // row3 col3 KEY_DOWN
                                    0x0303006c>;
                 };
              };
           };
      };

Danke auch dir @Bitboy.

Viele Grüße

@OIOOIOOIOIIOOOIIOIIOIOOO