multipress 4x5-Buttonmatrix

  • Guten Abend,

    ich habe eine art Gameboy mit nem Pi 3 und Retropie gebaut und nutze eine 4x5 Buttonmatrix.

    Leider kann ich trotz Sperrdioden die Buttons die auf einer Zeile liegen nicht gleichzeitig benutzen.

    Zb. nach links laufen(A2) und gleichzeitig springen(B2).

    mein Code:

    meine Buttonmatrix:

    matrixbfkpv.jpg

    Ich hoffe es kann mir Jemand helfen.

  • Ursprünglich habe ich es hier her: klick hier

    für viele Spiele ist es wichtig das mehrere Buttons gleichzeitig erfasst werden und in meinem fall werden sie es nicht, sofern die gedrückten Buttons in einer Zeile der Buttonmatrix liegen.

    Die Buttons aus einer Spalte lassen sich gleichzeitig drücken.

    Ich habe die Buttonmatrix erst ohne die Dioden gebaut und dachte es liegt daran, jetzt bin ich mit meinem Latain am Ende.

    eine evtl. möglichkeit wäre noch die Spalten oder Zeilen mit einem Pull-Up/Down-widerstand zu versehen aber wenn ich es dem Tutorial/Code richtig entnehme wird das Softwaretechnisch schon vom Pi übernommen.

  • Moin $es4m. ,

    keypad_pins: keypad_pins {
    brcm,pins = <5 6 12 13 16 19 20 21 26>;
    brcm,function = <0>; // input
    brcm,pull = <1>; // 0=off, 1=down, 2=up
    };

    Wieso hast du diese Werte eingesetzt. Was ist der Grund dafür?


    Du schreibst in Beitrag #3 was von pullup/down. Du hast sie doch schon als pulldown gesetzt.

    // row1 colA KEY_UP 103
    0x00000067

    Wie hast du diese Werte errechnet bzw. bestimmt?

    Zb. nach links laufen(A2) und gleichzeitig springen(B2).

    Ist das nun, für dich, eine Spalte oder Zeile??

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Code
    // row1 colA KEY_UP 103
    0x00000067

    die letzen 2 Stellen stehen für den Hex-Code der Taste aus der "/usr/include/linux/input-event-codes.h" die ich von Dez(103) in Hex(67) umgerechnet habe.

    Die ersten beiden Stellen nach dem "0x" stehen für die Reihe, die 3. und 4. stelle nach dem "0x" sind die Spalte

    Code
    fragment@1 {
                    target = <&gpio>;
                    __overlay__ {
                        keypad_pins: keypad_pins {
                            brcm,pins = <5 6 12 13 16 19 20 21 26>;
                            brcm,function = <0>; // input
                            brcm,pull = <1>; // 0=off, 1=down, 2=up
                            };
                        };
                    };

    der Teil ist aus einem anderem Beitrag und brachte die Matrix überhaupt zum laufen.


    Ist das nun, für dich, eine Spalte oder Zeile??

    Ich habe zu Testzwecken viel rumprobiert und noch eine Zeile hinzugefügt. Zeilen und Spalten von Grafik und Code sind nicht mehr stimmig.

    Es kann:

    Code
    // row2 colA  KEY_LEFT		105
    0x01000069

    und

    Code
    // row2 colB  KEY_Y			21
    0x01010015

    nicht gleichzeitig verwendet werden.

  • Moin $es4m. ,

    danke für deine Ausführungen.

    Kann es sein das das Programm nur die "row" abfragt?

    Meine Vermutung: "col" sind Eingänge. Er legt high an "col" und schaut welche "row" sich ändert. Hat er ein Ergebnis, wird die Abfrage abgebrochen.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo $es4m.,

    ohne jetzt ins Detail mit Deinem Keypad einzugehen...

    ein Keypad funktioniert so, dass Zeilen (oder Spalten) in schnellem Wechsel als Ausgang angesteuert werden und auf diese Weise eine Spannung anliegt.

    Erfolgt ein Tastendruck auf EINER der angeschlossenen Spalten (Zeilen) erfolgt irgendwo an einem Digitaleingang ein Pegelwechsel. Aus der Info, welche Zeile (Spalte) gerade angesteuert wurde und welche Spalte (Zeile) mit dem Digitaleingang korrespondiert, kann man auf die gedrückte Taste rückschließen.

    Somit funktioniert es prinzipiell nicht, dass Ereignisse auf mehreren Zeilen (Spalten) erkannt werden können.

    Denkbar ist allerdings, dass quasi-gleichzeitiger Druck von mehreren Spalten (Zeilen) erkannt werden kann, da dann mehrere Digitaleingänge einen Pegelwechsel aufweisen.

    Wenn Du gleichzeitig mehrere Tasten drücken willst und Deine Software das erkennen können soll, dann ist es unabdingbar, dass die Tasten so angesteuert werden, dass sie auch an der gleichen Stromschiene liegen.

    Oder, dass solche Tasten unabhängig von der Zugehörigkeit zu Zeile und Spalte einen eigenen zusätzlichen Digitalausgang permanent erhalten und einen eigenen Digitaleingang zugeordnet bekommen. Dann ist es nur noch Software, gleichzeitige Ereignisse erkennen zu können.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Also, ich hab mir zwar deinen Code nicht angesehen und kann dir deshalb nicht sagen, wo das Problem genau liegt, aber natürlich ist es prinzipiell selbstverständlich möglich, eine Matrix in so schneller Folge anzusteuern, dass du "quasi gleichzeitig" beliebige Tastendrücke erkennen kannst. Wirklich gleichzeitig ist es natürlich nicht, aber wenn du jede Millisekunde die komplette Matrix abfragst, hast du auch maximal eine ms unterschied in der Erkennung "gleichzeitiger" Tastendrücke. Der kritische Faktor ist die Frequenz der Abfrage der Matrix. Da der Pi sich schwertut mit Echtzeit, Timern usw. ist das allerdings nicht einfach. Vielleicht ist es sinnvoll, einen µC einzusetzen, der die Tasten mit hoher Frequenz überwacht und Tastendrücke über eine schnelle Schnittstelle an den Pi meldet.

    Wie viele Tasten werden denn gleichzeitg gedrückt? Wenn es sicher nur zwei sind, brauchst du eigentlich keine Disoden. Aber da man nicht ausschließen kann, dass jemand mehr als zwei Tasten drückt, kommst du an den Dioden nicht vorbei. Jedenfalls kannst du mit den Dioden beliebig viele Tasten gleichzeitig drücken und sicher erkennen. Allerdings wie gesagt nur im (ggf. sehr schnellen) Wechsel jeweils zeilenweise.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

    Einmal editiert, zuletzt von Gnom (16. Februar 2020 um 22:28)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!