In diesem Arduino Projekt seht ihr, wie man mit einem 4×4 Keypad zur Eingabe von Pincodes und einem Servo ein einfaches Schloss bauen kann, das sich nur nach Eingabe des richtigen Codes öffnet.
In vielen Arduino Starter Kits sind mittlerweile 3×4 oder 4×4 Keypads enthalten, mit denen sich sehr einfach Benutzereingaben erfassen und verarbeiten lassen. Mein 4×4 Keypad ist aus einem Ultimate Starter Kit von Elegoo. Dieses Set enthält auch alle anderen für dieses Projekt benötigten Teile.
Wie funktionieren diese Keypads nun? Für das Auslesen eines Tastendrucks auf diesen 16 Tastenschaltern soll man ja wenn möglich nicht gleich 16 Pins am Arduino benötigen. So viele hat man auf vielen Boards ja auch gar nicht zur Verfügung. Bei einem 4×4 Membran-Keypad werden durch Multiplexing nur 8 Pins benötigt, es gibt auch Lösungen mit noch weniger. Die 8 Anschlüsse aus dem Keypad kommen an 8 Digitalpins des Arduino. 4 Pins dienen dem Arduino dabei als Ausgang und sind zum Beispiel mit den 4 Zeilen des Keypads verbunden. Die anderen 4 Pins werden als Eingänge verwendet und sind mit den Spalten verbunden. Jeweils an diesen 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 schliesst 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.
Um die technischen Feinheiten müssen wir uns glücklicherweise nicht kümmern, wie beim Arduino zu erwarten gibt es dafür eine fertige Library. Über den Library Manager der Arduino Entwicklungsumgebung könnt ihr euch die Keypad-Library installieren. In Ordner Examples findet ihr dann das Code-Beispiel HelloKeypad, das die Initialisierung des Keypad-Objekts zeigt.
Hier das Tutorial-Video für dieses Projekt.
Und hier der im Video verwendeten Source-Code für das Servoschloss:
#include <Keypad.h> #include <Servo.h> // Pinlänge und Pincode festlegen const byte PINLENGTH = 4; char pinCode[PINLENGTH+1] = {'0','8','1','5'}; // Zwischenspeicher für Eingaben char keyBuffer[PINLENGTH+1] = {'-','-','-','-'}; // Kompakter kann man das auch so schreiben: // char pin[] = "0815"; // char keyBuffer[] = "----"; // Definition für das Keypad von Elegoo const byte ROWS = 4; // vier Zeilen const byte COLS = 4; // vier Spalten // Symbole auf den Tasten 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}; //connect to the row pinouts of the keypad byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad // Einstellung für Servo und LEDs const int greenPin = 12; const int redPin = 13; const int servoPin = 11; const int angleClosed = 30; const int angleOpen = 120; const int openDelay = 3000; // Servo-Objekt erzeugen Servo myservo; // Instanz von Keypad erzeugen, Keymap und Pins übergeben Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); void setup(){ Serial.begin(9600); // LED Pins setzen pinMode(greenPin, OUTPUT); pinMode(redPin, OUTPUT); digitalWrite(greenPin, LOW); digitalWrite(redPin, LOW); // Servo auf Ausgangsposition myservo.attach(servoPin); myservo.write(angleClosed); } void loop(){ // Gedrückte Taste abfragen char customKey = customKeypad.getKey(); if (customKey) { // Check, ob ASCII Wert des Char einer Ziffer zwischen 0 und 9 entspricht if ((int(customKey) >= 48) && (int(customKey) <= 57)){ addToKeyBuffer(customKey); } // oder Code überprüfen, falls Raute gedrückt wurde else if (customKey == '#') { checkKey(); } } } void addToKeyBuffer(char inkey) { Serial.print(inkey); Serial.print(" > "); // Von links nach rechts Zeichen um eins weiterkopieren = ältestes Zeichen vergessen for (int i=1; i<PINLENGTH; i++) { keyBuffer[i-1] = keyBuffer[i]; } // in ganz rechter Stelle die letzte Ziffer speichern keyBuffer[PINLENGTH-1] = inkey; Serial.println(keyBuffer); } void checkKey() { // Eingabe mit festgelegtem Pincode vergleichen if (strcmp(keyBuffer, pinCode) == 0) { Serial.println("CORRECT"); // Aktion für richtigen Pin ausführen pinCorrect(); } else { Serial.println("WRONG!"); // Aktion für falschen Pin ausführen pinWrong(); } // Nach Überprüfung Eingabe leeren for (int i=0; i < PINLENGTH; i++) { keyBuffer[i] = '-'; } } // Aktion für korrekten Pincode void pinCorrect() { myservo.write(angleOpen); digitalWrite(greenPin, HIGH); delay(openDelay); myservo.write(angleClosed); digitalWrite(greenPin, LOW); } // Aktion für falschen Pincode void pinWrong() { for (int i=0; i<3; i++) { digitalWrite(redPin, HIGH); delay(50); digitalWrite(redPin, LOW); delay(20); } } |
Je nach Keypad können die Arrays hexaKeys, colPins und rowPins unter Umständen andere Werte benötigen. Diese findet man aber üblicherweise im Beispielcode des Herstellers.
Diese einfache Eingabe von Werten über das Tastenfeld kann als Grundlage für viele weitere Projekte dienen, z.B. für Zahlenratespiele oder zur Erfassung von Projektkonfigurationen (Motorgeschwindigkeit steuern etc.).
Alle im Projekt verwendeten Bauteile (und viele mehr) findet ihr im Ultimate Starter Kit von Elegoo, aber natürlich sind die Keypads auch einzeln erhältlich.