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.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 14 Min.
Von
  • Miguel Köhnlein
  • Michael Gaus
Inhaltsverzeichnis

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.

Das Hallsensor-Modul kann Magnetfelder erkennen und zieht seinen Ausgang auf Low-Pegel, wenn es groß genug ist.
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

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.

Das Hallsensor-Modul wird innen unterhalb der Nase in den Hasen eingenäht.

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.

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.

Servo-Motor als Verriegelung für die Schatztruhe: Als Riegel dienen Servo-Arm und passend gebogener Blechwinkel.

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.

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.

Elektronikaufbau mit dem NanoAxe-Board auf dem Mini-Steckbrett

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.

In der Karotte ist ein flacher Neodym-Magnet versteckt.

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.

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.

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.

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)