Fahrrad-Rücklicht mit Reaktiv-Modus


von Martin Müller  
Elektronik-Labor   Projekte   AVR 



Letztens gab es beim Discounter eine LED-Fahradbeleuchtung. Während die Frontlampe einen ganz guten Eindruck macht, so ist das batteriebetriebene Rücklicht insgsamt nicht wirklich überzeugend. Fünf recht helle LEDs werden mittels eines kleinen Tastschalters eingeschaltet und nehmen bei 3 Volt Versorgungsspannung satte 130 mA auf. Da kann man leicht überschlagen wie lange oder besser wie kurz die zum Betrieb vorgesehenen zwei AAA-Zellen durchhalten werden.  Noch dazu lassen sich die besagten LEDs lediglich ein- bzw. ausschalten. Auch wenn es natürlich nicht konform mit der StVZO ist, so kann man doch etwas mehr Aufmerksamkeit durch den einen oder anderen Blinkmodus oder gar den Reakiv-Modus erreichen. Und dabei sinkt die Stromaufnahme sogar in den Bereich von ca. 5 bis 15 mA.



Zunächst einmal habe ich mich zur Verwendung (noch hellerer?) LEDs entschieden. Bei Pollin gibt es für wenig Geld im Zehnerpack unter der  Bestellnummer 120437 rote, superhelle (13000 mcd) LEDs. Für die vorgestellte Modifikation werden davon 3 Stück benötigt. Wahrscheinlich kann man aber auch mit gutem Erfolg die vorhandenen LEDs weiterverwenden.

Angesteuert werden die LEDs von einem Tiny 13, der vorhandene Tastschalter wird an der selben Stelle durch einen geeigneten Taster ersetzt. Die verwendeten Schutzwiderstände sind ebenso wie die verbauten Kondensatoren in SMD-Ausführung gewählt und befinden sich auf der Kupferseite der passgenau bearbeiteten Punktrasterplatine.



Der Schaltplan des modifizierten Rücklichts gestaltet sich auch denkbar einfach. Der Taster an Pin 6 wird u.a. dazu benutzt den Tiny, dessen Taktrate auf 128 Khz gefused ist, mittels INT0 aus dem Powerdown-Modus zu erwecken. Bei jeder erneuten Betätigung des Tasters (die Abfrage erfolgt immer am Ende des jeweiligen „Blinkzyklus“) wird in das nächste „Programm“ umgeschaltet, bis man erneut im Powerdown-Modus angekommen ist.


Erwähnenswert ist noch, dass die LEDs, wenn eingeschaltet, in einer Art Software-PWM betrieben werden. Dies senkt zum einen die Stromaufnahme drastisch, und verringert mögliche Schäden beim versehentlichen, direkten Hineinschauen in die Lichtquelle.
Der bei diesem Rücklicht realisierte Reaktiv-Modus ist eine Anleihe aus  der Geocaching-Szene.
http://reaktivlicht.pbworks.com/w/page/3708758/FrontPage

In der hier vorgestellten Umsetzung leuchtet die mittlere LED ständig. Etwa einmal pro Sekunde wird sie für wenige Millisekunden ausgeschaltet. Dann misst die an Pin 7 angeschlossene LED quasi als Fotoelement via A/D-Wandler die Umgebungshelligkeit. Ist dieser gemessene Wert um einen bestimmten (im Programm einstellbaren) Betrag höher als der Wert der vorherigen Messung (weil z.B. besagte LED von einem Autoscheinwerfer angestrahlt wird) werden alle drei LEDs für ca. 10 Sekunden angeschaltet.

Das Gerät in Aktion: http://youtu.be/_ydLIyIvQRI

 Download: Ruecklicht.zip

$regfile = "ATtiny13.DAT"
$crystal = 128000 'Frequenz des internen 128kHz-Oszillators

$hwstack = 10 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 10 'default use 40 for the frame

Config Portb = &B11011101                       'Portb.1.5auf 'Eingang' schalten
Portb = &B00100010                              'Pullups Portb.1.5 zuschalten

Config Adc = Single , Prescaler = Auto , Reference = Internal 'Referenzspannung Des Adc Auf "Internal" = 1,1 V

