Ostereiersuche mit NanoAxe-Controller
Sollte Ostern mit Ihren Kindern wetterbedingt indoor stattfinden, hätten wir etwas für Sie: Unsere Eier-Schatztruhe öffnet sich nur mit Karotten-Code-Eingabe.
- Miguel Köhnlein
- Michael Gaus
Kleine Oster-Bastelei gefällig? Um die Ostereiersuche für Kinder etwas spannender zu gestalten, haben wir eine Eier-Schatztruhe gebastelt, die vom Osterhasen bewacht wird. Um die verriegelte Kiste öffnen zu können, wird der richtige vierstellige Code benötigt.
Die Kinder müssen zunächst die vier Codeziffern finden, die jeweils einzeln auf einem Zettelchen geschrieben und an vier verschiedenen Plätzen versteckt wurden. Die Zettel können beispielsweise in aufklappbare Deko-Ostereier gelegt werden. Außerdem müssen die Kinder noch die "magische Karotte" finden, die zur Codeeingabe benötigt wird. Diese haben wir aus Papier gebastelt und mit einem flachen Neodym-Magneten ausgestattet. Zu guter Letzt muss noch die versteckte Oster-Schatztruhe gefunden werden, die vom daneben sitzenden Häschen beaufsichtigt wird.
Unterhalb der Nase von Meister Lampe haben wir ein Hallsensormodul eingebaut. Damit kann der Hase auf Magnete reagieren. Sobald er die magische Karotte erschnuppert, bekommt das Häschen leuchtende Augen. Hierfür haben wir zwei grüne LEDs eingebaut. Solange der Hase die Karotte detektiert, zählt er die aktuelle Codeziffer mit "Augenblinzeln" hoch. Ist der gewünschte Zahlenwert erreicht, zieht man die Karotte weg und kann nach kurzer Pause die nächste Ziffer eingeben. Mit dem richtigen Code wird die Oster-Schatztruhe vermutlich nicht lange verschlossen bleiben.
Durch die Verwendung des NanoAxe-Boards gestaltet sich der Schaltungsaufbau recht einfach. Die im NanoAxe-Schaltplansymbol innen liegenden Pins kennzeichnen die Port-Nummern des hier verwendeten PICAXE 08M2. Dieser verfügt über 6 I/O-Pins C0-C5. Achtung: Die Bezeichnungen direkt an den Kontaktleisten PL4 und PL5 stimmen mit dem Aufdruck auf der Platine überein und kennzeichnen die Pins des größeren PICAXE 20M2.
Das Hallsensor-Modul KY-003 wird über die 3polige Stiftleiste J1 angeschlossen. Das digitale Low-aktive Ausgangssignal ist mit dem Portpin C.3 des Picaxe 08M2 verbunden (Beschriftung C6 auf dem NanoAxe-Board). Per Firmware wird ein interner Pullup-Widerstand aktiviert. Der Servomotor MG90S wird über die 3-polige Stiftleiste J2 angeschlossen, das PWM-Steuersignal kommt aus dem Portpin C.4 des Picaxe 08M2 (Beschriftung C7 auf dem NanoAxe-Board). Die beiden grünen LEDs für die Augen werden jeweils über einen Vorwiderstand mit dem Portpin C.1 des Picaxe 08M2 verbunden (Beschriftung B0 auf dem NanoAxe-Board). Die Spannungsversorgung der Schaltung kann über eine kleine USB-Powerbank erfolgen, die im Osterhasen Platz findet.
Bauteile
NanoAxe-Board | Bestückt mit PICAXE 08M2 |
R1, R2 | Widerstand 1 kOhm |
J1 (Hallsensor) | Hallsensormodul KY-003 |
J2 (Servo) | Servomotor MG90S |
3x Dupont-Kabel male-female | für Verdrahtung des Hallsensors |
Flachbandkabel | für Verdrahtung des Servomotors |
3-pol. Stiftleiste (2x) | Anschluss von LEDs und Servomotor |
Schatztruhe | Holztruhe |
Osterhase | Osterkörbchen aus Filz in Hasenform |
Magnet | Flacher Neodym-Magnet |
Steckbrett | Mini-Breadboard mit 170 Kontakten |
Hase und Schatztruhe
Wir haben ein Osterkörbchen aus Filz in Hasenform verwendet. Das Hallsensor-Modul haben wir innen unterhalb der Nase des Hasen angebracht und die Platine an den zwei Befestigungslöchern festgenäht. Den Hallsensor haben wir leicht umgebogen, sodass er dicht am Filz anliegt. Das Modul wird später mit Dupontkabeln mit dem Steckbrett verbunden.
Für die LEDs haben wir zunächst mit einer Nadel jeweils zwei Löcher durch die Augen gestochen. Anschließend haben wir die LEDs von außen durchgesteckt und auf der Innenseite des Hasen mit kleinen Lochrasterplatinenstückchen (Ausführung mit Lötpunkten) angelötet. Die Kathoden haben wir mit einem Stück Fädeldraht miteinander verbunden. An die insgesamt drei Anschlüsse der beiden LEDs haben wir Fädeldrähte und auf der Gegenseite Stiftleisten angelötet, die dann später kopfüber in das Mini-Breadboard gesteckt werden können.
Schatztruhe umbauen
Wir haben eine kleine Holztruhe aus dem Bastelladen verwendet. Darin haben wir einen kleinen Servomotor eingebaut, der je nach Stellung des Arms die Kiste ver- oder entriegelt. Im Deckel haben wir ein u-förmig gebogenes Blech angeschraubt. In Stellung 180 Grad des Servoarms ist die Kiste entriegelt, so wie auf dem Foto zu sehen. In Stellung 90 Grad (Mittelstellung) ist die Truhe verriegelt, da sich dann der Servoarm oberhalb des gewinkelten Blechs befindet und das Öffnen mechanisch blockiert. Der Deckel kann dann lediglich einen kleinen Spalt geöffnet werden. Für den Servo haben wir aus Sperrholz eine Halterung mit passender Aussparung gesägt, sodass der Motor darin über die mitgelieferten Schrauben befestigt werden kann. Zwei Holzstückchen unter dem Sperrholzbrettchen sorgen für die passende Montagehöhe.
In die Seitenwand der Truhe haben wir ein Loch gebohrt und dort ein dreiadriges Flachbandkabel herausgeführt. An beiden Kabelenden haben wir dreipolige Stiftleisten angelötet. Am Kabelende innerhalb der Box kann dann das am Servo bereits vorhandene Kabel eingesteckt und das andere Ende in das Breadboard außerhalb der Kiste eingesteckt werden.
Zusammenbau der Elektronik
Das NanoAxe-Board haben wir wie in der Fritzing-Skizze zu sehen auf ein Mini-Breadboard mit 170 Buchsenkontakten gesteckt. Dadurch kann die Platine problemlos nach Ostern wieder für andere Bastelzwecke verwendet werden. Vor dem Anschluss der Peripherie muss erst noch der PICAXE 08M2 mit der passenden Firmware geflasht werden. Hierzu wird das NanoAxe-Board per USB-Kabel mit dem PC verbunden. Anschließend wird vom PICAXE-Editor aus das Basic-Programm Osterhase_Codeschloss.bas aufgespielt.
Die Verbindung zwischen dem Hallsensormodul und dem NanoAxe-Board haben wir über Dupontkabel des Typs male-female mit Stiften auf der einen und Buchsen auf der anderen Seite vorgenommen. Diese können direkt in das Mini-Breadboard sowie in das KY-003 Modul gesteckt werden. Die Verbindungen zu den LEDs erfolgt mit Fädeldrähten, die an Stiftleisten angelötet werden und somit in das Breadboard gesteckt werden können. Die Vorwiderstände für die LEDs finden direkt auf dem Steckbrett Platz. Für die Verbindung zwischen dem Servomotor und dem NanoAxe-Board haben wir ein dreiadriges Flachbandkabel verwendet und Stiftleisten angelötet, sodass dieses in das Breadboard gesteckt werden kann.
Im Innenraum des Hasen wird das Steckbrett mit dem Nanoaxe-Board untergebracht. Eine kleine USB Powerbank zur Spannungsversorgung findet dort ebenfalls Platz.
Aus orangem und grünem Tonpapier haben wir eine zweidimensionale Karotte gebastelt. Zwischen die Papierschichten haben wir einen flachen Neodym-Magneten mit doppelseitigem Klebeband eingeklebt. Dadurch kann der Hase über den in der Nase eingebauten Hallsensor sozusagen die Karotte erschnuppern.
Der von uns verwendete Hallsensor ist unipolar, d.h. er reagiert nur auf eine Polarität des Magnetfeldes (Nord- bzw. Südpol, abhängig von der Einbaurichtung). Das bedeutet, dass die Karotte in der richtigen Orientierung vor die Nase des Hasen gehalten werden muss, damit der Sensor reagiert. Auf dem Sensormodul befindet sich eine LED, die bei erkanntem Magnetfeld leuchtet.
Quellcode
Im Folgenden beschreiben wir ausführlich den BASIC-Quellcode für den Nano-Axe-Controller. Sie können das Projekt natürlich auch ohne tieferes Verständnis aufbauen, dann geht es für Sie auf der nächsten Seite weiter. Ganz oben im Quellcode kann mit CODE_DIGIT1 bis CODE_DIGIT4 der gewünschte vierstellige Pincode definiert werden. Wenn für Testzwecke eine Debugausgabe auf dem Picaxe-Terminal gewünscht ist, muss das Kommentarzeichen (Semikolon) beim Define ENABLE_DEBUG_OUTPUT entfernt werden. Dadurch werden alle mit DEBUGTEXT aufgerufenenTextausgaben mit dem sertxd-Befehl ausgegeben. Hiermit können dann beispielsweise die erkannten Codeziffern auf dem Terminal sichtbar gemacht werden. Anschließend werden die Portpins für die LEDs, den Hallsensor sowie den Servomotor definiert. Außerdem werden die beim servopos-Befehl benötigten Werte für die beiden Servostellungen „verriegelt“ und „entriegelt“ festgelegt.
#picaxe 08m2
; 4-stelligen Pincode fuer das Codeschloss definieren
#define CODE_DIGIT1 1
#define CODE_DIGIT2 2
#define CODE_DIGIT3 3
#define CODE_DIGIT4 4
; wenn keine Debugausgabe per Terminal gewuenscht, dann folgende Zeile auskommentieren
;#define ENABLE_DEBUG_OUTPUT
symbol LEDS_PIN = C.1
#define LEDS_OFF low LEDS_PIN
#define LEDS_ON high LEDS_PIN
symbol HALL_PIN = pinC.3
symbol HALL_PULLUP_MASK = %01000
symbol SERVO_PIN = C.4
symbol SERVO_POS_CLOSED = 150 ; Servo Position 90 Grad = verriegelt
symbol SERVO_POS_OPEN = 240 ; Servo Position 180 Grad = entriegelt
#ifdef ENABLE_DEBUG_OUTPUT
#define DEBUGTEXT sertxd
#else
#define DEBUGTEXT ;
#endif
symbol RAM_ADDR_KEYCODE = 28
symbol counter = b0
symbol codeInputActive = b1
symbol codeDigit = b2
symbol timeout = b3
pullup HALL_PULLUP_MASK
gosub initPincode
codeInputActive = 0
codeDigit = 0
timeout = 0
LEDS_ON
do
loop until HALL_PIN = 0
gosub lock
do
loop while HALL_PIN = 0
LEDS_OFF
pause 500
main:
if HALL_PIN = 0 then
codeInputActive = 1
LEDS_ON
pause 250
LEDS_OFF
pause 1000
codeDigit = codeDigit + 1 % 10
DEBUGTEXT(" ", #codeDigit)
timeout = 0
else
if codeInputActive = 1 then
gosub checkCode
codeInputActive = 0
timeout = 50 ; Timeout 50*100ms = 5s
codeDigit = 0
LEDS_ON
pause 1000
LEDS_OFF
pause 500
endif
endif
pause 100
if timeout != 0 then
dec timeout
if timeout = 0 then
DEBUGTEXT(cr,lf, "Timeout",cr,lf)
for counter = 1 to 3
LEDS_ON
pause 250
LEDS_OFF
pause 250
next counter
gosub initPincode
endif
endif
goto main
checkCode: ; Code ueberpruefen
if codeDigit = @bptr then
DEBUGTEXT(cr,lf, "Codeziffer richtig",cr,lf)
inc bptr
if @bptr = 0xFF then
LEDS_ON
DEBUGTEXT(cr,lf, "*** Code richtig ***",cr,lf)
gosub unlock
do
LEDS_OFF
pause 500
LEDS_ON
pause 500
loop
endif
else
DEBUGTEXT(cr,lf, "Codeziffer falsch",cr,lf)
gosub initPincode
endif
return
lock: ; Schloss verriegeln
DEBUGTEXT(cr,lf,"Lock",cr,lf)
pause 100
servo SERVO_PIN, SERVO_POS_CLOSED
servopos SERVO_PIN, SERVO_POS_CLOSED
pause 1000
return
unlock: ; Schloss entriegeln
DEBUGTEXT(cr,lf,"Unlock",cr,lf)
pause 100
servopos SERVO_PIN, SERVO_POS_OPEN
pause 1000
servo SERVO_PIN,OFF
return
initPincode: ; Initialisierung des Pincodes
bptr = RAM_ADDR_KEYCODE
@bptrinc = CODE_DIGIT1
@bptrinc = CODE_DIGIT2
@bptrinc = CODE_DIGIT3
@bptrinc = CODE_DIGIT4
@bptrinc = 0xFF
bptr = RAM_ADDR_KEYCODE
return
Beim Programmstart wird zunächst der interne Pullup für das Hallsensormodul aktiviert. Im Unterprogramm initPincode wird der oben festgelegte Pincode ins RAM ab der Adresse RAM_ADDR_KEYCODE geschrieben, gefolgt vom Wert 0xFF als Endekennung. Die Variable bptr wird auf den Wert RAM_ADDR_KEYCODE gesetzt, sodass diese als Pointer auf die erste Codeziffer zeigt. Anschließend werden die beiden LEDs eingeschaltet, sodass die Augen des Hasen leuchten. Es wird nun so lange gewartet, bis der Hallsensor ein Magnetfeld erkennt, d.h. ein LOW-Pegel auftritt. Hierzu muss die Karotte an die richtige Position unterhalb der Nase des Hasen gehalten werden. Dann wird die Truhe durch Aufruf des Unterprogramms lock verriegelt, wodurch der Servomotor in die Verriegelungsposition (Mittelstellung) bewegt wird. Anschließend wird so lange gewartet, bis der Hallsensor kein Magnetfeld mehr detektiert und dann die LEDs ausgeschaltet. Ab jetzt ist das Codeschloss scharf geschaltet.
Die main-Schleife prüft, ob der Hallsensor ein Magnetfeld erkennt. Wenn ja, beginnt die Codeeingabe und die Variable codeInputActive wird auf 1 gesetzt. Die beiden LEDs leuchten kurz auf (250ms an, 1s aus) und die Variable codeDigit wird um 1 erhöht, da diese die Pulse für die Eingabe der aktuellen Codeziffer mitzählt. Außerdem wird die Variable timeout auf 0 zurückgesetzt. Nach dem endif-Befehl (Zeile 70) wartet das Programm 100ms, die anschließende if-Bedingung für die timeout-Variable ist nicht erfüllt, sodass sie wieder an den Beginn der main-Schleife springt. Erkennt der Sensor immer noch ein Magnetfeld, dann wird der nächste Lichtpuls ausgegeben und codeDigit erneut erhöht. Wie weit der Eingabewert für die aktuelle Codeziffer hochgezählt wird, ist abhängig davon, wie lange wir die magnetische Karotte unter die Nase des Hasen halten.
Dies wiederholt sich also so lange, bis kein Magnetfeld mehr erkannt wurde, sodass dann der else-Zweig ab Zeile 60 ausgeführt wird. Wenn die Variable codeInputActive eine laufende Codeeingabe anzeigt, dann prüft das Unterprogramm checkCode, ob die gerade eingegebene Ziffer korrekt ist. Hierzu vergleicht sie den Wert von codeDigit mit dem RAM-Wert, auf den bptr zeigt. Wenn diese unterschiedlich sind, wird im else-Zweig ab Zeile 104 durch Aufruf von initPincode die Variable bptr wieder auf den Anfang im RAM zurückgesetzt, sodass der bisher eingegebene Pincode komplett verworfen und mit return zurückgekehrt wird.
Überprüfung der Codeziffer
Bei richtiger Codeziffer wird hingegen der if-Zweig ab Zeile 90 ausgeführt und bptr inkrementiert, sodass dieser Pointer auf die nächste erwartete Codeziffer zeigt. Falls diese den Wert 0xFF hat, dann wurden alle 4 Codeziffern richtig eingegeben und das Unterprogramms unlock bewegt den Servomotor in die Entriegelungsposition, sodass sich die Schatztruhe nun öffnen lässt. Die LED-Augen blinken nun in einer Endlosschleife, denn die Osterrallye wurde erfolgreich abgeschlossen. Falls der Code jedoch noch nicht komplett eingegeben wurde, wird checkCode mit return verlassen.
Nach dem Rücksprung aus checkCode geht es ab Zeile 62 weiter. Die Variable codeInputActive wird zurückgesetzt, da die Eingabe der aktuellen Codeziffer beendet ist. Nun wird ein Timeout von ca. 5 Sekunden (50 * 100ms) über die entsprechende Variable vorbereitet und codeDigit auf Null zurückgesetzt, damit die nächste Codezifferneingabe wieder mit 1 startet. Die LEDs leuchten eine Sekunde lang auf und signalisieren dadurch optisch die abgeschlossene Eingabe der aktuellen Codeziffer. Nach einer Pause von 100ms in Zeile 71 ist nun die if-Bedingung erfüllt. Somit wird die timeout-Variable dekrementiert. Da sie jedoch noch nicht auf Null steht, erfolgt wieder ein Sprung an den Beginn der main-Schleife. Falls kein Magnetfeld erkannt wird, erfolgt lediglich eine Pause von 100ms (Zeile 71). Wenn also 5 Sekunden lang kein Magnetfeld erkannt wurde, ist der Timeout abgelaufen und verzweigt in Zeile 75. Die LEDs blinken dreimal schnell hintereinander und signalisieren so optisch, dass die Codeeingabe aufgrund zu langer Inaktivität zurückgesetzt wurde. Der Pincode muss also wieder komplett neu eingegeben werden.
Wenn jedoch während der 5-sekündigen Timeoutphase ein Magnetfeld erkannt wird, geht es mit Zeile 51 weiter, wo die Eingabe der nächsten Codeziffer verarbeitet wird. Es bleibt also nach jeder eingegebenen Codeziffer ein Zeitfenster von rund 5 Sekunden, um die nächste Ziffer einzugeben.
Codeschloss bedienen per Karotte
Der unterhalb der Nase des Hasen eingebaute Hallsensor reagiert auf den Magneten in der Karotte. Nach dem Einschalten der Versorgungsspannung des NanoAxe-Boards leuchten die LED-Augen und wir müssen zunächst die Karotte passend hinhalten, woraufhin der Servo in die Verriegelungsposition (Mittelstellung) fährt. Danach entfernen wir die Karotte, wodurch die LEDs ausgehen und das Codeschloss scharf geschaltet und bereit für die Eingabe des Pincodes ist.
Nun lassen wir das Häschen wieder an der Karotte schnuppern, wodurch die Augen im Sekundentakt pulsartig kurz aufleuchten. Wir müssen die sichtbaren Lichtpulse mitzählen und entfernen die Karotte erst dann, wenn der gewünschte Ziffernwert beginnend ab 1 erreicht ist. Daraufhin leuchten die Augen eine Sekunde lang auf, wodurch der Hase die Übernahme der Ziffer signalisiert hat. Ob diese richtig oder falsch ist, wird uns jedoch nicht verraten, denn es soll ja nicht zu einfach sein. Bei einer falschen Ziffer wird die Pin-Eingabe unsichtbar auf den Anfang zurückgesetzt.
Nach jeder Übernahme einer Ziffer (also 1-sekündiges Aufleuchten der Augen nach Entfernen der Karotte) müssen wir durch erneutes Vorhalten der Karotte innerhalb von höchstens 5 Sekunden mit der Eingabe der nächsten Ziffer fortfahren. Lassen wir uns zu lange Zeit, dann schlägt ein Timeout zu und setzt die Pin-Eingabe zurück auf den Anfang, was durch 3-maliges schnelles Blinken der Augen signalisiert wird. Wenn wir uns also mal bei der Code-Eingabe verzählt haben, können wir durch entsprechend langes Entfernen der Karotte jederzeit von vorne mit der Codeeingabe beginnen.
Wenn alle vier Ziffern korrekt nacheinander eingegeben sind, wird die Schatztruhe durch Verfahren des Servos entriegelt und die Augen des Häschens blinken vor lauter Freude endlos bis zum Abschalten der Versorgungsspannung.
(cm)