調光式LEDルームランプの自作

あむちょです。

今回はPICマイコンでルームランプを電子制御させます。

PR アプリ作ってます

ことの発端はルームランプをLEDに交換したところ爆光になってくそ眩しかったので調光してやろうと思い立ちました。

完成品の動画

それにしてもYoutubeは動画置き場に最高ですね。サーバーの容量を使わないで済みます。

目次

ルームランプを交換

シャトル純正のルームランプは貧相です。

シャトルルームランプ

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

ステップワゴンルームランプ

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

ルーフ加工

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

後部座席ミラー

中にいれるのは誰がつけてもおもしろくなるジャンレノ風丸型サングラスです。

ハードウェア

流れとしては電圧が12vあるのでFETでLEDをPWM制御で調光してやります。

使ったLEDはこれ

PWM制御とは目にわからない程度に高速でオンオフ点滅させ、オンとオフの時間比率を変えることで出力を変化させる制御です。

LEDのような電圧に比例して明るさが変化させにくいような物を制御したりする時に使われます。

回路図はありません。

回路

FETはトランジスタで駆動。

逆流防止にダイオードいれとかないと両方同時についてしまいます。

わざわざArduinoを使うのはもったいないので、安いとこだと100円ぐらいのpic12f629を使います。

内部クロックがついてるので、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年以上前のことなので、回路もコードも

覚えてないからよくわからん

コメント