Home.

Blog

Kmoser's Tech-Blog

Donnerstag
19
Januar 2017

Login Pad mit Arduino Pro Micro

Das Login Pad ist aus einer Not heraus entstanden. Da ich beruflich viel mit zugriffsgeschützten Webseiten zu tun habe ich mich das ständige neu Anmelden genervt hat, hatte ich die nicht sicherheitskritischen Anmeldedaten auf die G-Tasten meiner Logitech Tastatur gelegt um mich mit einem Knopfdruck an einer Website anmelden zu können. Auch Snippets die man beim Programmieren häufiger braucht habe ich auf diesen Tasten abgelegt. Das spart beim Entwickeln einiges an Zeit.

Leider ist die Unstertützung der Logitech G-Tastaturen unter Linux nicht gerade die Beste und mit Ubuntu 16.04 lief dann der Daemon für die Tastatur nicht mehr. Der Schritt zurück zu KeePass und manueller Eingabe war für mich kein Zustand der auf Dauer bleiben konnte.

Habe mir anfangs mit xbindkey und xmacroplay beholfen, aber da ich keine Sets mehr umschalten konnte war ich nun auf die physisch vorhandenen 12 bzw. 18 Tasten beschränkt.

Ich erinnerte mich, dass ich irgendwann einmal einen Arduino Leonardo bestellt hatte, da dieser sich als USB-HID Device wie z.B. eine Maus oder Tastatur verwenden lassen könnte. Mangels Projektidee fristete er sein Dasein bisher allerdings in einer Schublade. Warum also nicht einfach ein paar Buttons dran hängen und deren Ausgabe dann frei programmieren. Erste Experimente mit einem einzelnen Button waren vielversprechend.

Bei AliExpress habe ich noch ein Keypad gefunden welches über 10 numerische Tasten für die Login-Informationen, 4 Tasten mit Buchstaben mit denen ich die Sets umschalten kann sowie noch zwei Sondertasten die man mit speziellen Funktionen belegen könnte. Damit wären 4 Sets  á 10 Tasten, also 40 Tasten belegbar. Das sollte für den Anfang reichen ;-)

Erste Versuche waren erfolgreich und die Software war auch nicht sonderlich kompliziert. Nicht zuletzt deshalb weil es ja für fast alles schon fertige Libraries gibt.

Eine Sache die sich als echt praktisch herausgestellt hat ist die Tatsache, dass der Arduino für das Betriebssystem eine ganz normale Tastatur ist. Damit funktioniert die Ausgabe der Tastendrücke auch wenn man sich gerade innerhalb einer VirtualBox befindet. Das ging mit meinen G-Tasten der Logitech-Tastatur nicht.

Der Leonardo den ich zum Testen verwendet habe, sollte später durch den Pro Micro ersetzt werden, da dieser auch den ATmega32u8 verwendet und klein genug ist auf die Rückseite des Keypads zu passen.

Die Projektidee war geboren...

Materialliste

Typ Menge Notizen Link Einzelpreis Gesamtpreis
4x4 Keypad 1 AliExpress 2,40 € 2,40 €
Arduino Pro Micro 1 ATmega32u4 5V/16MHz AliExpress 4,38 € 4,38 €
LEDs 4 AliExpress 4,76 € 0,20 €
Vorwiderstände 4 z.B. 470 Ohm je nach Intensität AliExpress 0,41 € 0,02 €
Pin Header female 90° 1 8 Pins AliExpress 4,38 $ 0,10 €
Pin Header male 90° 1 8, 3, 4 Pins AliExpress 1,54 € 0,06 €
Micro B USB Kabel 90° links 1 z.B. OTG Kabel EBay 3,14 € 3,14 €
Micro B Breakout Board 1 AliExpress 5,70 € 0,57 €
Blechschrauben 2 M 2,2 X 6,5 eBay 2,50 &euro 0,10 €
Schrauben für Kunststoffe 2 Ø3mm x 8mm eBay 3,99 € 0,16 €
Schrauben für Kunststoffe 2 Ø3mm x 10mm eBay 3,99 € 0,16 €

Die Kosten belaufen sich also etwa auf 11,29 €. Dazu kommt noch das Filament welches für den Druck des Gehäuses benötigt wird.

Software

