Ein Reaktivlicht? Wasn das? Beim Geocaching gibt es eine besondere Spielart: der Nachtcache. Dort hangelt man sich eine Wegstrecke anhand von Reflektoren durch den Wald. Wenn man da mal eine längere Distanz zu überbrücken hat sind Reflektoren aber nicht wirklich geeignet weil deren Leuchtweite eingeschränkt ist. Doch da kommt das Reaktivlicht ins Spiel. Es ist eine elektronische Schaltung die darauf lauert kurz angeleuchtet zu werden um dann mit einer Blinksequenz zu antworten. Und da man im Dunkeln das Blinken von hellen LEDs sehr weit sehen kann ist das eine gut Lösung dafür. Es gibt auch noch weitere Möglichkeiten was man mit der Schaltung realisieren kann, dazu aber später mehr.
Da ich nun ein solches benötige aber keine Lust habe mir stumpf eines zu kaufen und ich mich gerade angefangen habe mit Mikrocontrollern zu beschäftigen stand fest: Das krieg ich bestimmt selber hin.
Also stöberte ich mich durch einige Tutorials welche aber alle irgendwie tiefgreifende Kenntnisse in Sachen Programmierung und Elektronik erfordern. Klar, damit ist man zwar in der Lage alles mögliche damit umzusetzen aber keines der Tutorials konnte halbwegs verständlich rüber bringen wie man das macht und was da im Einzelnen passiert. Aber ich hab mich da durch gewurschtelt und immer wieder meinen Freund Helge genervt der mir viele offene Fragen erklären konnte und schreib es hier mal nieder. Ich hoffe es ist einigermaßen verständlich. Falls Fragen offen bleiben oder ich es dann am Ende doch zu kompliziert erklärt habe: einfach nen Kommentar drunter setzen, ich erkläre es dann.
Es gibt ja mehrere Varianten so ein Reaktivlicht umzusetzen. Da wäre z.B. die Methode als Sensor einen lichtempfindlichen Widerstand (LDR) zu benutzen und damit das Blinken einer Leuchtdiode zu starten. Dazu benötigt man aber einige Bauteile die natürlich auch Platz wegnehmen auf einer Platine und Platz ist in so einem wasserdichten PETling doch eher Mangelware.
Bei der Recherche stolperte ich über eine Variante die ein Minimum an Bauteilen erfordert: Batterien, Mikroprozessor und eine LED. Mehr nicht. Die Schaltung und das Programm nutzen einen Trick aus um die LED als Sensor zu benutzen.
Hier meine Bauteilliste (inkl Reichelt-Bestellnummer):
- 1 Mikroprozessor ATtiny13v (ATTINY 13V-10PU)
- 1 LED 5 mm super-rot, farblos (LED 5-10500 RT)
- 1 Batteriehalter 2x Mignon (HALTER 2XAAK)
- 1 PETling oder anderes, wasserdichtes Gehäuse
Mehr braucht es eigentlich nicht!
Ok, ein wenig Lötzinn, Draht, nen Lötkolben oder eine vernünftige Lötstation, evtl. nen kleines Stückchen Lochrasterplatine und, wer noch nicht hat, einen Programmieradapter für Microkontroller sind schon noch von Nöten, aber so etwas hat man als Bastler im Haus 😉
Gekostet hat mich ein Reaktivlicht knapp € 2,- an Material.
Zuerst habe ich die Schaltung mal auf einem Breadboard aufgebaut. Die Leitungen zum Programmieradapter habe ich der Übersichtlichkeit wegen mal nicht mit eingezeichnet.
Die Schaltung dazu schaut so aus:
Nun sieht man auf der Schaltung noch einen Jumper. Wozu ist der denn gut?
Ich habe eine Programmierung gefunden bei der man nachträglich die Standard-Blinksequenz umprogrammieren kann. Und das macht man über den Jumper, das geht ohne PC-Anschluss.
Was also macht diese Schaltung und warum benötigt sie nur so wenige Bauteile?
Grundsätzlich wird bei der LED eine Eigenart ausgenutzt sie als Sensor mit zu benutzen. Eine LED kann auch als Solarzelle benutzt werden. Setzt man eine LED dem Licht aus gibt sie Spannung ab. Mit dem Mikrocontroller lässt sich die Spannung messen. Über die unterschiedliche Höhe der Spannung lassen sich Schwellwerte festlegen wo Hell und Dunkel mit definiert werden. Diese muss man individuell je nach verwendeter LED anpassen. Die hier im Programm verwendeten Werte sind auf die LED von Reichelt abgestimmt.
Das Reaktivlicht ist in der Lage Tag und Nacht zu unterscheiden und fällt tagsüber in den Stromsparmodus so dass die Batterien durchaus 1-2 Jahre durchhalten.
Kommen wir nun zum Programm.
Während der Recherche fiel mir das nachfolgende Programm in die Hände welches ich auch übernommen habe. Es stammt aus der Feder von Schnasemann und basiert auf vielen Anregungen im Geoclub. Ich habe hier lediglich die Grundsequenz und die Schwellwerte angepasst. Programmiert wurde mit dem Programm BASCOM von dem man sich eine kostenlose Demoversion installieren kann. Diese langt für den kleinen ATtiny13. Erst für größere Projekte benötigt man die Vollversion.
' Version 1.12 03.11.2010 ' (c) geoclub & schnasemann
$regfile = "ATtiny13.DAT" $crystal = 128000 'Reale Frequenz des internen 128kHz-Oszillators $hwstack = 10 'default use 32 for the hardware stack $swstack = 20 'default use 10 for the SW stack $framesize = 20 'default use 40 for the frame $eeprom 'the following DATA lines data will go to the EEP file
Data &B00000000 Data &B01010101 $data
Stop Ac
Config Portb = &B11101110 'Portb.4 und Portb.0 auf 'Eingang' schalten Portb = &B00000001 'keine Pullups zuschalten, nur PB0
Wdtcr = &B11010100 'Watchdog auf 250ms einstellen Enable Interrupts
Config Adc = Single , Prescaler = Auto , Reference = Internal 'Referenzspannung des Adc Auf "Internal" = 1,1 V
Dim Wert1 As Byte Dim Wert2 As Byte Dim Schwelle As Byte Dim Anzahl As Byte Dim Runde As Byte Dim Merker As Byte Dim Eepromz As Byte Dim Zaehler As Byte Dim Tagzaehler As Byte Dim Teachin As Bit Dim Entprell As Byte Dim Result As Byte Const Dunkelwert = 18 ' Wert, ab dem Nacht erkannt wird (18) Runde = 0 Portb.1 = 0 'Masse für portb.0
Do If Tagzaehler >= 254 Then '( Config Portb.4 = Output 'im Tagmodus alle 8 sek flashen zum Test und Schlafen Portb.4 = 1 Gosub Warte16ms Portb.4 = 0 ') Gosub Warte8s 'Energiesparen wenn es hell ist nur alle 8 Sek. die LED checken Else Gosub Warte250ms 'im Dunkeln öfter End If
Gosub Einlesen Schwelle = 1.6 * Wert1 'Berechnungsformel für Taschenlampenschwelle, je dunkler, je empfindlicher Schwelle = Schwelle + 4 ' für die kleinen LED's sonst zu empfindlich, die großen ohne
If Wert1 >= 15 Then 'Geflacker bei Dämmerung vermeiden Schwelle = Schwelle + 8 End If
If Wert1 =< Dunkelwert Then Tagzaehler = 0 'Tagzähler auf 0 setzen bei ausreichend Helligkeit If Wert2 >= Schwelle Then Gosub Blinken End If Else If Tagzaehler =< 254 Then 'verzögerte Tagerkennung, damit die Tala nicht mit der Sonne verwechselt wird Tagzaehler = Tagzaehler + 1 End If End If
If Wert1 >= Dunkelwert Then 'bei Tag oder Dauerlicht Teachin = Pinb.0 If Teachin = 0 Then ' Teachin beginnt Gosub Blitz Teachin = Pinb.0 ' nicht mehr gedrückt, dann einlernen If Teachin = 1 Then Config Portb.4 = Output Portb.4 = 0 Runde = 0 For Eepromz = 1 To 62 Merker = 0 For Zaehler = 1 To 8 'bitzähler Result = 0 Rotate Merker , Left For Entprell = 1 To 5 If Entprell > 1 Then Gosub Warte16ms End If Teachin = Pinb.0 If Teachin = 0 Then Result = Result + 1 Portb.4 = 1 Else Portb.4 = 0 End If Next Entprell If Result > 2 Then Merker = Merker + 1 Runde = Eepromz ' Merken, wann als Letztes eine "1" getastet wurde End If Next Zaehler Writeeeprom Merker , Eepromz Next Eepromz If Runde < 62 Then Incr Runde Merker = &B01010101 ' Zum Schluss magic byte an das Ende schreiben Writeeeprom Merker , Runde End If Gosub Blitz Else ' Teachin immer noch gedrückt Merker = &B01010101 ' Magic byte schreiben, damit Programmierung löschen Writeeeprom Merker , 1 Gosub Warte250ms Gosub Warte250ms Gosub Warte250ms Gosub Warte250ms Gosub Blitz Gosub Blitz Gosub Warte8s End If Gosub Blinken End If End If
Wert1 = Wert2 'Wert2 nach Wert1 verschieben
Loop
Blitz: 'LED getaktet blinken lassen Config Portb.4 = Output Portb.4 = 0
For Anzahl = 1 To 10 'Anzahl des vorprogrammierten Blinkens (10) Portb.4 = 1 Gosub Warte16ms Portb.4 = 0 Gosub Warte250ms Next Anzahl Return
Einlesen: Start Adc Config Portb.4 = Output 'LED "entladen" Portb.4 = 0 Gosub Warte16ms Config Portb.4 = Input Portb.4 = 0 cbi adcsra,7 'ADEN = 0 Gosub Warte16ms sbi adcsra,7 'ADEN = 1 Wert2 = Getadc(2) 'Spannung der LED messen Stop Adc Return
Blinken: Config Portb.4 = Output Portb.4 = 0 For Eepromz = 1 To 62 Readeeprom Merker , Eepromz 'Byte lesen aus Eeprom If Merker = &B01010101 Then If Eepromz = 1 Then Gosub Blitz End If Exit For End If For Zaehler = 1 To 8 ' ansonsten bitweise schieben If Merker > 127 Then ' und blinken Portb.4 = 1 Gosub Warte64ms Portb.4 = 0 Else Gosub Warte64ms ' oder Pause nop nop nop nop
End If Rotate Merker , Left Next Zaehler Next Eepromz Gosub Warte8s Return
Warte8s: Wdtcr = &B11110001 'Watchdog auf 8s einstellen Reset Watchdog Powerdown Return
Warte16ms: Wdtcr = &B11010000 'Watchdog auf 16ms einstellen Reset Watchdog Powerdown Return
Warte64ms: Wdtcr = &B11010010 'Watchdog auf 64ms einstellen Reset Watchdog Powerdown Return
Warte250ms: Wdtcr = &B11010100 'Watchdog auf 250ms einstellen Reset Watchdog Powerdown Return End
Alternativ könnt ihr Euch die fertig kompilierte hex-Datei und die Datei fürs Eeprom hier downloaden und direkt auf den Mikrocontroller schieben.
Sodale. Jetzt kann man das Programm zwar einfach auf den Controller schreiben, funktionieren würde das Reaktivlicht aber noch nicht. Erst müssen noch die Fuses eingestellt werden.
Fuses? Wasn das?
Grob gesagt sind das Bits mit denen ein Mikrocontroller konfiguriert wird. Man kann da z.B. die interne Frequenz, Schreibschutz, etc. festlegen. Hier verweise ich auf den Wikipedia-Eintrag der das ganz gut beschreibt.
Es sollten eingestellt werden:
- BODLEVEL 1V8 (hier wird festgelegt dass ab einer Spannung unter 1,8 Volt der Controller resettet wird und es zu keinen Fehlfunktionen kommt. Beim Reaktivlicht ist das eher ungefährlich, es gibt aber durchaus Schaltungen die dann durchdrehen können und wirres Zeug machen)
- WDT aus (hier wird festgelegt dass der interne Watch-dog Timer nicht dauerhaft an sein soll)
- CKDIV8 aus (der interne Takt muss nicht durch 8 geteilt werden, wir sind mit 128 KHz schon sehr weit unten)
- CKSEL 128 kHz, 64ms (hier wird der interne Takt auf 128 KHz festgelegt, die 64ms definieren die Einschwingzeit. Sprich, man gibt dem Controller 64 ms Zeit biss er stabil taktet)
Alle anderen Fuses so belassen wie in der Werkseinstellung!
Nun habe ich ja eingangs schon erwähnt dass man die Blinksequenz umprogrammieren kann. Dazu geht man wie folgt vor:
- programmiert wird tagsüber, also bei Licht
- Pin 5&6 oder eben den Jumper brücken
- Das Reaktivlicht beginnt 5x zu blinken
- Zum Umprogrammieren den Jumper oder die Brücke vor Blinkende abziehen
- Nun kann mit dem Jumper oder der Brücke die neue Sequenz einprogrammiert werden
- Um wieder zur Standard-Sequenz zu gelangen die Pins oder den Jumper über die 5x Blinken hinaus brücken und erst dann abziehen.
Und so schaut das ganze dann verbaut im PETling aus (in der ersten, hier gezeigten Version fehlt noch der Jumper, diesen habe ich mit Litze verlängert an das Ende des Batteriehalters gesetzt welches zum Schraubverschluss zeigt):
So, jetzt, wo ich den Artikel fertig geschrieben habe stelle ich fest dass es doch reichlich Text geworden ist und doch noch viele Fachbegriffe drin stehen. Um diese aber noch verständlicher zu schreiben hätte es noch mehr Text gebraucht. Ich glaube es ist einfacher ihr stellt bei Bedarf Fragen die ich dann beantworte.
Am Ende noch meine Quellen der Recherche und des benutzen Programms:
- reaktivlicht.de Eine sehr ausführliche Anlaufstelle die aber Grundwissen voraussetzt
- Geoclub Ein Forum für Geocacher in dem das benutzte Programm aus vielen Ideen entstanden ist
- die Zusammenfassung der Diskussion im Geoclub
- und natürlich Helge, den ich aber nicht verlinken kann 😉
Hallo Ulf,
vielen Dank für den interessanten Artikel. Als absoluter Neuling würde mich interessieren, wie die Leitungen zum Programmieradapter noch aussehen würden, wie kompliziert das Ganze wird?
Mit dem verlinkten Programmieradapter würde ich Leitungen vom Adapter dann zur fertig aufgebauten Schaltung temporär zum Programmieren anschließen, sehe ich das richtig?
Vielen Dank und Viele Grüße, Florence
Hallo Florence,
Ich habe mir für den Programmieradapter eine kleine extra Platine mit einem IC-Sockel gelötet in den ich die zu programmierenden Microcontroller einstecke. Nach dem Programmieren Controller raus ziehen und in das Reaktivlicht einlöten.
Man kann aber auch direkt in der Schaltung die Leitungen anlöten. Aber wie schon gesagt, mit der kleinen Hilfsplatine war es komfortabler.
Ich poste die Tage mal ein Bild zu der kleinen Platine