In der Kiste
Aufbau & Funktion
Die Kiste ist aus Holz gebaut, das beim Bau eines Bettes übrig blieb. Der Deckel misst 38 x 38 Zentimeter, die Höhe beträgt hockertaugliche 34 Zentimeter. In der Kiste wirken verschiedene Komponenten zusammen:
Das Schloss besteht aus einem kleinen Modellbauservo, der einen Buntstift als Riegel verschiebt. Im Bild unten rechts.
Das Klopfen wird von einem Piezo-Sensor erfasst. Das ist nichts weiter als ein kleiner Piepslautsprecher, den ich aus einer Musik-Grußkarte ausgebaut habe. Im Bild unter dem silbernen Klebeband.
Eine blaue und eine rote LED zeigen an, dass geklopft wird bzw. dass gerade ein neuer Klopfcode programmiert wird. Die LEDs sind nur bei geöffnetem Deckel sichtbar. Im Bild am unteren linken Rand im hellen Holzklotz.
Ein kleiner Taster, der nur bei geöffnetem Deckel zugänglich ist, dient dazu, einen neuen Klopfcode zu programmieren. Dazu wird der Taster kurz gedrückt, woraufhin die rote LED erleuchtet. Dann kann geklopft werden. Das Klopfende wird automatisch erkannt, der Code wird gespeichert, die rote LED erlischt und der Servo schiebt den Riegel vor. Da der Deckel beim Programmieren offen ist und am Ende aber der Riegel verschlossen wird, kann die Kiste nicht ohne Codekenntnis verschlossen werden. Denn zum Verschließen muss der neue Code erst einmal geklopft werden. Oder es muss, falls man den Code nach ein paar Sekunden schon wieder vergessen hat, ein neuer Code einprogrammiert werden. Ohne richtigen Code lässt sich die Kiste nicht öffnen! Im Bild unten links.
In der Kiste ist ein LED-Streifen vom Typ WS2812B verbaut. Bei diesen Streifen kann jede LED einzeln angesteuert werden, um beliebige Farben zu erzeugen. Damit wird in der Kiste mit verschiedenen Farbeffekten signalisiert, dass geklopft und dass ein falscher oder der richtige Code eingegeben wurde. Im Bild sind unten links nur die drei bunten Leitungen zu sehen, die zum LED-Streifen führen.
Die Kiste ist von innen vollverspiegelt. Die Spiegel sind aus Sonnenschutzfolie gebaut, die ich auf Acrylglas aufgebracht habe. Da diese Spiegel halbdurchlässig sind und von oben durch ein Loch in die Kiste geschaut werden kann, ergibt sich ein unendlicher Spiegel. Im Bild nicht zu sehen.
Ein Mikrocontroller wertet das Klopfen aus und steuert Servo und Licht an. Den ersten Prototypen habe ich mit einem Arduino UNO entwickelt. Das Arduino-System war mein Einstieg in die Welt der Mikrocontroller. Für die Kiste habe ich dann aber für 3 Euro einen billigen nackten ATmega168 gekauft und zusammen mit den nötigsten Komponenten auf eine Streifenrasterplatine aufgelötet, siehe unten. Das nennt sich dann Arduino on a breadboard.
Natürlich braucht es auch Strom. Die Stromversorgung übernimmt eine USB-Powerbank, die normalerweise zum Aufladen von Smartphones verwendet wird. Damit kann die Kiste ungefähr drei Tage im Standby-Modus durchhalten. Wenn der Strom alle ist, dann kann über das kleine Steckernetzteil wieder aufgeladen werden. Eine komplette Ladung braucht ungefähr fünf Stunden, während des Ladens kann die Kiste nicht eingeschaltet werden. Im Bild oben.
Die Kiste wird über einen Schalter ein- und ausgeschaltet, damit der Strom nicht sinnlos verbraucht wird. Die Kiste spinnt manchmal, wenn sie zu wenig Strom hat, dann muss nachgeladen werden. Im Bild links oben.
Später habe ich noch eine kleine Klopfkiste aus Pappe gebaut: mit einem ATtiny85 als Microcontroller und ohne den LED-Streifen. Der Servo schiebt dabei nicht einen Riegel, sondern hebt und senkt den Deckel.
Schaltung
Die Schaltung ist sehr einfach gehalten. Im Wesentlichen besteht sie aus einem ATmega 168PA-PU, an den verschiedene Komponenten angeschlossen wurden:
Der Piezo-Sensor wird mit einem 1MOhm-Pulldown-Widerstand an einen analogen Eingang angeschlossen.
Der Programmiertaster wird zwischen Ground und einen Digitaleingang (mit internem Pullup-Widerstand) angeschlossen.
Der Servo wird an einen digitalen Ausgang angeschlossen
Die LEDs werden an digitale Ausgänge angeschlossen. Die 220Ohm-Widerstände begrenzen dabei den Strom und bewahren dadurch LEDs und Mikrocontroller vor der Zerstörung.
Der LED-Streifen ist an einen digitalen Ausgang angeschlossen.
Die Kondensatoren sind dafür da, dass...so ganz genau weiß ich es nicht. Auf jeden Fall stabilisieren sie die Schaltung, indem sie einerseits hochfrequente Störungen filtern und bei starkem Strombedarf als Pufferspeicher dienen. Prinzipiell ginge es auch ohne. Aber wenn der LED-Streifen voll aufleuchtet, dann fängt der Microcontroller an Unsinn zu treiben. Deshalb habe ich einfach mal drei Kondensatoren unterschiedlicher Größe möglichst nah an den Microcontroller zwischen Masse und Spannung eingebaut.
Servo, LED-Streifen und Mikrocontroller werden zusätzlich an die Spannungsquelle angeschlossen.
Der Ruhestrom beträgt ungefähr 75mA. Er muss künstlich hoch gehalten werden, sonst schaltet sich die USB-Powerbank nach einigen Sekunden ab - weil sie nicht glaubt, dass noch jemand Strom benötigt. Deshalb leuchten im Standby-Modus permanent einige LEDs des Streifens. Ohne diesen hübschen Effekt würden nur 43mA Ruhestrom benötigt und die Kiste würde noch deutlich länger durchhalten. Nach dem Eingeben eines Codes fließen bei voller Beleuchtung zwischen 480mA (fail) und 400mA (success).
Eine Fritzing-Datei mit dem Aufbau auf der Streifenrasterplatine gibt es im Github-Repository.
Programm
Das Programm habe ich in der Arduino IDE geschrieben. Neben der Standard-Library werden folgende Komponenten zur Steuerung der Hardware verwendet:
Der LED-Streifen wird über FastLED angesteuert. Eine großartige Bibliothek, herzlichen Dank!
Zur Auswertung des Klopfmusters habe ich auf Code von Steve Hoefer zurück gegriffen. Vielen Dank, das hat mir das Leben leichter gemacht!
Der Code wird mit der mitgelieferten EEPROM-Library dauerhaft im Microcontroller gespeichert.
Der Servo wird über die mitgelieferte Servo-Library angesteuert
Die Programmierung des schwarzen Käfers habe ich dann über einen Arduino Uno als ISP durchgeführt. Zunächst hoffte ich darauf, in der Arduino IDE einfach nur ein Board auswählen zu müssen, das ebenfalls einen ATmega168 verwendet. Ganz so einfach war es dann doch nicht: eine eigene Boarddefinition für den ATmega168PA-PU (ohne Kristall bzw. 8Mhz) musste her und ein entsprechender Bootloader gebrannt werden. Ich bin mir nicht mehr sicher, woher ich beides letztendlich hatte, aber beschrieben wird das Vorgehen auf http://birdslikewires.co.uk/arduino-bootloader-on-atmega168.
Der Code, die Board-Definition und der Bootloader sind im Github-Repository zu finden.