Die Software für das Projekt habe ich auf GitHub gestellt.

Zum kompilieren des Sketches muss zuerst die Datei ext_def.h angelegt werden. Dazu am besten die Datei ext_def-example.h im Sketch Verzeichnis kopieren und als ext_def.h einfügen.

Der PIN mit dem einer Login Pad entsperrt werden kann wird mit folgender Zeile definiert:

#define PIN "123456"

Die Zeichensequenzen für die Tastendrücke müssen als Hexcode in die char arrays values0_0 bis values3_9 eingetragen werden. Das Set A verwendet values0_*, das Set B values1_*, usw. Die Sache mit den Hexcodes habe ich gemacht um auch Sonder- und Steuerzeichen senden zu können. Ein Tab ist z.B. 0xB3, ein Enter 0xB0. Die Zuweisung:

const PROGMEM char values0_1[] = {0x54,0x65,0x73,0x74,0x00};

Würde bei einem Tastendruck der Taste 1 bei aktiviertem Set A die Zeichenkette "Test" gefolgt von einem Enter ausgeben.

Etwas problematisch ist dass die Arduino Tastatur einen englischen Zeichensatz verwendet und ich noch keine Möglichkeit gefunden habe das zu ändern. Daher ist im Sketch eine Art "Konvertierung" von Zeichen eingebaut um den Hex Code von Tasten mit einem deutschen Tastaturlayout in die englische Entsprechung umzusetzen so dass im Endeffekt die richtige Taste gedrückt wird. Dieser Part hat im Sketch noch keine große Beachtung gefunden da ich mit dem Status Quo gut auskomme. Solltet ihr Zeichen benötigen die dem Pad einfach nicht zu entlocken sind schreibt einfach ein Kommentar auf der Seite oder nutzt das Kontaktformular.

Funktionsweise

Wenn das Pad fertig aufgebaut und mit dem Sketch gefüttert ist, funktioniert das Login Pad so:

Alle 4 LEDs leuchten. Das bedeutet das Pad ist neu gestartet und wartet auf die Eingabe des Pin Codes. Sobald man eine Taste drückt und sich im String-Puffer für die Passwort Eingabe Zeichen befinden leuchten die LEDs 2 und 4.

Hat man sich vertippt kann man mit der * Taste die Eingabe löschen und von vorne beginnen. Ist die Eingabe gelöscht leuchten die LEDs 3 und 4.

Hat man seinen Pin eingegeben bestätigt man diesen mit der Raute (#) Taste. Ist der Pin falsch, dann leuchten alle 4 LED 3x kurz nacheinander auf und man kommt wieder zur PIN Eingabe. Ist der Pin richtig leuchten alle vier LEDs gleichzeitig auf und das Set 1 wird aktiviert. Das Login Pad ist bereit.

Drückt man nun eine der Numerntasten werden die hinterlegten Tastensequenzen ausgegeben. Muss man seinen Arbeitsplatz verlassen kann man die * Taste drücken um das Pad wieder zu sperren. Dann ist eine erneute Eingabe des Pins nötig um das Pad wieder zu aktivieren.

Aufbau

Die Verdrahtung des Pad ist ziemlich simpel und im folgenden Bild zu sehen:

Für den Zusammenbau kommen in 8 Pins der 10 Pins des 4x4 Keypad eine gewinkelte, männliche Stiftleiste und zwar so dass rechts und links jeweils ein Pin leer bleibt. Diese werden nicht benötigt.

Achtung: Es gibt unterschiedliche Pinleisten!! Der Unterschied besteht in der Positionierung des Abstandshalters aus Kunststoff. Bei manchen ist er auf der kurzen, bei manchen auf der lagen Seite. Je nachdem welche man hat muss man am Arduino die Leisten ggf. anders einlöten.

In den Arduino wird in Pin 2 bis 9 die weibliche 8-Pin Buchsenleiste eingelötet und zwar so dass man den Arduino später bündig hinten auf das Keypad aufschieben kann. Unbedingt vor dem Löten testen ob die Leiste oben oder unten am Arduino eingelötet werden muss.

An die Pins 10,14,15,16 sowie an GND kommt je eine Stiftleiste. Dabei wieder vor dem Einlöten testen wie es am besten passt. VCC und RST braucht man eigentlich nicht, hatte sie aber mal herausgeführt damit die Pin-Leiste etwas stablier sitzt und, falls ich mal den Sketch mit den falschen Board Einstellungen flashen sollte, den Bootloader via ISP wieder neu schreiben kann. War eine weise Voraussicht, ist mir inzwischen schon einmal passiert :-)

