Vervangprint LED fietsachterlicht

Zondagmiddag mini project

Ik ergerde me er aan dat ik bij het inschakelen van de LED verlichting van de fiets steeds eerst door de diverse looplicht programma's moest lopen door drie maal op een toets te drukken om bij het "LED's continu aan" programma te komen.
Bovendien heb ik een paar keer vergeten de LED verlichting uit te schakelen en trof ik de volgende dag flauw brandende LED's en bijna lege batterijen aan.
Ik weet het, de oplossing voor genoemde problemen ligt waarschijnlijk ook wel bij de fietshandel, maar ik had zin om iets met een kleine SMD PIC te maken.
Dus even een vervangprintje met bewegingssensor, mini LDR en PIC gemaakt met daarin een PIC programma zodat het achterlicht naar eigen wens is te programmeren.
 

8

8 Het achterlicht met vervangingsprint.
Ga met de muis op de foto staan om de print te verwijderen.

 

Als bewegingssensor is hier een hellingsschakelaar gebruikt die horizontaal in de lamp is gemonteerd.
Het balletje dat er binnenin ligt rolt als de fiets beweegt en zal steeds contact maken of juist verbreken.

Nieuwe batterijen laten de LED's goed fel branden.
Bij een test met bijna lege batterijen (in serie samen nog zo'n 1,6V spanning leverend) bleek dat de PIC nog steeds werkt (de LED's branden dan behoorlijk flauw).
De PIC schakelt bij deze lage spanning de verlichting iets eerder aan op hetzelfde schemerniveau dan met volle batterijen.
Het rode glaasje dat er voor komt te zitten heeft weinig invloed op de LDR, mét glaasje gaan de LED's iets eerder aan, met de opgegeven waarde in het programma is hier al rekening mee gehouden.


De schakelaar op GPIO.3 (B.3) is de originele toets van het achterlicht, geëtst op de print.
Op GPIO.1 zit de hellingschakelaar die hier als bewegingssensor fungeert.

 


PIC Basic

Het onderstaand PIC Basic programma van het achterlicht laat de LED's branden als de fiets beweegt én het donker of schemerig is.
Bij daglicht blinkt alleen de middelste LED eenmalig 50mSec als de fiets beweegt nadat het een tijdje niet had bewogen.
Elke 20 seconden wordt de LDR gemeten en afhankelijk of het donker of licht is de LED's in- of uitgeschakeld.
Als het achterlicht 60 seconden geen beweging meer detecteert, worden eventueel brandende LED's uitgezet en valt de PIC in slaap (low power mode).
Bij het inleggen van de batterijen of een druk op de (originele) toets gaat er eenmalig een looplichtje lopen ten teken dat de PIC goed opstart en valt daarna meteen in slaap om de batterijen te sparen.
Met de (originele achterlicht) toets is de PIC te resetten.

PIC Basic programmeurs kunnen het achterlicht zelf naar smaak programmeren.
In onderstaand programma is de originele druktoets ingesteld als resettoets, maar het staat vrij om MCLR uit te schakelen (achter CONFIG MCLRE_ON veranderen in MCLRE_OFF), en er bijvoorbeeld een gewone aan/uit functie aan te geven, of er een programmakeuzetoets van te maken.

Ook de mini LDR is naar eigen behoefte te programmeren.
In bovenstaand PIC Basic programma gaan alle drie LED's tegelijk aan als het schemerig of donker is (en de fiets beweegt) en weer uit als het buiten licht genoeg is.
Maar je kunt het ook in stappen doen door bijvoorbeeld eerst alleen de middelste LED te laten branden, als het dan donkerder wordt nog een LED erbij en als het heel donker is alle drie LED's aan.

Verder kun je de scantijd van de LDR aanpassen (door dit bijvoorbeeld om de 15 seconden te doen als de fiets nét beweegt), en na een tijdje dit te verlagen naar om de paar minuten.

Natuurlijk zijn diverse dim en looplichteffecten ook mogelijk, maar mag officieel niet volgens de wet.

;           PIC12F629/675:              +--v--+
;                                   +5V [     ]  GND
;                                 LED2 <[     ]< LDR
;                                 LED3 <[     ]< Hellingschakelaar (interne pull-up)
;    Toets (met externe 100k pull-up!) >[     ]> LED1
;                                       +-----+
;www.picbasic.nl / Frits Kieftenbelt, Raalte, Netherlands (Frizie)

