{"id":14658,"date":"2023-10-09T10:46:52","date_gmt":"2023-10-09T08:46:52","guid":{"rendered":"https:\/\/polluxlabs.net\/?p=14658"},"modified":"2023-11-02T18:46:50","modified_gmt":"2023-11-02T16:46:50","slug":"code-schloss-mit-tastatur-und-servo-motor","status":"publish","type":"post","link":"https:\/\/polluxlabs.net\/arduino-projekte\/code-schloss-mit-tastatur-und-servo-motor\/","title":{"rendered":"Code-Schloss mit Tastatur und Servo-Motor"},"content":{"rendered":"\n

In diesem Projekt baust du dir ein Code-Schloss mit einer Folientastatur und einem Servo-Motor. Nur per Eingabe der richtigen Kombination wird sich der Servo-Motor in Bewegung setzen und damit eine m\u00f6gliche Verriegelung l\u00f6sen.<\/p>\n\n\n\n

DIE FOLIENTASTATUR ANSCHLIESSEN<\/h2>\n\n\n\n

F\u00fcr ein Code-Schloss braucht es nat\u00fcrlich ein Ger\u00e4t, \u00fcber das man den Code eingeben kann. Hierf\u00fcr eignet sich die 4\u00d74 Folientastatur perfekt. <\/p>\n\n\n\n

Zun\u00e4chst installierst du die Verbindung zum Arduino. Die Tastatur besitzt 8 Buchsen; stecke hier ebenso viele Kabel hinein und verbinde diese der Reihe nach mit den Digitalpins 9 bis 2 an deinem Arduino:<\/p>\n\n\n\n

\"Anschluss<\/figure>\n\n\n\n
<\/div>\n\n\n\n

DIE PASSENDE BIBLIOTHEK<\/h2>\n\n\n\n

Um dir die Steuerung der Tastatur so einfach wie m\u00f6glich zu machen, gibt es eine Bibliothek. Diesmal nutzt du hierf\u00fcr jedoch nicht den Bibliotheksverwalter, sondern bindest die Bibliothek manuell ein. Lade sie dir zun\u00e4chst hier herunter<\/a>.<\/p>\n\n\n\n

W\u00e4hle nun im Men\u00fc der Arduino IDE den Punkt Sketch -> Bibliothek einbinden -> .ZIP Bibliothek hinzuf\u00fcgen<\/strong><\/p>\n\n\n\n

___STEADY_PAYWALL___<\/p>\n\n\n\n

F\u00fcr einen ersten Test der Tastatur verwendest du nun den Beispiel-Sketch, der in der Bibliothek mitgeliefert wird. \u00d6ffne diesen unter Datei -> Beispiele -> Keypad -> CustomKeypad<\/strong><\/p>\n\n\n\n

Bevor wir einen Blick auf den Code werfen, lade den Sketch zun\u00e4chst auf deinen Arduino. \u00d6ffne nun den Seriellen Monitor und dr\u00fccke eine der Tasten auf der Tastatur. Erscheint das entsprechende Zeichen in der Ausgabe? Wenn ja, perfekt.<\/p>\n\n\n\n

DER BEISPIEL-SKETCH<\/h2>\n\n\n\n

Lass uns einen ganz kurzen Blick auf diesen Sketch werfen. Der meiste Code sind Funktionen der Bibliothek Keypad, aber zwei Dinge sind besonders interessant. Zun\u00e4chst siehst du im Code die Anzahl der Tasten je Reihe und Spalte sowie eine Matrix, die die Werte bzw. Zeichen der Tastatur bestimmt:<\/p>\n\n\n\n

const byte ROWS = 4;\nconst byte COLS = 4;\n\nchar hexaKeys[ROWS][COLS] = {\n\u00a0 {'1','2','3','A'},\n\u00a0 {'4','5','6','B'},\n\u00a0 {'7','8','9','C'},\n\u00a0 {'*','0','#','D'}\n};<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Das sind die Zeichen, die du auch auf der Tastatur selbst findest. Solltest du einmal andere Zeichen verarbeiten wollen, k\u00f6nntest du diese hier eintragen und damit einer Taste auf der Folientastatur zuweisen.<\/p>\n\n\n\n

Der Anschluss der Tastatur am Arduino verbirgt sich in diesen beiden Variablen:<\/p>\n\n\n\n

byte rowPins[ROWS] = {9, 8, 7, 6};\nbyte colPins[COLS] = {5, 4, 3, 2};<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Das sind die Pins, die du auch im Anschlussplan oben findest. Wenn du einmal einen dieser Pins unbedingt f\u00fcr ein anderes Bauteil verwenden musst, kannst du hier der Tastatur einen abweichenden Digitalpin zuweisen.<\/p>\n\n\n\n

Au\u00dferdem wird mit diesen Parametern das Objekt customKeypad erzeugt:<\/p>\n\n\n\n

Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Und weiter geht’s \u2013 als n\u00e4chstes installierst du zwei LEDs sowie den Servo-Motor und sorgst daf\u00fcr, dass dieser sich nur nach der Eingabe des richtigen Codes bewegt.<\/p>\n\n\n\n

DAS SCHLOSS AUFBAUEN UND PROGRAMMIEREN<\/h2>\n\n\n\n

Verbinde als erstes deinen Servo-Motor mit dem Arduino. Du kannst ihn entweder auf deinem Breadboard installieren und von dort aus verbinden \u2013 oder du steckst die Kabel des Servos direkt in die Pins GND, 5V und 11, so wie auf dieser Skizze.<\/p>\n\n\n\n

\"Aufbau<\/figure>\n\n\n\n
<\/div>\n\n\n\n

Die Reihenfolge der Anschl\u00fcsse GND, VCC und Signal k\u00f6nnen sich je nach Fabrikat des Motors unterscheiden.<\/strong> Bitte achte hierauf beim Anschluss.<\/p>\n\n\n\n

Hinzu kommen noch zwei LEDs samt zwei Vorwiderst\u00e4nden mit je 220\u03a9. Schlie\u00dfe diese an die Digitalpins 12 und 13 an. Mit diesen zeigst du sp\u00e4ter an, ob der Code richtig oder falsch eingegeben wurde.<\/p>\n\n\n\n

DER SKETCH F\u00dcR DEIN CODE-SCHLOSS<\/h2>\n\n\n\n

Damit kommen wir schon zum Kern des Projekts. Der Servo soll sich nur bewegen, wenn jemand den richtigen Code per Tastatur eingibt. Dann dreht sich der Zeiger zur Seite und gibt z.B. den Deckel einer Box frei. Wie du das Geh\u00e4use der Box gestaltest, ist nat\u00fcrlich dir \u00fcberlassen.<\/p>\n\n\n\n

Zu Beginn des Sketchs bindest du wie gewohnt zun\u00e4chst die ben\u00f6tigten Bibliotheken ein:<\/p>\n\n\n\n

#include <Keypad.h>\n#include <Servo.h><\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Anschlie\u00dfend folgen die Informationen f\u00fcr das Keypad, die du schon kennst:<\/p>\n\n\n\n

const byte ROWS = 4;\nconst byte COLS = 4;\n\nchar hexaKeys[ROWS][COLS] = {\n\u00a0 {'1', '2', '3', 'A'},\n\u00a0 {'4', '5', '6', 'B'},\n\u00a0 {'7', '8', '9', 'C'},\n\u00a0 {'*', '0', '#', 'D'}\n};\n\nbyte rowPins[ROWS] = {9, 8, 7, 6};\nbyte colPins[COLS] = {5, 4, 3, 2};\nKeypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Nun ben\u00f6tigst du drei Variablen bzw. Konstanten, die die gedr\u00fcckte Taste key<\/strong>, den gesamten eigegebenen Code inputCode<\/strong> sowie das von dir hinterlegte Passwort code<\/strong> beinhalten. Gegen letzteres wirst du sp\u00e4ter die Eingabe pr\u00fcfen. Wenn du sp\u00e4ter deinen eigenen Code hinterlegen m\u00f6chtest, kannst du das hier tun.<\/p>\n\n\n\n

char key;\nString inputCode;\nconst String code = \"1103A\"; \/\/Der von dir festgelegte Code<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Zuletzt fehlen noch ein Objekt f\u00fcr den Servo-Motor und die beiden Variablen f\u00fcr die Anschl\u00fcsse der LEDs.<\/p>\n\n\n\n

Servo servo;\nint redLED = 12;\nint greenLED = 13;<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

DIE SETUP-FUNKTION<\/h2>\n\n\n\n

Hier gibt es sicherlich nichts Neues f\u00fcr dich. Du startest den Seriellen Monitor, legst die pinMode<\/strong> f\u00fcr die LEDs fest und den Anschluss-Pin des Servo-Motors.<\/p>\n\n\n\n

void setup() {\n \n  Serial.begin(9600);\n  pinMode(redLED, OUTPUT);\n  pinMode(greenLED, OUTPUT);\n  servo.attach(11);\n}<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

DER LOOP<\/h2>\n\n\n\n

Als erstes ben\u00f6tigst du eine Variable, in der du den Wert der Taste speicherst, die gerade gedr\u00fcckt wurde. Das ist hier die Variable key<\/strong> mit dem Typ char<\/strong> f\u00fcr Character. Den Wert speicherst du mithilfe der Funktion customKeypad.getKey()<\/strong>.<\/p>\n\n\n\n

char key = customKeypad.getKey();<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Nun folgt eine Reihe von bedingten Anweisungen. Das Code-Schloss verwendet zwei Tasten, um das Schloss zu verriegeln (mit der Taste *) oder die Eingabe zu pr\u00fcfen (mit #). Diese Tasten darfst du also nicht in deinem hinterlegten Code verwenden. Die erste If-Abfrage \u201chorcht\u201d auf die Taste * und verriegelt das Schloss, indem sie den Servo auf einen Winkel von 90\u00b0 stellt. Nat\u00fcrlich kannst du diesen Winkel nach deinen Bed\u00fcrfnissen \u00e4ndern.<\/p>\n\n\n\n

Zus\u00e4tzlich schaltet sie die rote LED an (und die gr\u00fcne aus) und leert die Variable inputCode<\/strong>, damit hier f\u00fcr die n\u00e4chste Eingabe keine \u201calten\u201d Zeichen mehr zu finden sind.<\/p>\n\n\n\n

if (key == '*') {\n  inputCode = \"\";\n  Serial.println(\"Schloss verriegelt.\");\n  delay(1000);\n  servo.write(90);\n  digitalWrite(greenLED, LOW);\n  digitalWrite(redLED, HIGH);<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Die zweite Abfrage folgt gleich darauf mit einem else if<\/strong> und wird angesteuert, wenn die Taste # gedr\u00fcckt wurde. In diesem Fall folgen wiederum zwei weitere Abfragen \u2013 eine, die ausgef\u00fchrt wird, wenn der Code korrekt eingegeben wurde und die andere, falls dem nicht so ist.<\/p>\n\n\n\n

} else if (key == '#') {\n  if (inputCode == code) {\n    Serial.println(\"Der Code ist korrekt. \u00d6ffne das Schloss...\");\n    digitalWrite(greenLED, HIGH);\n    digitalWrite(redLED, LOW);\n    servo.write(0);\n  } else {\n    Serial.println(\"Der Code ist falsch!\");\n    digitalWrite(greenLED, LOW);\n    digitalWrite(redLED, HIGH);\n  }<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Falls der Code stimmt, also inputCode == code<\/strong> zutrifft, leuchtet die gr\u00fcne LED und der Servo steuert auf 0\u00b0. Bei einer inkorrekten Eingabe, leuchtet entsprechend die rote LED \u2013 und nichts bewegt sich. In beiden F\u00e4llen wird die Variable f\u00fcr den eingegebenen Code wieder geleert:<\/p>\n\n\n\n

inputCode = \"\";<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Jetzt hast du alles, um das Schloss auf Tastendruck zu verriegeln. Au\u00dferdem um zu pr\u00fcfen, ob der Code richtig oder falsch ist und entsprechend zu reagieren. Aber wie wird die Variable inputCode<\/strong> eigentlich bef\u00fcllt?<\/p>\n\n\n\n

Das geschieht in einem letzten else<\/strong> \u2013 die Anweisung, die bei allen Tasten au\u00dfer * und # ausgef\u00fchrt wird. Hier f\u00fcgst du der Variablen inputCode<\/strong> einfach das zuletzt gedr\u00fcckte Zeichen hinzu:<\/p>\n\n\n\n

} else {\n  inputCode += key;\n  Serial.println(inputCode);\n}<\/code><\/pre>\n\n\n\n
<\/div>\n\n\n\n

Hier nun der gesamte Sketch \u2013 viel Spa\u00df mit deinem neuen Code-Schloss! :=<\/p>\n\n\n\n

#include <Keypad.h>\n#include <Servo.h>\n\nconst byte ROWS = 4;\nconst byte COLS = 4;\n\nchar hexaKeys[ROWS][COLS] = {\n  {'1', '2', '3', 'A'},\n  {'4', '5', '6', 'B'},\n  {'7', '8', '9', 'C'},\n  {'*', '0', '#', 'D'}\n};\n\nbyte rowPins[ROWS] = {9, 8, 7, 6};\nbyte colPins[COLS] = {5, 4, 3, 2};\nKeypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);\n\nchar key;\nString inputCode;\nconst String code = \"1103A\"; \/\/Der von dir festgelegte Code\n\nServo servo;\nint redLED = 12;\nint greenLED = 13;\n\n\nvoid setup() {\n\n  Serial.begin(9600);\n  pinMode(redLED, OUTPUT);\n  pinMode(greenLED, OUTPUT);\n  servo.attach(11);\n}\n\nvoid loop() {\n\n  char key = customKeypad.getKey();\n\n  if (key) {\n\n    if (key == '*') {\n      inputCode = \"\";\n      Serial.println(\"Schloss verriegelt.\");\n      delay(1000);\n      servo.write(90);\n      digitalWrite(greenLED, LOW);\n      digitalWrite(redLED, HIGH);\n\n    } else if (key == '#') {\n      if (inputCode == code) {\n        Serial.println(\"Der Code ist korrekt. \u00d6ffne das Schloss...\");\n        digitalWrite(greenLED, HIGH);\n        digitalWrite(redLED, LOW);\n        servo.write(0);\n\n      } else {\n        Serial.println(\"Der Code ist falsch!\");\n        digitalWrite(greenLED, LOW);\n        digitalWrite(redLED, HIGH);\n      }\n\n      inputCode = \"\";\n\n    } else {\n      inputCode += key;\n      Serial.println(inputCode);\n    }\n  }\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"

In diesem Projekt baust du dir ein Code-Schloss mit einer Folientastatur und einem Servo-Motor. Nur per Eingabe der richtigen Kombination wird sich der Servo-Motor in Bewegung setzen und damit eine m\u00f6gliche Verriegelung l\u00f6sen. DIE FOLIENTASTATUR ANSCHLIESSEN F\u00fcr ein Code-Schloss braucht es nat\u00fcrlich ein Ger\u00e4t, \u00fcber das man den Code eingeben kann. Hierf\u00fcr eignet sich die …<\/p>\n

Code-Schloss mit Tastatur und Servo-Motor<\/span> Weiterlesen »<\/a><\/p>\n","protected":false},"author":1,"featured_media":14668,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"","site-content-layout":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[2],"tags":[223],"acf":[],"wp-worthy-pixel":{"ignored":false,"public":"f5ae307735274b60a9cf4c2b14ce6517","server":"vg04.met.vgwort.de","url":"https:\/\/vg04.met.vgwort.de\/na\/f5ae307735274b60a9cf4c2b14ce6517"},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/posts\/14658"}],"collection":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/comments?post=14658"}],"version-history":[{"count":0,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/posts\/14658\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/media\/14668"}],"wp:attachment":[{"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/media?parent=14658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/categories?post=14658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/polluxlabs.net\/wp-json\/wp\/v2\/tags?post=14658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}