調光式LEDルームランプの自作
あむちょです。
今回はPICマイコンでルームランプを電子制御させます。
ことの発端はルームランプをLEDに交換したところ爆光になってくそ眩しかったので調光してやろうと思い立ちました。
完成品の動画
それにしてもYoutubeは動画置き場に最高ですね。サーバーの容量を使わないで済みます。
目次
ルームランプを交換
シャトル純正のルームランプは貧相です。

ステップワゴン純正のサングラスホルダー付きルームランプに交換。

一部カッターナイフで広げれば取り付けれます。

後部座席ルームミラー付き。

中にいれるのは誰がつけてもおもしろくなるジャンレノ風丸型サングラスです。
[amazonjs asin=”B001MIK7BQ” locale=”JP” title=”(セレンディップス) sdps スタンダード 丸メガネ サングラス Silver/black”]
ハードウェア
流れとしては電圧が12vあるのでFETでLEDをPWM制御で調光してやります。
使ったLEDはこれ
[amazonjs asin=”B00RK709TI” locale=”JP” title=”24*SMD5050 LED ルームランプ”]
PWM制御とは目にわからない程度に高速でオンオフ点滅させ、オンとオフの時間比率を変えることで出力を変化させる制御です。
LEDのような電圧に比例して明るさが変化させにくいような物を制御したりする時に使われます。
回路図はありません。

FETはトランジスタで駆動。
[amazonjs asin=”B010ZKWUH0″ locale=”JP” title=”Pch パワーMOS FET 2SJ681 60V5A 2個セット”]
逆流防止にダイオードいれとかないと両方同時についてしまいます。
わざわざArduinoを使うのはもったいないので、安いとこだと100円ぐらいのpic12f629を使います。
[amazonjs asin=”B00RGDL6FW” locale=”JP” title=”PICマイコン<PIC12F629-I/P> 2個<icd-050>”]
内部クロックがついてるので、5v用レギュレータを付けるだけで済みます。
マイクロスイッチを取り付けて元々付いてるスイッチが作動する手前でマイクロスイッチが作動するように位置を調整してあります。

ソフトウェア
PICマイコン用Cコンパイラは高いのでアッセンブラーでプログラムを書きました。
マイクロスイッチが押されたら数ミリ秒待ってまだ押されてたら長押しと判定し、PWMの比率を変更させて明るさを変えます。
スイッチが離されたら明るさをEEROMに書き込んで保存してます。
起動時にEEROMを読み取って前回の明るさを出力してます。
ソースコードはこちら
LIST P=PIC12F629
INCLUDE P12F629.INC
__CONFIG _INTRC_OSC_NOCLKOUT & _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _MCLRE_OFF
;***************_int_register_**************************************
time equ H'20'
cnt1 equ H'21'
cnt2 equ H'22'
cnt3 equ H'23'
cnt4 equ H'24'
cnt_pwm equ H'25'
cnt_off equ H'26'
temp equ H'27'
save_pwm equ H'28'
dec_flag equ H'29'
cnt_stop equ H'2a'
;*******************************************************************
org H'00'
goto SETUP
;***************_warikomi_******************************************
org H'04'
retfie
;***************_setup_*********************************************
SETUP
bsf STATUS,RP0
call H'3ff'
movwf OSCCAL
movlw B'00000100' ;2_input
movwf TRISIO
movlw B'00000000' ;pulup_enable
movwf OPTION_REG
bcf STATUS,RP0
clrf GPIO
movlw B'00000111' ;dejital I/O
movwf CMCON
;******** read eeprom and set cnt_pwm *****************
bsf STATUS,RP0
movlw 0x1a ; EEPROM adress
movwf EEADR
bsf EECON1,RD
movf EEDATA,0
movwf save_pwm
bcf STATUS,RP0
call WAIT10M
call WAIT10M
bcf dec_flag,0
;movlw D'3'
;movwf cnt_stop
movlw D'91'
subwf save_pwm,0
btfss STATUS, C
goto MAIN
bsf dec_flag,0
movlw D'95'
movwf save_pwm
goto MAIN
;***************Main***************************
MAIN
btfss GPIO,2
goto INPUT_CHANGE
call PWM
goto MAIN
INPUT_CHANGE
movlw D'3'
movwf cnt_stop
;btfsc GPIO,2
;goto MAIN
CHANGE_PWM
movf cnt_stop,1
btfsc STATUS,Z ;0>1
goto CNT_UP_DOWN
decfsz cnt_stop,1
goto DO_PWM
CNT_UP_DOWN
movlw D'30'
subwf save_pwm,0
btfss STATUS, C
movlw D'1'
movlw D'5'
btfsc dec_flag,0
goto DECRI
goto INCRI
DO_PWM
call PWM
btfss GPIO,2
goto CHANGE_PWM
;******* write eeprom ********
bsf STATUS,RP0
movlw 0x1a
movwf EEADR
movf save_pwm,0
movwf EEDATA
bsf STATUS, RP0
bcf INTCON, GIE ;
bsf EECON1, WREN
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1, WR
bsf INTCON, GIE
bcf STATUS,RP0
WAIT_WRITE
btfss PIR1,EEIF ; end of write
goto WAIT_WRITE
bsf STATUS,RP0
bcf EECON1, WREN
bcf STATUS,RP0
bcf PIR1,EEIF
goto MAIN
INCRI
addwf save_pwm,f
movlw D'91'
subwf save_pwm,0
btfss STATUS, C
goto DO_PWM
bsf dec_flag,0
movlw D'95'
movwf save_pwm
movlw D'5'
movwf cnt_stop
goto DO_PWM
DECRI
subwf save_pwm,f
movlw D'2'
subwf save_pwm,0
btfsc STATUS,C
goto DO_PWM
bcf dec_flag,0
movlw D'1'
movwf save_pwm
movlw D'5'
movwf cnt_stop
goto DO_PWM
;**************pwm***********************
PWM ;save_pwm max99
movf save_pwm,0
movwf temp
movlw D'255'
movwf time
WIDTH
movf temp,0
movwf cnt_pwm
movlw D'100'
movwf cnt_off
movf temp,0
subwf cnt_off,1
bsf GPIO,1
bsf GPIO,0
WAIT_ON
decfsz cnt_pwm
goto WAIT_ON
bcf GPIO,1
bcf GPIO,0
call WAIT_OFF
decfsz time,1
goto WIDTH
return
;***************wait_off_time**********
WAIT_OFF
decfsz cnt_off
goto WAIT_OFF
return
;******************_1ms_*******************************************
WAIT1M
movlw D'255'
movwf cnt1
TIMLP1
nop
decfsz cnt1,1
goto TIMLP1
nop
nop
return
;******************_10ms_(10.036ms)**********************************
WAIT10M
movlw D'10'
movwf cnt2
TIMLP2
call WAIT1M
decfsz cnt2,1
goto TIMLP2
return
;******************_50ms_(50.156ms)**********************************
WAIT50M
movlw D'50'
movwf cnt3
TIMLP3
call WAIT1M
decfsz cnt3,1
goto TIMLP3
return
;*******************_1s_(1.000755)***********************************
WAIT1S
movlw D'250'
movwf cnt4
TIMLP4
call WAIT1M
call WAIT1M
call WAIT1M
call WAIT1M
decfsz cnt4,1
goto TIMLP4
return
;**********************_kousei_*************************************
org H'3ff'
retlw H'50';3450
end
これで完成です。たぶん80段階ぐらい調光できます。
作ったのが1年以上前のことなので、回路もコードも
覚えてないからよくわからん
[ad][ad]