DEVICE 12F629                 ;Er wordt een 12F629 8-pins SMD PIC gebruikt
REMINDERS OFF
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, BODEN_OFF, PWRTE_ON, MCLRE_ON
REMINDERS ON
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

'SET_OSCCAL                   ;Bij een nieuwe, lege PIC deze SET_OSCCAL regel activeren...
'OSCCAL = ???                 ;...anders hier OSCCAL waarde invullen en deze regel activeren

;Logische constanten
SYMBOL AAN          = 0       ;Geinverteerd ON
SYMBOL UIT          = 1       ;Geinverteerd OFF

;Algemene constanten
SYMBOL AntiDender   = 10      ;mSec: Antidendertijd voor hellingschakelaar
SYMBOL MaxTijd      = 60      ;Sec : Tijd voorbij zonder verandering hellingschakelaar, slapen
SYMBOL MaxTijdLDR   = 20      ;Sec : Stel tijd voor meten met LDR in
SYMBOL Schemer      = 160     ;BYTE: Hoe hoger getal, hoe donkerder LDR moet zijn, voor LED's

;Programmaconstanten
;Registernamen (zie voor info hierover de datasheet van de 12F629 / 675, kijk bij INTCON)
SYMBOL GPIF         = INTCON.0;Bit 0 van INTerrupt CONtrol register heet: GP Interrupt Flag
SYMBOL GPIE         = INTCON.3;Bit 3 van INTCON register: GPIO Port change Interrupt Enable
SYMBOL GIE          = INTCON.7;Bit 7 van INTCON register: Global Interrupt Enable

;Poortnamen
SYMBOL LDR          = GPIO.0  ;Kijkt of het donker genoeg is om de LED's aan te zetten
SYMBOL HellingSchak = GPIO.1  ;Start schakelaar (bij beweging veranderd niveau)
SYMBOL LED1         = GPIO.2
SYMBOL Toets        = GPIO.3  ;Poort heeft geen inwendig pull-up, daarom weerstand op print
SYMBOL LED3         = GPIO.4
SYMBOL LED2         = GPIO.5

;Variabelen declareren
;WORD
DIM TijdBeweging    AS WORD   ;Meet hoe lang de fiets (al niet meer) in beweging is
DIM TijdLDR         AS WORD   ;Zorgt ervoor dat om de zoveel tijd de LDR gemeten wordt
;BYTE
DIM Licht           AS BYTE   ;Licht bevat het helderheidsniveau van het daglicht
DIM BD1             AS BYTE   ;Byte Dummy 1
;BIT
DIM VorigeStand     AS BIT    ;Geheugenbit voor vergelijking van hellingschakelaarniveau

'PORTB_PULLUPS ON             ;Voor de optocoupler (wordt gedaan door WPU en OPTION_REG.7
CLEAR                         ;Wis alle RAM geheugen

;         76543210
GPIO   = %00110000            ;Alleen LED1 aan ('0' = LED aan, '1' = LED uit)
TRISIO = %11001011            ;GPIO.5, GPIO.4 en GPIO.2 als uitgang voor LED's
IOC    = %00000010            ;Interrupt On Change voor GPIO.1 (hellingschakelaar)
WPU    = %00000010            ;Individual weak pull-up voor GPIO.1 (hellingschakelaar)
OPTION_REG.7 = 0              ;Pull-ups nu mogelijk (afhankelijk welke met WPU zijn ingesteld)

DELAYMS 500
LED1 = UIT                    ;Looplichteffect bij inleggen batterijen (PIC opstart controle)
LED2 = AAN
DELAYMS 500
LED2 = UIT
LED3 = AAN
DELAYMS 500

GIE  = 0                      ;Global Interrupt Enable uitgeschakeld
GPIE = 1                      ;GPIO Port change Interrupt Enable inschakelen


Uitzetten_LED:
LED1 = UIT
LED2 = UIT
LED3 = UIT
VorigeStand = HellingSchak    ;Controle voor antidender (na SLEEP)
BD1  = GPIO                   ;Lees "this will end the mismatch" in de datasheet
GPIF = 0                      ;Dit bit moet altijd door de software gereset worden
SLEEP                         ;Breng PIC in slaapmode (met hellingschakelaar uit slaap halen)

DELAYMS AntiDender            ;Ontdenderingstijd voor de toets
IF HellingSchak = VorigeStand THEN Uitzetten_LED ;Antidender, glitch geweest?

LED2 = AAN                    ;Bij daglicht knippert de middelste LED heel even bij bewegen
DELAYMS 50                    ;Tijd van middelste LED