Config Int0 = Rising
On Int0 Auswahl 'INT0 konfiguriren, wird nur benutzt um Powerdown zu beenden
Enable Int0

Dim Zaehler As Byte
Dim Impuls As Byte
Dim Wert1 As Word
Dim Wert2 As Word
Dim Schwelle As Word
Dim Anzahl As Byte

Wert1 = 1023

Stop Adc
Stop Ac

Anfang:

Gosub Ehufums
Enable Interrupts
Portb = &B00100010
Powerdown
Disable Interrupts
Zaehler = 1

Eineled:

For Impuls = 1 To 25
Portb = &B00100011
Gosub Funfms
Portb = &B00100010
Gosub Funfms
Next Impuls

Goto Pruefen


Blinkeineled:

For Impuls = 1 To 25
Portb = &B00100011
Gosub Funfms
Portb = &B00100010
Gosub Funfms
Next Impuls
Gosub Zhufums

Goto Pruefen


Dreiled:

For Impuls = 1 To 25
Portb = &B00110111
Gosub Zweims
Portb = &B00100010
Gosub Achtms
Next Impuls

Goto Pruefen


Blinkdreiled:

For Impuls = 1 To 25
Portb = &B00110111
Gosub Zweims
Portb = &B00100010
Gosub Achtms
Next Impuls
Gosub Zhufums

Goto Pruefen


Doppelblitz:

For Impuls = 1 To 15
Portb = &B00110110
Gosub Funfms
Portb = &B00100010
Gosub Funfms
Next Impuls
Gosub Ehufums

For Impuls = 1 To 15
Portb = &B00110110
Gosub Funfms
Portb = &B00100010
Gosub Funfms
Next Impuls
Gosub Zhufums

For Impuls = 1 To 50
Portb = &B00100011
Gosub Funfms
Portb = &B00100010
Gosub Funfms
Next Impuls
Gosub Dhufums

Goto Pruefen

Geo:

Portb = &B00100010

For Impuls = 1 To 100
Portb.0 = 1
Gosub Zweims
Portb.0 = 0
Gosub Achtms
Next Impuls

Start Adc

Config Portb.2 = Input 'Spannung an LED messen
Portb.2 = 0
gosub FUNFMS
Wert2 = Getadc(1)
Stop Adc

Config Portb.2 = Output
Portb.2 = 0

Schwelle = Wert1 + 75 'Schwelle (75 heller als Signal)festlegen, je kleiner so empfindlicher

If Wert2 > Schwelle Then

For Anzahl = 1 To 10 '3 LED für 10 Sekunden
For Impuls = 1 To 100
Portb = &B00110111
Gosub Funfms
Portb = &B00100010
Gosub Funfms
Next Impuls
Next Anzah

End If

Wert1 = Wert2 'Wert2 nach Wert1 verschieben

Goto Pruefen


Pruefen: 'Programmauswahl mit "Entprellung"

If Pinb.1 = 0 Then
Incr Zaehler
End If

Pruefena:
If Pinb.1 = 0 Then
Goto Pruefena
End If

If Zaehler > 6 Then
Zaehler = 0
End If

If Zaehler = 0 Then
Goto Anfang
End If

If Zaehler = 1 Then
Goto Eineled
End If

If Zaehler = 2 Then
Goto Blinkeineled
End If

If Zaehler = 3 Then
Goto Dreiled
End If

If Zaehler = 4 Then
Goto Blinkdreiled
End If

If Zaehler = 5 Then
Goto Doppelblitz
End If

If Zaehler = 6 Then
Goto Geo
End If

'Zeiten
Dhufums:
Waitms 100
Zhufums:
Waitms 100
Ehufums:
Waitms 142
Achtms:
Waitms 3
Funfms:
Waitms 3
Zweims:
Waitms 2
Return

Auswahl:
nop
Return

End


26.6.14: Überarbeitung von  Peter Krueger



Ausführliche Beschreibung des Projekts: Ruecklicht-V1.pdf





Download: Ruecklicht-V1.zip


Nachtrag: Pegelgetriggerter Interrupt, von Ralf Beesner

Ich habe die Schaltung erst jetzt ausprobiert, weil mich die Probleme mit dem PowerDown-Modus neugierig gemacht hatten. Dass die von Martin Müller entwickelte Rücklicht-Software nicht wie vorgesehen startet, kann ich bestätigen; die Software verharrt im PowerDown, wenn man die Interrupt-Leitung auf Low zieht.

