Die Joy-it SBC-Buttonmatrix

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 154
Registriert: Do 21. Okt 2010, 18:31

Die Joy-it SBC-Buttonmatrix

Beitrag von Heinrichs » Di 21. Jun 2022, 13:42

1. Grundlagen

Die Joy-it SBC-Buttonmatrix ist sehr einfach aufgebaut: Sie besteht aus 16 Tastern. Wird zum Beispiel der Taster S10 (Spalte 1, Reihe/Zeile 2) gedrückt, dann wird eine leitende Verbindung zwischen den Pins 5 und 1 des Moduls hergestellt (vgl. Abb.1 und nachfolgende Tabelle).

Button_matrix_beschriftet_mit_schaltbild.jpg
Abb. 1: Button-Matrix mit Schaltskizze
Button_matrix_beschriftet_mit_schaltbild.jpg (79.72 KiB) 1101 mal betrachtet

Die Zuordnung der Spalten- und Reihen-Indizes zu den Pins ergibt sich aus der folgenden Tabelle:

Pin der ButtonmatixSpaltenindexReihenenindexESP32-Pin
0-327
1-226
2-125
3-033
40-12
51-13
62-15
73-2

In dieser Tabelle wurde in der letzten Spalte auch gleich angegeben, wie ich diese Pins an den TTGO (ESP32) angeschlossen habe.


2. Ein einfaches Programm

Mit dem folgenden Programm button_mtx_1.py werden die gedrückten Taster angezeigt; zwei Anzeige-Möglichkeiten gibt es:
  • Angabe der Button-Bezeichnung gemäß der Platinenbeschriftung
  • Angabe von Reihen- und Spaltenindex
Die Funktionsweise des Programms wird durch die Kommentare erläutert.

Code: Alles auswählen

# button_mtx_1.py

# SBC_Button_Matrix
# Ein- und Ausgänge testen

# Weil reihe_2 (Pin26 des ESP32) an Pin 1 der Buttonmatrix angeschlossen ist und spalte_1 (Pin13 des ESP32) an Pin 5 (s. u.),
# werden beim Drücken der Taste S10 (Spalte 1, Reihe 2) die Anschlüsse 5 und 1 der Button-Matrix miteinander leitend verbunden
# dadurch wird der Eingang Pin13 des ESP32 auf Low gezogen.

from machine import Pin
from time import sleep_ms

reihe = [0 for i in range(4)]
spalte = [0 for i in range(4)]

# ESP-Pin -> Button_MTX-Pin:

reihe[3] = Pin(27, Pin.OUT) # -> 0
reihe[2] = Pin(26, Pin.OUT) # -> 1
reihe[1] = Pin(25, Pin.OUT) # -> 2
reihe[0] = Pin(33, Pin.OUT) # -> 3

spalte[0] = Pin(12, Pin.IN, Pin.PULL_UP) # -> 4
spalte[1] = Pin(13, Pin.IN, Pin.PULL_UP) # -> 5
spalte[2] = Pin(15, Pin.IN, Pin.PULL_UP) # -> 6
spalte[3] = Pin(2, Pin.IN, Pin.PULL_UP) # -> 7

        
def auswertung1(r, s): # Bezeichnung gemäß der Platinenbeschriftung
    button = 'S' + str(r*4+s+1)
    print('gedrückt:', button)
    
def auswertung2(r, s): # Reihen- und Spalten-Index
    print('gedrückt: Reihe:', str(r), '; Spalte:', str(s))

while True:
    for i in range(4):
        for k in range(4):
            reihe[k].value(i != k) # nur reihe[i] mit Wert 0 (Low) markieren, die restlichen mit 1 (High) 
        for j in range(4):
            if not spalte[j].value() : # d. h. wenn aktueller Spaltenwert Low ist, dann liegt eine leitende Verbindung zwischen Reihe i und Spalte j vor
                auswertung1(i, j)
                auswertung2(i, j)
                print()
                # warten bis Button losgelassen wird, d. h. spalte[j].value() wieder High (1) ist:
                while not spalte[j].value():
                    sleep_ms(10) # Taster-Prellen abwarten

3. Arbeiten mit dem Modul btn_mtx.py

Dieses Modul stellt die Klasse BTN_MTX zur Verfügung. Damit lässt sich unsere Buttonmatrix leicht und übersichtlich in andere Projekte einfügen. Mit der Anweisung

btn_mtx = BTN_MTX(btn_to_esp_liste)

erzeugen wir zunächst eine Instanz btn_mtx dieser Klasse; dabei gibt die Liste btn_to_esp_list an, wie die Pins der Buttonmatrix den GPIO-Pins des ESP32 zugeordnet werden sollen (Genaueres dazu im folgenden Programm-Code).

Die Klasse stellt drei Methoden und zwei Eigenschaften zur Verfügung:
  • do_btn() wartet auf einen Tastendruck und gibt die Werte für den entsprechenden Spalten- bzw. Reihen-Index als Tupel zurück.
  • auswertung1() und auswertung2() geben die Taster-Informationen des letzten Tasterdrucks wie in Abschnitt 2 dargestellt aus.
  • Die Eigenschaften r und s geben den Reihen- bzw. Spalten-Index des zuletzt betätigten Tasters an.
Das folgende Beispiel-Programm zeigt, wie diese Methoden und Eigenschaften eingesetzt werden können. Insbesondere wird darin auch dargestellt, wie die Liste btn_to_esp_list gebildet wird; sie entspricht auch der letzten Spalte der Tabelle aus dem 1. Abschnitt dieses Beitrags.

Code: Alles auswählen

from btn_mtx import BTN_MTX 

# Test für BTN_MTX-Klasse

# Btn-Pin <-> ESP32-Pin
#    0    <->    27
#    1    <->    26
#    2    <->    25
#    3    <->    33
#    4    <->    12
#    5    <->    13
#    6    <->    15
#    7    <->    2

btn_to_esp_list = [27, 26, 25, 33, 12, 13, 15, 2]

btn_mtx = BTN_MTX(btn_to_esp_list) # Instanziierung
while True:
    # (r, s) = btn_mtx.do_btn() # Tasterbestimmung, liefert als Rückgabewert ein Tupel mit dem Reihen- und Spaltenwert
    # print(r, s)
    print(btn_mtx.r, btn_mtx.s)     
    btn_mtx.do_btn() # Tastenbestimmung
    btn_mtx.auswertung1() # Ausgabe-Möglichkeit 1
    btn_mtx.auswertung2() # Ausgabe-Möglichkeit 2
    print(btn_mtx.r, btn_mtx.s)
    print()
 
Es folgt ein Protokoll der Terminal-Ausgabe für die ersten beiden Tasterdrücke nach dem Programm-Start. Man beachte, dass die Eigenschaften r und s vor der ersten Tasterbetätigung keinen Wert haben, also mit None belegt sind.

Code: Alles auswählen

None None
gedrückt: S8
gedrückt: Reihe: 1 ; Spalte: 3
1 3

1 3
gedrückt: S13
gedrückt: Reihe: 3 ; Spalte: 0
3 0
Das Modul btn_mtx.py finden Sie im Anhang.

.
Dateianhänge
btn_mtx.zip
(907 Bytes) 134-mal heruntergeladen

Antworten