UIFlow-Eingabe für 16-Tasten mit Extend I/O

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche

Von Peter (peter@attraktor.org)

Bilderprefix: {{{1}}}

Bilder-Prefix: M5-Soft-16T0-...

M5-Soft-16T0-001.png

Dieses Programmungetüm ermöglicht es mit Blockly eine 4x4-Matrix-Tastatur abzufragen. Für die Verbindung zwischen der Tastatur und dem M5StickC dient die Unit Extend I/O. Die Abbildung oben entspricht nicht dem aktuellen Stand!

Die Hardware

M5-Soft-16T0-002.png M5-Soft-16T0-004.png M5-Soft-16T0-005.png

Der Finger bei der Tastatur zeigt auf Pin 1 und der Finger an der Unit auf PIN0. Der Pin 1 der Tastatur wird mit PIN0, Pin 2 mit PIN1 u.s.w. der Unit verbunden.

So sieht mein Versuchsaufbau aus:

M5-Soft-16T0-007.png

Die Zahlen neben der Tastatur geben die PIN Nummern der Unit an mit denen die Reihen und Spalten verbunden sind.

Das Prinzip des Programms

Das Prinzip einer Matrixtastatur und deren Abfrage ist sehr anschaulich in der animierten Grafik von Kai Burghardt / CC BY-SA dargestellt:

FunctionalCircuitDiagramOfKeyboardNumPadScanningProcedure-small

Es wird ein Signal an eine Reihe gelegt und dann nachgesehen an welcher Spalte es wieder herauskommt. Wenn kein Signal herauskommt ist keine Taste gedrückt. Wenn ein Signal herauskommt kann es eindeutig durch die Reihen- und die Spaltennummer einer Taste zugeordnet werden.

Bei einer 4x4-Matrix-Tastatur sind 4 Reihen und 4 Spalten vorhanden. Ich habe die 4 Reihen auf PIN0 - PIN3 und die 4 Spalten auf PIN4 - PIN7 gelegt.

M5-UIF-16T0-010.png

Das Bild aus dem Datenblatt des PCA9554PW zeigt die Beschaltung der PIN's. Q1 legt den Ausgang auf HIGH, Q2 auf LOW. Als Eingang sind Q1 und Q2 gesperrt, so dass der PIN über den 100kOhm Widerstand auf HIGH liegt. Einen Tastendruck können wir also nur mit einem LOW-Signal erkennen. Um eine Reihe zu scannen muss diese auf LOW gelegt werden. Dann wird die Spalte mit der gedrückten Taste auch LOW.

Nun werde ich zeigen, wie ich dieses Prinzip mit Blockly umgesetzt habe. Zuerst einmal möchte sagen, dass Blockly keine Blöcke zur Bitmanipulation bereitstellt, deshalb wirkt das Programm an einigen Stellen umständlich. Ich will auch nicht behaupten, dass dieses Programm in irgend einer Weise vorbildlich wäre. Es ist nur mein Versuch eine 4x4-Matrix-Tastatur zur Werteeingabe mit dem M5StickC zu benutzen.

Das Hauptprogramm und die Codeumwandlung

M5-Soft-16T0-010.png

Das Hauptprogramm ist sehr einfach.

Setup

Im Setup wird die Disolay Ausrichtung auf horizontal - Taste rechts eingestellt.

Anschließend wird eine MAP (in Python: Dictionary) erstellt. Diese enthält die Zuweisung der Tasten zu den Codes die vom Unit gelesen werden.

Dann werden noch die Variablen maxWert und wert auf ihre Startwerte gesetzt.

Loop

Die Funktion hole_wert tut das, was man bei ihrem Namen vermutet. Sie holt einen Wert von der Matrix-Tastatur. Dieser Wert wird an die Variable temp übergeben. Diese wird an die Funktion zeige_display weitergereicht. Diese Funktion zeigt den Wert auf dem Disolay an.