Ursache ist, dass flankengetriggerte Interrupts im PowerDown-Modus schlicht nicht funktionieren, denn sie sind auf den Prozessortakt angewiesen (siehe Datenblatt), und der wird im PowerDown-Modus deaktiviert. Man darf nur den pegelgetriggerten Interrupt nutzen, indem man

Config Int0 = Rising
durch
Config Int0 = Low Level

ersetzt und (wie Martin das bereits vorgesehen hat) den Interrupt möglichst rasch abschaltet, denn pegelgetriggerte Interrupts werden wiederkehrend erzeugt (alternativ könnte man auch "PinChange Interrupts" verwenden).

Die Überarbeitung von Peter Krueger löst das Problem jedoch auf unelegante Weise, denn im Idle-Modus verbraucht der Mikrocontroller nun mal einige hundert µA, die auf Dauer die Batterie leeren. Damit ist auch die Frage von Peter (siehe Anfang seines Quelltextes) beantwortet: 0,1 µA lassen sich nur im Powerdown-Modus erreichen.

Zu seinem zweiten Problem, dass bei "Waitms 3" nur 450 µs Wartezeit "herauskommen": Vermutlich ist der Attiny nicht auf 128 kHz Takt umgefust, sondern läuft noch mit 1,2 MHz, während im Quellcode "$crystal = 128000" steht. Bascom berechnet dann die Timings falsch.

28.6.14: Revision der Revision  von Martin Müller:  RuecklichtRevision.pdf


30.6.14: Überarbeitete Version 2, von Peter Krüger RuecklichtV2.zip

Problemlösung:
Config Int0 = Low Level. Lösung von Ralf Beesner, vielen Dank Ralf! Nach compilieren und down load funktionierte das Rücklicht auf Anhieb!

Geschwindigkeit Blinkrate:
Ich verwendete einen neuen T13V. Defaultmäßig war der T13 mit 1.2 MHz und 1V8-BrownOut gefused. Die Blinkrate war deshalb etwa 8 mal höher als in der Originalversion. Auf den Hinweis von Martin, fusde ich den T13 über dem Downloadtool LPmikroISP.exe auf 128kHz Die Bitte von Martin: Config Int0 = Rising mit Clk = 128kHz ausprobieren: Resultat: Kein Wake Up! Wieder zurück: Config Int0 = Low Level Die LED's blinken jetzt deutlich langsamer. Messung mit Oszi: 1ms = 1ms. Die schnellere Blinkrate gefiel mir persönlich besser, deshalb wieder auf 1.2 MHz gefused. Jetz startete der T13 mit einer U-B-Spannung = 2V65 nicht mehr.

Frage an Herr Kainka: Beim fusen mit dem Downloadtool LPmikroISP.exe wurde der BrownOut auf 2V7 gefused, richtig ? Welches einfache Fusing-Tool verwenden Sie um auch den BrownOut zu setzen ?
Antwort: Richtig, wenn ich besondere Einstellungen brauche verwende ich immer das STK500.

'Original-Version: rucklichtlx.bas, Fahrrad-Rücklicht mit Reaktiv-Modus, von Martin Müller 09.04.2012.
'Änderunge: Ruecklicht-V2.bas / Peter Krueger, 28.06.2014
'Verwendeter uController:ATtiny13V-10PU (UB-min:1V8, UB-max:5V5)
'U-Bat. = 2V65: Strombedarf im "Powerdown" Mode = 0,113uA
'Zeile 22: Reference = "Avcc" Eine rote LED bringt im Dämmerlicht bereits eine Spannung von fast 1V (max 1V5)
'bei einer Ref von 1V1 wäre die ADC-Wandlung schon am Anschlag > 1023, die ADC-Reglschleife nicht mehr wirksam
'Zeile 26: Config Int0 = Low Level. Lösung von Ralf Beesner, vielen Dank Ralf!
'Zeile 129: Portb = &B00101010 'PB3.1, Start Zeitfenster LED1 = Input, Start Helligkeit messen
'Zeile 139: Portb = &B00100010 'PB3.0, Ende Zeitfenster LED1 = Input, Ende Helligkeit messen

