自転車用テールライト改造 その 3
実は前回のは基板の大きさが少し大きい(コンマ何ミリ)ので、電池を収めるときにムリをして接触不良を起こすみたいです。
自転車に付けて走行する事を考えると、振動で点かなくなったら都合が悪いですね。
という事で、基板を作る事にしました。 ただ道具は全て持っているのですが、基板レイアウトをプリンタで印刷して露光してエッチングする、というのが面倒だったので、手抜きして生基板を削って作る事にしました。
▼ 回路図と見比べながら極細のマジックで直接基板上に書き込む
で、これをどうするかと言うと、最初は線にカッターで切り込みを入れて、不要な銅箔部分にはんだごてを当てて剥ぎ取ってやろうと考えてました。
考えが甘かったです。剥げません。 いや、剥げない事はないけど、とてつもなくめんどくさい。
という訳で、ルーターで不要な部分を削るという作戦に出ました。
▼ ルーターセット
延べ 2 日間に渡って削った結果・・・
エッチング基板を作るより面倒だったとも言う。
これで振動に対する信頼度が格段に向上しました。
プログラムにも少し変更を加えました。 スイッチのチャタリング防止処理の追加と、消灯状態でボタンを押すと「ランダムフォー」から始まり、もう一回押すと「トリプルフラッシュ」という風に順番を変えて、もう一回押すと秒間 3 発の市販のライトと同じ「ノーマルフラッシュ」というのを追加、もう一回押すと消灯という風にしました。
;*********************************************
;
; 自転車用テールライト 3
;
; 2012/06/20 ver.1.2 ノーマルフラッシュモード機能追加
; 2012/06/19 ver.1.1
; 2012/05/26 ver.1(初版)
;
;
;
;*********************************************
list p=12f629
#include
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT; キャリブレーションデータ = 0x3430
;*********************************************#DEFINE SW_PUSH GPIO,4 ; スイッチ
#DEFINE IO_LEDOUT GPIO,2 ; LEDi EQU 0x20 ;ループカウンタ用変数
j EQU 0x21 ;ループカウンタ用変数
k EQU 0x22 ;ループカウンタ用変数F_MODE EQU 0x24 ; フラッシュモード用変数
; 0 = sleep
; 1 = ランダムフォー
; 2 = トリプルフラッシュ
; 3 = ノーマルフラッシュTMR_COUNTER EQU 0x25 ; タイマーカウンター変数
;---- 割り込み用
w_temp EQU 0x30
status_temp EQU 0x31ORG 0x000
GOTO INIT
;割り込みハンドラ
ORG 0x004
GOTO INTR;*********************************************
;初期化開始
INIT
CLRF INTCON ;全割込み禁止
;内部クロック補正
bsf STATUS,RP0 ;BANK=1
call 0x3ff
movwf OSCCAL
bcf STATUS,RP0 ;BANK=0
;割り込みを禁止
clrf INTCON
;コンパレータ使用禁止
movlw 0x07
movwf CMCON
;GPIO 入出力設定
bsf STATUS,RP0 ;BANK=1
movlw b'11111000';GPIO 0/1/2 を出力、4 をスイッチ入力にする
movwf TRISIO
; 内部プルアップ設定
MOVLW B'00000000' ;GPPU=0 プルアップ有効化
MOVWF OPTION_REG
MOVLW B'00010000' ;WPU4=1 GPIO4をプルアップ
MOVWF WPU ;
; ポート変化割り込み許可ポート設定
movlw b'00010000' ;GP4 を状態変化として使用
movwf IOCbcf STATUS,RP0 ;BANK=0
CLRF F_MODE ; フラッシュモードフラグリセット
; ポート変化割り込み有効、全割り込み有効(ただしタイマー割り込みはまだ始めない)
movlw b'10001000' ;
movwf INTCON ;;*********************************************
; メインループ
MAIN_LOOP
; フラッシュモード判断
MOVF F_MODE,W
SUBLW D'0' ; この値からWレジスタの値を引く
BTFSC STATUS,Z ; 0だったらZフラグがセットされる
GOTO SLEEP_MODE ; スリープモードへ移行MOVF F_MODE,W
SUBLW D'1' ; この値からWレジスタの値を引く =1?
BTFSC STATUS,Z ; 0だったらZフラグがセットされる
GOTO FLASH_RANDOMFOUR ; ランダムフォーモードへMOVF F_MODE,W
SUBLW D'2' ; この値からWレジスタの値を引く =2?
BTFSC STATUS,Z ; 0だったらZフラグがセットされる
GOTO FLASH_TRIPLE ; トリプルフラッシュモードへ
MOVF F_MODE,W
SUBLW D'3' ; この値からWレジスタの値を引く =3?
BTFSC STATUS,Z ; 0だったらZフラグがセットされる
GOTO FLASH_NORMAL ; ノーマルフラッシュモードへ
GOTO MAIN_LOOP; スリープモード
SLEEP_MODE
SLEEP ; スリープモード移行
NOP
GOTO MAIN_LOOP
;*********************************************
FLASH_RANDOMFOUR ;ランダムフォー
BSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYms
BSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'165' ;165ms遅延
movwf i
call DELAYms
BSF IO_LEDOUT
movlw d'99' ;99ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'132' ;132ms遅延
movwf i
call DELAYmsBSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'165' ;165ms遅延
movwf i
call DELAYms
GOTO MAIN_LOOP
FLASH_TRIPLE ;トリプルフラッシュ
BSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'66' ;66ms遅延
movwf i
call DELAYms
BSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'66' ;66ms遅延
movwf i
call DELAYmsBSF IO_LEDOUT
movlw d'33' ;33ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'250' ;トータル594ms遅延
movwf i
call DELAYms
movlw d'250'
movwf i
call DELAYms
movlw d'160'
movwf i
GOTO MAIN_LOOPFLASH_NORMAL
BSF IO_LEDOUT
movlw d'166' ;166ms遅延
movwf i
call DELAYmsBCF IO_LEDOUT
movlw d'166' ;166ms遅延
movwf i
call DELAYmsGOTO MAIN_LOOP
;*********************************************
;ミリ秒遅延ルーチン(1ms 〜 254ms まで)
;内部発振モード4Mhz用
;1命令サイクル = 1/4 クロック = 1x10^6 = 1/1,000,000 = 1μSDELAYms: ;ix1000サイクル
CLRW ;Wをクリア
ADDWF i,W ;メインルーチンでのミリ秒設定値 i を
MOVWF j ;ループカウンタ j にセットする
;---------------------------
DELAY1k: ;1000サイクルの遅延ループ
MOVLW d'249' ;ループカウンタkに249をセットする
MOVWF k
LOOP1k:
NOP
DECFSZ k,f
GOTO LOOP1k ;2+4x249-1
;---------------------------
DECFSZ j,f ;3xj+997xj=1,000xj
GOTO DELAY1k
RETURN ;メインルーチンに戻る;*****************************************
; 割り込み処理
;*****************************************
INTR
BCF INTCON,7 ; 二重割り込みを禁止; 割り込み前処理
MOVWF w_temp ;Wレジスタ退避
MOVF STATUS,w ;STATUS取り出し
MOVWF status_temp ;STATUS退避BTFSS INTCON,GPIF ; 発生源がピン変化割り込み?
GOTO INTR_END
; スイッチ入力割り込み処理開始 -------------------------
INTR_SW_CHANGE
; チャタリング回避処理
movlw d'2' ;2ms遅延(実験値)
movwf i
call DELAYms
BTFSC SW_PUSH ; スイッチが押された時だけ以下の処理を行う
GOTO INTR_END
INCF F_MODE,F ; SWフラグ+1
MOVF F_MODE,W
SUBLW D'4' ; この値からWレジスタの値を引く
BTFSC STATUS,Z ; 0だったらZフラグがセットされる
CLRF F_MODE ; フラグリセット
INTR_END
; 割り込み後処理
MOVF status_temp,w ;STATUSを戻す
MOVWF STATUS ;
SWAPF w_temp,f ;Wレジスタを戻す
SWAPF w_temp,w ;BCF INTCON,GPIF ; ピン変化割込みフラグクリア
BSF INTCON,7 ; 割り込み再許可RETFIE
END
で、完成してとりあえず自転車に取り付けてみたんですよ。 それが先先日ですか。
最近は残念なことに日が長くなり、暗くなる前に帰宅する日が続きました。 点灯させる機会が無くて、帰宅後に駐輪場に止めてその点滅を「フフフフっ♪」と一人楽しむばかり。
で、今日はちょっと遅くなったので「やったー今日はランダムフォーで帰ろっと♪」と自転車の後ろを見たら・・・
ないの・・・
土台しか残ってないの・・・
今日の記憶をさかのぼってみると・・・朝家を出るときは付いてたもんな・・・会社に着いた時は・・・記憶にない。
もし、通勤途中で落ちたのなら・・・あの時かな・・・トラックを避けようと歩道の段差を強引に越えた時に落ちたのかな・・・そう言えばカラカラて音がしたような・・・・むむむ!
とうとう一回も実走せず単 4 エネループもろとも失しちゃった。 せっかく今日の夜動画を撮ろうと思ってワクワクしてたのに。
頭に来たので次回、第 4 弾を作る事にします。