Dann wartet das Programm darauf, das Taste A gedrückt wird. Sonst würde man die Anzeige gar nicht sehen können, weil dann sofort ein neuer Wert geholt wird.

Init_Port

Initialisiert den Port. D.h. es werden die einzelnen PIN's als Ein- oder Ausgang eingestellt und die Ausgänge auf einen definierten Wert gesetzt. Was konkret passiert ist aus dem folgenden Bild ersichtlich und bedarf keiner Erläuterung:

M5-Soft-16T0-020.png

Bei der Gestaltung dieser Funktion habe ich einige Probleme gehabt. Ursprünglich hatte folgende Version geschrieben:

M5-Soft-16T0-021.png

Da beim Schreiben auf einen PIN dieser automatisch zum Ausgang wird werden alle PIN's zu Ausgängen und auf HIGH gesetzt. Anschliessend werden die 4 Eingänge umgeschaltet. Da der erste Block aber nicht richtig programmiert wurde schreibt er immer 0x68 auf den Port, egal was man eingibt. Deshalb musste ich die aufwändigere Variante wählen.

Hole_Taste

Diese Funktion wartet auf einen Tastendruck und liefert dann einen der Taste entsprechenden Code zurück:

M5-Soft-16T0-030.png

In einer Endlosschleife werden die 4 Reihen nacheinander auf LOW gesetzt und dann der gesamte PORT ausgelesen und sein Wert in der Variablen code gespeichert. Wenn code einen Wert < 239 enthält, dann wurde eine Taste gedrückt, die Endlosschleife verlassen und der Wert in code zurückgegeben. Wenn keine Taste gedrückt wurde ist der Wert in code 239 oder größer. Dann wird der PIN wieder HIGH gesetzt und es passiert das Selbe mit der nächten Reihe. Diese Funktion kehrt erst dann zurück, wenn eine Taste der Matrix-Tastatur gedrückt wurde.

Hier noch einmal die Sequenz die für jede Reihe durchgeführt wird.

M5-Soft-16T0-031.png

Hole_Wert

Diese Funktion ist sehr umfangreich und erledigt mehrere Aufgaben. Es wird in einer Endlosschleife ein Code von der Matrix-Tastatur geholt und dieser ausgewertet. Wenn eine Zahl eingegeben wurde wird diese in der Variablen anzeigewert gesammelt. Wurde eine andere Taste gedrückt, kann etwas beliebiges ausgeführt werden. Beim * (.) wird der Nachkommastellenzähler aktiviert, beim # (OK) wird die Eingabe beendet und bei Taste A wird der Wert auf 0 gesetzt und die Eingabe neu begonnen.

M5-Soft-16T0-040.png

Nun wollen wir die einzelnen Abschnitte näher betrachten.

M5-Soft-16T0-041.png

Hier werden nur die drei Variablen wert, bruch und anzeigewert initialisiert. In wert wird die eingegebene Zahlenfolge als Integer gespeichert, in bruch die Anzahl der Nachkommastellen + 1 und in anzeigewert die anzuzeigende bzw. zurüchzugebende Zahl.

M5-Soft-16T0-042.png

Dann wird mit hole_taste der Tastencode geholt und geprüft, ob eine der Nichtzahlen-Tasten gedrückt wurde.

Wenn die *-Taste (231) gedrückt wurde, wird das Dezimalkomma bzw. der Punkt gesetzt und die Nachkommabearbeitung eingeschaltet. Das geschieht indem die Variable bruch auf 1 gesetzt wird. Sie enthält die Anzahl der Nachkommastellen +1.

Wurde die #-Taste (237) gedrückt, wird die Eingabe beendet und der aktuelle Wert zurüchgegeben. Dazu wird nur die Abfrageschleife verlassen.

Das Drücken der A-Taste (126) löscht alle aktuellen Eingaben und beginnt die Eingabe wieder bei 0.

M5-Soft-16T0-043.png

Die anderen Nichtzahlen-Tasten wurden nicht verwendet. Hier kann man geeignete Funktionen einfügen. Natürlich lassen sich auch die vorbelegten Tasten mit anderen Funktionen versehen.

