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.

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.