あむちょです。
今回はPICマイコンでルームランプを電子制御させます。
ことの発端はルームランプを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年以上前のことなので、回路もコードも
覚えてないからよくわからん
[ad][ad]