TijdBeweging = MaxTijd        ;Zet tijd die fietsbeweging meet op maximaal
WHILE 1 = 1
  LED1 = UIT                  ;LED's uit voor meting LDR...
  LED2 = UIT                  ;...(= donkerder + geen extra stroomopname tijdens meting)
  LED3 = UIT
  DELAYMS 10                  ;LED's heel kort uitzetten zodat LDR het daglicht kan meten
  Licht = POT LDR, 140        ;Meet helderheid van LDR met functie POT

  IF Licht > Schemer THEN     ;Gemeten daglicht groter dan 'Schemer'? Dan...
    LED1 = AAN                ;...kort na elkaar LED's aanzetten
    DELAYMS 10
    LED2 = AAN
    DELAYMS 10
    LED3 = AAN
  ENDIF

  TijdLDR = MaxTijdLDR        ;Sec: Stel tijd voor meten met LDR in
  REPEAT
    FOR BD1 = 1 TO 250        ;250 x 4mSec = 1 seconde lus
      IF HellingSchak <> VorigeStand THEN ;Niveau van hellingschakelaar veranderd? Dan...
        VorigeStand  = HellingSchak       ;Nieuwe stand aan bit 'VorigeStand' doorgeven
        TijdBeweging = MaxTijd            ;Zet tijd weer op maximaal
      ENDIF
      DELAYMS 4               ;Meet hellingschakelaar elke 4 mSec
    NEXT
    
    DEC TijdBeweging          ;Verlaag tijdteller van hellingschakelaar bewegingsmeting
    IF TijdBeweging = 0 THEN Uitzetten_LED ;Fiets al tijdje niet bewogen? Dan LED's uitzetten
    
    DEC TijdLDR               ;Verlaag tijdteller van LDR lichtmeting
  UNTIL TijdLDR = 0           ;Tijd op 0? Tijd om LDR lichtniveau te meten
WEND

Ikzelf heb het achterlicht tegen diefstal moeilijk verwijderbaar aan de fiets gemonteerd en laat deze continu aan de fiets zitten.
Bovenstaand PIC Basic programma is dus niet geschikt als het achterlicht steeds uit de houder wordt genomen en in een jaszak wordt gestoken want dan zal het achterlicht steeds aan gaan.
In dat geval zul je het PIC Basic programma moeten wijzigen naar jouw situatie.

Om de SMD PIC te kunnen programmeren (ICSP) moet de print tijdelijk op 5V worden aangesloten, de LED's branden dan wel veel te fel, dus niet te lang op 5V laten branden.
Tijdens het programmeren van de PIC moet de hellingschakelaar geopend zijn en mag het LDR niet al te veel licht ontvangen, anders weigert de PIC programmer de PIC te programmeren.

Vergeet niet vóór het compileren eerst óf de SET_OSCCAL regel te activeren, óf een waarde op te geven voor OSCCAL = ??? en dan deze regel te activeren (beide regels staan er nu nog als REM regel).
Meer info over SET_OSCCAL

Het IOC (Interrupt On Change) wordt alleen gebruikt om de PIC uit zijn slaap te halen.
Meer info over IOC

Een voordeel van PIC Basic functie POT t.o.v. een ADC komt hier ook van pas.
Als de LDR met een ADC gemeten zou moeten worden, dan moet de LDR in serie met een weerstand tussen de + en GND worden geschakeld.
Niet erg fijn voor batterijvoeding, want dit blijft stroom opnemen, ook als de PIC slaapt (dat kan wel weer opgelost worden maar dat zou je een poort extra kosten).
De functie POT neemt per meting alleen stroom op om een 100n condensator op te laden en afhankelijk van de LDR, de tijd te meten dat deze de condensator zich via de LDR laat ontladen waardoor de lichtintensiteit op de LDR is uit te maken.
Als de PIC slaapt of niet bezig is met functie POT, neemt het LDR gedeelte geen stroom op.

Meer info over de werking van functie POT
Meer info over functie POT in cursus deel 5
 

De 150808 print heeft verscheidene SMD componenten, waaronder de PIC 12F629.
Controleer eerst of de maat van de print overeenkomt met de originele print van het achterlicht.
De LED's van de originele print kunnen worden overgezet naar de vervangingsprint.
In serie met elke LED zit een SMD weerstand van 10Ω.

 

Download FIETSLED.HEX, V-1 bestand om in een PIC 12F629 te programmeren
Download schema als PDF bestand
Printlayout 150808 + componentwaarden 50 × 10 mm >> Afdruk tips <<
Bestel geprogrammeerde PIC