Hier werden zwei verschiedene Bauformen einer Folientastatur mit dem Arduino ausprobiert.
Der Anschluss 1 (COM) kann direkt an GND des Arduino angeschlossen werden, die anderen drei Pins an jeweils einen digitalen Eingang des Arduino. Wichtig ist nur, dass der interne Pullup-Widerstand des Arduino aktiviert wird.
Der folgende Sketch gibt die Zustände der Tasten aus, d.h. "1" im Normalzustand und "0", wenn die entsprechende Taste gedrückt wurde.
#define PIN_ARROW_LEFT 7
#define PIN_ARROW_RIGHT 6
#define PIN_FUNCTION 5
#define NUM_BUTTONS 3
const int buttonPin[] = {PIN_FUNCTION, PIN_ARROW_RIGHT, PIN_ARROW_LEFT};
void setup()
{
Serial.begin(9600);
for(byte i=0; i<NUM_BUTTONS; i++) {
pinMode(buttonPin[i], INPUT_PULLUP);
}
}
void loop()
{
for(byte i=0; i<NUM_BUTTONS; i++) {
Serial.print(digitalRead(buttonPin[i]));
Serial.print(" ");
}
Serial.print("\n");
delay(500);
}
Um für das Auslesen eines Tastendrucks der 16 Tastenschalter nicht auch 16 Pins am Arduino zu verwenden werden
hier durch Multiplexing nur 8 Pins belegt. Die 8 Anschlüsse aus der Folientastatur kommen an 8 Digitalpins
des Arduino. 4 Pins dienen dem Arduino dabei als Ausgang und sind mit den 4 Zeilen des Keypads verbunden.
Die anderen 4 Pins werden als Eingänge verwendet und sind mit den Spalten verbunden. An den jeweiligen
Kreuzungen liegt ein Membranschalter, der im gedrückten Zustand die Verbindung zwischen Zeile und Spalte herstellt.
Zur Abfrage eines Tastendrucks wird nicht das gesamte Tastenfeld gleichzeitig überwacht, sondern es werden
die einzelnen Zeilen in jeweils kurzen Abständen mit Strom versorgt, d.h. das zugehörige Ausgangspin am
Arduino geht auf HIGH. Wird in dieser Zeit eine Taste in dieser Zeile gedrückt, so schließt sich der
Membranschalter und am zugehörigen Eingangspin, das an dieser Spalte angeschlossen ist, wird am Arduino
ein HIGH messbar. Da man jetzt weiß, welche Zeile gerade mit Strom versorgt wird und welche Spalte sich
als HIGH zurückmeldet, muss der Schalter am Schnittpunkt von Zeile und Spalte gerade gedrückt sein.
Das alles passiert in Zyklen von Millisekunden, sodass auch garantiert jeder Tastendruck erkannt wird.
Dafür kann man z.B. die Library Keypad verwenden.
Der folgende Sketch liest die einzelnen Tasten des 4x4-Matrix-Keypads mit Hilfe der Keypad-Library aus und gibt sie auf der seriellen Konsole aus. Die Anschlüsse sind im obigen Bild zu sehen.
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup()
{
Serial.begin(9600);
}
void loop()
{
char key = keypad.getKey();
if (key){
Serial.print(String(key) + " ");
}
}
zurück