Gehäuse

Als Gehäuse schwebte mir etwas vor das ähnlich wie eine richtige Tastatur eine gewissen Steigung nach hinten hat. Die LEDs sollten neben den Tasten A-D platziert werden um den Status des aktiven Sets anzuzeigen. Außerdem soll eine Micro-USB Buchse nach hinten geführt werden. Herausgekommen ist dabei das:

Das Gehäuse kann man sich auf Thingiverse herunterladen. Ich habe auch die OpenSCAD Dateien beigelegt, damit man das Gehäuse ggf. noch anpassen kann.

LEDs

Jetzt kann man die LEDs für die Anzeige des gewählten Sets sowie den Fehler- bzw. Erfolgsmeldungen bei der PIN Eingabe einbauen.

Bei mir haben die LEDs genau gepasst so dass sie noch einen leichten Widerstand beim hineindrücken hatten und so ohne Kleber halten. Sollten die LEDs nicht halten, entweder etwas Kleber dran oder den Durchmesser der LEDs um 0.1 mm kleiner machen, dann sollten sie wieder halten.

Die Anschlusspins der Kathode an der LED sind ausreichend lang so dass man sie umbiegen kann und sie bis zur nächsten LED reichen. Dort lötet man sie einfach an die Kathode der nächsten LED.

An die Anoden kommt später ein Draht der zu der Platine mit den Vorwiderständen geht. Mit den Drähten warten wir aber noch bis wir das Modul mit den Vorwiderständen fertig haben. Dann lassen sich die Drähte etwas besser ablängen. Die Drähte sind nachher zwischen 6 und 7 cm lang.

Modul mit Vorwiderständen

Das Modul mit den Vorwiderständen ist einfach nur ein Stück Lochrasterplatine mit je einer 4poligen Stift- und Buchstenleiste und enthält je einen Vorwiderstand für jeder unserer LEDs.

Mit den Widerstandswerten muss man ein bisschen herumprobieren bis man eine Helligkeit gefunden hat die einem zusagt. Die gängigen LEDs kann man mit einem 180Ω Widerstand an 5V betreiben, was die LEDs aber viel zu hell macht. Die blauen LEDs die ich verwendet habe, habe ich über je einen 470Ω Widerstand angeschlossen und die Helligkeit finde ich so ganz angenehm.

Hier kommt jetzt übrigens das Thema mit den Abstandshaltern an den gebogenen Stiftleisten, was ich eingangs erwähnt habe, zum tragen. Je nachdem welche Stiftleisten man hat bekommt man jetzt Probleme wenn man normale 1/4 Watt Widerstände verwenden will. Bei meinem zweiten Pad, welches ich gebaut habe, habe ich die Stiftleisten erwischt, die meinen Arduino weiter nach oben verschoben haben und damit die Platine mit den Anschlußpins nicht mehr in das Gehäuse gepasst haben. Deshalb bin ich bei diesem Pad dann auf die SMD Widerstände ausgewichen. Damit konnte ich ein Streifenraster einsparen und es hat wieder alles ins Gehäuse gepasst.

Hier mal beide Varianten zum Vergleich. Links die Variante mit den normalen 1/4W Widerständen und rechts die Variante bei der der Arduino zu weit nach oben kommt und damit die SMD Widerstände nötig wurden:

Auf den Bilder sieht man auch dass man je nach Art der Stiftleiste die Buchsenleisten am Arduino anders einlöten muss.

Jetzt kann man die Kabel von den LEDs zu den Vorwiderständen anbringen. Dazu 6-7cm lange Kabelstücke auf der einen Seite mit der Anode der LED verlöten und mit einem Schrumpfschlauch vor Kurzschlüssen sichern. Auf der anderen Seite einen weiblichen Dupont Steckverbinder aufcrimpen. Die vier Steckverbinden kann, wenn man hat, in einen 4fach Steckschuh stecken, dann kann man die LEDs ohne viel Gefummel mit den Vorwiderständen verbinden.