M5-Soft-16T0-044.png

Wenn eine Zahlentaste gedrückt wurde, wird zuerst geprüft ob überhaupt noch Platz für eine weitere Stelle vorhanden ist. Wenn nicht, wird alles auf 0 gesetzt und die Eingabe muss neu begonnen werden.

Wenn noch Platz für die neue Stelle vorhanden ist, wird die vorhandene Zahl um eine Stelle nach links geschoben (x10) und der neue Wert addiert. Dieser muss aber erst aus der codetab geholt werden, da bisher nur der Tastencode bekannt war.

Schließlich wird noch geprüft ob es sich um eine Nachkommastelle handelt. Wenn ja, dann wird bruch um 1 erhöht.

M5-Soft-16T0-045.png

Nun muss aus Zahlenfolge und der Anzahl der Nachkommastellen der korrekte Wert erzeugt werden. Dazu wird die Zahlenfolge wert durch einen Faktor geteilt, der der Anzahl Nachkommastellen entspricht (10^(bruch-1)). Der Additionswert 0,000005 dient der Rundung der angezeigten Zahl. Bekanntlich entstehen Ungenauigkeiten, wenn man gebrochene Binärzahlen in Dezimalzahlen umwandelt. Dieser Effekt soll dadurch reduziert werden. Eigentlich müsste dazu bei 4 Nachkommastellen 0,00005 der richtige Wert sein. Dieser brachte aber häufiger 1 in die letzte Stelle die 0 sein sollte. Ganze Zahlen werden ohne Nachkommastzellen angezeigt. Erst bei Eingabe des Kommas (*) werden auch Nachkommastellen angezeigt. Die Anzahl der Nachkommastellen muss leider fest vorgegeben werden. Ich hatte ursprünglich versucht die Anzahl der Nachkommastellen auf die eingegebene Anzahl zu begrenzen. Das funktionierte aber nicht, weil der Block keine Variablen bei der Anzahl der Nachkommastellen aktzeptiert.

M5-Soft-16T0-046.png

Wenn der eingegebene Wert entsprechend hergerichtet wurde, wird er angezeigt. Schliesslich will man ja sehen welche Zahl man eingegeben hat.

Dann muss noch verhindert werden, dass die noch gedrückte Taste beim nächsten Durchlauf erneut erkannt und als weitere Zahl hinzugefügt wird. Dazu wird zuerst 100ms gewartet und dann darauf gewartet, dass die Taste losgelassen wird. Diese Kombination hat sich als wirksam erwiesen.

M5-Soft-16T0-047.png

Wenn mit der #-Taste die Eingabeschleife verlassen wurde wird auch die Funktion verlassen und der letzte aktuelle Wert zurückgegeben.

Damit hat diese Funktion ihre Aufgabe erfüllt und dem übrigen Programm steht dieser Wert zur weiteren Verarbeitung zur Verfügung.

Zeige_Display

In dieser Funktion besteht die Möglichkeit eine grafisch ansprechende Ausgabe auf dem Display zu erzeugen. Ich habe hier den Anzeigewert als Parameter an die Funktion übergeben. Das geht auch für mehrere Werte.

Hier habe ich nur eine minimale Ausgabe realisiert, so wie ich sie zum entwickeln des Programms benötigte. In Artikel UIFlow-Eingabe_für_5-Tasten_mit_Makey findet Ihr Anregungen zur Gestaltung der Ausgabe.

M5-Soft-16T0-050.png

Verbesserungen

Hole Wert

Zeige Display

Download

Zum Download des Programms bitte mit der rechten Mousetaste auf den Link klicken und dann auf "Ziel speichern unter ..." mit der linken Mousetaste klicken. (Ich habe leider keine bessere Möglichkeit gefunden.)

Media:16T0.m5f

Diese Seite wurde zuletzt am 24. März 2020 um 22:11 Uhr geändert. Diese Seite wurde bisher 2.535 mal abgerufen.