Ich bau mir ein Reaktivlicht

LEDEin 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.

Reaktivlicht_Breadboard

Die Schaltung dazu schaut so aus:

Reaktivlicht_Schaltplan

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):

Reaktivlicht

Reaktivlicht

Reaktivlicht

 

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 😉

2 Gedanken zu „Ich bau mir ein Reaktivlicht

  1. 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

  2. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.