$regfile = "ATtiny13.DAT" 'T13V Fuse: 1.2 MHz, BrownOut = 1V8
$crystal = 150000
'1ms Zeitverzögerung im Programmablauf entspricht jetzt: 150kHz / 1.2MHz = 125us
'Eine Blinkrate Faktor 8 mal höher als die Originalversion von Martin gefällt mir persönlich besser

$hwstack = 10 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 10 'default use 40 for the frame

Config Portb = &B11011101 'Portb.1.5 auf 'Eingang' schalten
Portb = &B00100010 'Pullups Portb.1.5 zuschalten

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Avcc: UB-potenzial / Internal: Adc Auf "Internal" = 1,1 V


Config Int0 = Low Level 'Danke für den Hinweis von Ralf Beesner !
On Int0 Auswahl 'INT0 konfigurieren, wird nur benutzt um Idle (Powerdown) zu beenden
Enable Int0


Dim Zaehler As Byte
Dim Impuls As Byte
Dim Wert1 As Word
Dim Wert2 As Word
Dim Schwelle As Word
Dim Anzahl As Byte

Wert1 = 1023

Stop Adc
Stop Ac

Anfang:
Gosub 142ms
Enable Interrupts
Portb = &B00100010
Powerdown ' Im Powerdeown Mode: 0,134uA !!
Disable Interrupts
Zaehler = 1

Eineled:
For Impuls = 1 To 25
Portb = &B00100011
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls

Goto Pruefen

Blinkeineled:
For Impuls = 1 To 25
Portb = &B00100011
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls
Gosub 100ms

Goto Pruefen

Dreiled:
For Impuls = 1 To 25
Portb = &B00110111
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls

Goto Pruefen

Blinkdreiled:
For Impuls = 1 To 25
Portb = &B00110111
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls
Gosub 100ms

Goto Pruefen

Doppelblitz:
For Impuls = 1 To 15
Portb = &B00110110
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls
Gosub 142ms

For Impuls = 1 To 15
Portb = &B00110110
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls
Gosub 100ms

For Impuls = 1 To 50
Portb = &B00100011
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls
Waitms 100

Goto Pruefen

Geo:
Portb = &B00100010
For Impuls = 1 To 100
Portb.0 = 1
Gosub 3ms
Portb.0 = 0
Gosub 3ms
Next Impuls

Portb = &B00101010 'PB3.1, Start Zeitfenster LED1 = Input, Helligkeit
Config Portb.2 = Input 'Spannung an LED messen
Waitms 3
'Portb.2 = 0
Start Adc
Wert2 = Getadc(1)

Stop Adc
Config Portb.2 = Output
Portb.2 = 0
Portb = &B00100010 'PB3.0, Ende Zeitfenster LED1 = Input, Helligkeit

Schwelle = Wert1 + 40 'Schwelle (100 heller als Signal)festlegen, je kleiner so empfindlicher

If Wert2 > Schwelle Then

For Anzahl = 1 To 100 '3 LED für etwa 8 Sekunden
For Impuls = 1 To 100
Portb = &B00110111
Gosub 3ms
Portb = &B00100010
Gosub 3ms
Next Impuls
Next Anzahl

End If

Wert1 = Wert2 'Wert2 nach Wert1 verschieben

Goto Pruefen


Pruefen: 'Programmauswahl mit "Entprellung"

If Pinb.1 = 0 Then
Incr Zaehler
End If

Pruefena:
If Pinb.1 = 0 Then
Goto Pruefena
End If

If Zaehler > 6 Then
Zaehler = 0
End If

If Zaehler = 0 Then
Goto Anfang
End If

If Zaehler = 1 Then
Goto Eineled
End If

If Zaehler = 2 Then
Goto Blinkeineled
End If

If Zaehler = 3 Then
Goto Dreiled
End If

If Zaehler = 4 Then
Goto Blinkdreiled
End If

If Zaehler = 5 Then
Goto Doppelblitz
End If

If Zaehler = 6 Then
Goto Geo
End If

'Zeiten
100ms:
Waitms 100
142ms:
Waitms 142
3ms:
Waitms 3
Return

Auswahl:
Nop
Return

End


Elektronik-Labor   Projekte   AVR