Die gemeinsamen Kathoden der LEDs verbindet man mit einem GND Pin am Arduino.

Bodenplatte

Als letztes kommt die Bodenplatte mit der Verlängerung und Durchführung des USB-Ports des Arduinos. Damit das Gehäuse möglichst klein bleibt benutzt man ein USB Kabel mit  einem 90° nach links abgewinkelten USB Stecker.

Das günstigste Kabel das ich gefunden habe war ein OTG Kabel, welches normalerweise dazu verwendet wird USB-Geräte an Tablets und Handys anzuschließen. An diesen einfach die Kupplung abschneiden und das Kabel und die Drähte abisolieren. Das Kabel ist leider etwas sehr kurz was zu etwas Zug am Kabel beim Zusammenschrauben führt. Bislang macht es keine Probleme aber wenn das Kabel eine etwas größere "Schlaufe" machen würde wäre es sicher besser.

Es werden die vier Anschlüsse VCC, GND, D+ und D- benötigt. Den ID-Pin braucht man nicht und kann entweder abgeschnitten oder einfach nach hinten weggebogen und später hinter dem Schrupfschlauch versteckt werden.

Bei dem USB Port habe ich die mitgelieferte, gerade Stiftleiste gegen eine um 90° abgewinkelte ausgetauscht.

Der USB Port wird anschließend mit zwei kleinen Schrauben an der Bodenplatte verschraubt. Habe dafür Blechschrauben genommen, da ich keine so kleinen Schrauben für Kunststoff gefunden habe. Hält auch...

Innerhalb des Gehäuses wird das USB-Kabel wie auf den beiden folgenden Bildern angeschlossen.

Alles verschrauben

Wenn nach einem Test alles funktioniert, kann man alles verschrauben.

Das Keypad wird mit zwei kleinen Schrauben im Deckel befestigt. Dazu einfach das Keypad in den Deckel eindrücken und mit einem 1.5 mm Bohrer vier kleine Löcher in die Innenseite des Deckels bohren. Darauf achten nicht durch zu bohren. Dann das Keypad mit 4 Schrauben und ggf. jeweils einer Unterlegscheibe am Deckel befestigen.

Wenn noch nicht geschehen den USB-Port auf der Bodenplatte verschrauben und ggf. die LEDs mit etwas Heißkleber vor verrutschen sichern.

Beide Gehäuseteile aufeinanderlegen und diese mit den vier Schrauben miteinander verschrauben.

Beim Eindrehen der Schrauben in das Gehäuse drauf achten dass man nicht zu fest schraubt um das Gehäuse nicht zu beschädigen.

Schlussendlich sollte es dann etwa so aussehen:

Da bei mir keine zwei Webseiten das gleiche Passwort haben ist das ein echt hilfreiches kleines Helferlein das ich nicht mehr missen möchte.

Arduino "de-bricken"

Wenn man es einmal geschafft hat, versehentlich den falschen Board-Typ auszuwählen und eine so kompilierte Firmware flased, kann es passieren dass der Pro Micro nicht mehr ansprechbar ist.

So ist es mir passiert. Habe zuvor ein MySensors-Sensors auf Nano Basis geflasht, schnell ein neues Passwort in den Loginpad Sketch eingetragen, den Port ausgewählt und ohne den Board-Typ umzustellen den Sketch geflashed. Damit war der Arduino vorübergehend hinüber.

Um den Arduino wieder zum laufen zu bekommen muss wieder der richtige Bootloader gebrannt werden. Wie man das macht wird auf der Arduino Seite erklärt. Man kann mit einem zweiten Arduino den Bootloader über SPI auf den zweiten Arduino übertragen.

Dazu wird ein Sketch auf den Arduino übertragen den man als ISP verwenden möchte und dann jeweils die Pins für MISO,MOSI und SCK miteinander verbunden sowie der Reset-Pin des zu flashenden Arduinos mit einem IO-Pin des ISP Arduinos. Außerdem versorgt man den zu flasheden Arduino über die 5V/GND Pins des ISP Arduinos. Dann wählt man in der IDE den Board-Typ des Arduinos aus den man debricken möchte, in diesem Fall Arduino / Genuino Micro und führt unter Werkzeuge > Bootloader brennen aus.

Danach kann man den LoginPad-Sketch wieder flashen.