Ultrafire 502B Cree XML U2 - 改造完了(後編) 自転車けんちゃん

大学サークルで自転車に魅せられて30年以上たちました。 いまだにロングライドと言えば日の出から日の入りまで 走っています。

ホーム > 改造 - ライト > Ultrafire 502B Cree XML U2 - 改造完了(後編)

Ultrafire 502B Cree XML U2 - 改造完了(後編)

UltraFireの振動対策済み基板です。
パスコンの左側に10uFのセラミックコンデンサを2つ追加しました。
MCLRは赤のジャンパーでPICの4番ピンからパスコンのVDD側に接続しています。
ultrafire_20111218-1.jpg
久しぶりに細かい作業をしているとピントフリーズして
目がかすみます・・・・
歳ですかね・・・

ドヤ!開発を引退して8年ですがまだまだいけますね!
友人から「けんちゃん暇なの」って言われたりしてますが、
毎日毎日会社を定時であがってデバッグした甲斐がありました。
2時までデバッグして昼間の会議で落ちていたのは内緒です。

こちらがプログラムです。
3モード化や、明るさ、点滅の速度の変更は簡単にできます。
お好きな方はご自由にコピー、流用、改造してください。
(参考にしたよ~ってコメントいただけるとうれしいいです。)
#2011/12/13 追記
#このモード切替の手法はデバイス推奨の電圧以下でも
#SRAMの内容が残っていることを利用しています。そのため、
#blink_enable_flg=!blink_enable_flg;
#の行は消えかけのSRAMの内容をリフレッシュするために必須です。
#また別の記述に変更するとうまく動作しませんのでご注意ください。
#どうしてこの記述だけがうまく動作するのか、不思議です。^^;
#デバイスのバラつきによってはうまくモード切替できない
#ケースもあるかもしれません・・・

#2012/03/28
#Ultrafire 502B Cree XML U2 - 4-mode化改造もあわせてご覧ください。
#こちらにはさらに改良したプログラムがあります。

ソースコードはこちらです。
// ========================================================
// バージョン   1.0 (2011/12/17)
// デバイス     PIC12F675
// コンパイラ   HI-TECH C Compiler for PIC10-12-16 MCUs V9.83
// 作成者       自転車けんちゃん
// 仕様
//   UltraFireのLED制御回路
//   2モード(点灯、点滅)
//   点灯:5ms周期、デューティ40%のPWMでLEDを点灯
//   点滅:0.25秒周期で点滅(0.1秒ON,0.15秒OFF)
//
// クロックの設定
//   Clock          4MHz
//   命令           1us
//   プリスケーラ   プリスケーラOFF
//   タイマ0(TMR0) 250us(1us x 250 x 1)
//   PWM周期        5ms(250us x 20)
//
// I/Oポートの設定
//   GP0 (7 pin):PWM出力
//   GP1 (6 pin):NC  (WPU)
//   GP2 (5 pin):NC  (WPU)
//   MCLR(4 pin):MCLR(このピンはチップにWPU機能なし)
//   GP4 (3 pin):NC  (WPU)
//   GP5 (2 pin):NC  (WPU)

#include <htc.h>

// タイマ割込みの周期 250us(1カウント=1us)
// カウントアップ方式なので256-250を設定するただし、
// 割り込みにより再設定するので+アルファの調整が必要
#define TIMER_250us        (6+18)
// PWM点滅周期 5ms(=250us*20)
#define    PWM_5MS            20
// PWMのデューティ 40%(=8/20)
#define    PWM_DUTY40        8
// 点滅周期 0.25秒(=5ms*50)
#define    BLINK_FREQ        50
// 点滅のON期間 40%(=20/50)
#define BLINK_H_WIDTH    20

static unsigned char pwm_cnt;            // PWMの一周期(5ms)をカウント
static unsigned char pwm_h_cnt;            // PWMのHigh期間をカウント(1us/1カウント)
static            bit     pwm_h_flg;            // PWMのHigh期間を示すフラグ

static unsigned char blink_cnt;            // 点滅の一周期(1sec)をカウント
static unsigned char blink_h_cnt;        // 点滅のHigh期間をカウント(5ms/1カウント)
static unsigned char blink_h_width;        // 点滅のHigh期間の幅
static            bit  blink_h_flg;        // 点滅のHigh期間を示すフラグ

static            bit  t5ms_flg;            // 5ms周期で立つフラグ

static            bit  blink_enable_flg;    // 点滅モードを示すフラグ
//static            bit  blink_disable_flg;    // 点滅モードを示すフラグ

__CONFIG(
   FOSC_INTRCIO    // INTOSC oscillator, I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKI
 & WDTE_ON        // WDT enabled
// & WDTE_OFF        // WDT disabled
 & PWRTE_ON        // PWRT enabled (74ms reset)
 & MCLRE_ON        // // GP3/MCLR pin function is MCLR
 & BOREN_ON        // Brown-out Detect(BOD) enabled
// & BOREN_OFF        // Brown-out Detect(BOD) disabled
 & CP_OFF        // Program Memory code protection is disabled
 & CPD_OFF);    // Data memory code protection is disabled

// =================== 割り込み処理 ====================
static void interrupt ISR(void) {

    T0IF = 0;                        // TMR0割り込みクリア
    TMR0 = TIMER_250us;                // TIMERのリロード
    t5ms_flg = 1;                    // 5ms周期でmain関数にフラグを渡す

    if(!(--pwm_cnt)){                // -1してから0判定
                                    // PWMの1周期終了 次の設定を行う
        pwm_cnt = PWM_5MS;             // PWMの1周期カウンタを初期化
        pwm_h_cnt = PWM_DUTY40;     // PWMのHパルス幅を設定
        pwm_h_flg = 1;                 // PWMのH期間を示す

        if(!(--blink_cnt)){                    // -1してから0判定
                                            // 点滅の1周期終了
            blink_cnt = BLINK_FREQ;            // 点滅の1周期カウンタを初期化
            blink_h_cnt=blink_h_width;        // 点滅のパルス幅を設定
            blink_h_flg=1;                    // 点滅のH期間を示す
        }else{
            if(!(--blink_h_cnt)){            // -1してから0判定
                blink_h_flg=0;                // 点滅のH期間終了(カウンターはオーバーランする)
            }
        }

    }else{
        if(!(--pwm_h_cnt)){                    // -1してから0判定
            pwm_h_flg = 0;                    // PWMのH期間終了(カウンターはオーバーランする)
        }
    }

    GP0=pwm_h_flg & blink_h_flg;    // PWMがH期間かつ、点滅のH期間にONにする。
}
// ==================== ノイズに強くするために頻繁に再設定する値 ===========================
static void init_periodic(void) {
    // コンパレータの設定
    CMCON  = 0b00000111;
                        // 0 (COUT)
                        // 0 (CINV)
                        // 0 (CIS)
                        // 111 (CM=111:コンパレータOFF)
    // ADの設定
    ANSEL  = 0b00000000;// 0,000(Tad=2xTosc:2us),0000(AN3-0 OFF)
    ADCON0 = 0b00000000;
                        // 0  (ADFM 0:AD変換データ左詰め, 1:右詰め)
                        // 0  (VCFG 0:Vref=VDD, 1:Vref=Vref pin)
                        // 00 (NU 00:初期値)
                        // 00 (CHSx 00:アナログ入力ピンAN0, 00:AN0)
                        // 0  (GODONE 0read:変換終了 1read/write:変換スタート)
                        // 0  (ADON 0:ADC電源OFF, 1:ON)
    // I/Oの設定
    TRISIO = 0b00111110;// 00,111110(TRISIO5-0:GPIOの出力は0,入力は1)
    WPU    = 0b00111110;// 00,111010(WPU5-0:1でプルアップ,0で使わない)

    // WPUとタイマーの設定
    OPTION_REG = 0b00011000;
                        //0 (nGPPU  1:WPU使わない, 0:WPU使う)
                        //0 (INTEDG 1:INTピン立上がりエッジ, 0:立下り)
                        //0 (T0CS   1:タイマ0のクロックを外部クロック使用, 0:内部クロックを使用)
                        //1 (T0SE   1:タイマ0を外部クロックの立上がり同期, 0:立下り同期)
                        //1 (PSA    1:プリスケーラをWDTで使用, 0:タイマで使用)
                        //000 (PSx   (000:1/1 WDT プリスケーラ 18ms)

//    if(~blink_disable_flg){
    if(blink_enable_flg){
        blink_h_width = BLINK_H_WIDTH;    // 点滅の場合は周期の半分の値を設定
    }else{
        blink_h_width = BLINK_FREQ;        // 点灯の場合は周期と同じ値を設定
    }
}

// ==================== 起動時に1回だけ設定する値 ===========================
static void init_once(void) {

    TMR0 = TIMER_250us;    // TIMER周期 250us

    GP0 = 0;            // LED消灯

    T0IE = 1;            // TMR0割り込み許可
    GIE = 1;            // 全体割り込み許可
}

// ==================== メイン処理 ===========================
void main(void)    {

    blink_enable_flg  = !blink_enable_flg;  // 点滅モードを変更
//    blink_disable_flg = !blink_disable_flg; // 点滅モードを変更

    init_periodic();    // 周期的設定

    pwm_cnt   = 1;        //次の割り込みで初期化が発生する値
    blink_cnt = 1;        //次の割り込みで初期化が発生する値

    pwm_h_flg = 0;        // 最初の出力は0
    blink_h_flg = 0;    // 最初の出力は0

    init_once();        // 起動時設定

    CLRWDT();            // ウォッチドッグのクリア
    while(1) {
        init_periodic();    // 周期的設定

        if(t5ms_flg){        // 5ms間隔のpwm周期で実行
            t5ms_flg = 0;
            CLRWDT();        // ウォッチドッグのクリア
        }
    }
}
[ 2011/12/18 11:08 ] 改造 - ライト | TB(0) | CM(10)
わたしは501Bを搭載したのですが、
振動で勝手にモードが変わり、使い物になっていません。
対策は無いものかと検索し、ここへ来ました。
が・・・
なにがなんだかサーッパリ(^_^;)
5モードなんていりません。オンオフだけでもいいです。
ド素人でも出来る振動対策はなにかないでしょうか?
[ 2012/11/03 15:01 ] [ 編集 ]
振動対策
取手大王さん、こんばんは。

いろいろ試してみました。
電池が動かないようにすれば良いみたいですが、結局大きな段差を超えると切り替わったりしてうまくいきません。
半田ごて握ってエイヤーってやるしかないです。基本はコンデンサを追加するだけです。

KaidomainのFlashlight D.I.Y.に1モードの
モジュールがあるので試してみてはいかがでしょうか。1モードなら切り替わりません。
ただし、中華サイトは違うものが送られてきたり、品質が悪いことがあるので、3つ購入して2つぐらい壊れていたり届かなくてもても気にしないくらいのおおきな心が必要です。送料無料ですので、1個づつバラバラに発注・配送がお勧めです。

平日の夕方に五反田近辺に来れるのであれば、使っていないモジュールを1個あげます。
[ 2012/11/03 23:41 ] [ 編集 ]
コンデンサーを追加して、電気のタメ場を作っておくということなんですね。
コテすら持っていないので、モジュール入手に挑戦してみます。
それと、電池が暴れないような工夫を考えてみます。
[ 2012/11/04 10:43 ] [ 編集 ]
SMO Cree XML U2 1300 Lumen 3V~18V 1-Mode LED Drop-in
というのを見つけたのでポチッ!
しかし、入金のページは日本語だったので、そのまま日本語で入力。
かなりビビりです(^_^;)
[ 2012/11/04 12:09 ] [ 編集 ]
取手大王さん、こんばんは。

KDは海外(深圳・香港)サイトなので、住所等はローマ字の方が良いと思います。対応はどんどん改善しているのでKDに日本語が出来るスタッフがいるかもしれませんが、税関は日本語では対応できない可能性があります。

届くまでにおおよそ2~3週間かかります。

それから、この1モードは私は使ったことがありませんが、多分最大電流で駆動しますのでかなり熱くなります。走行中点灯は空冷されますので大丈夫と思いますが、停車して点けっぱなしにすると焼ききれるかもしれません。
[ 2012/11/04 21:40 ] [ 編集 ]
自動的に日本語ページになったのでプルダウンから選び「この言語でいいの?」みたいな部分はスルーでした(^_^;)
ビクビクしながら待ってみます。

発熱についてのアドバイスも参考になります。ありがとうございます。
一緒に搭載しているC8はモードが変わることも無くHiモードで使っていますが、
ランタイムより通勤時間のほうが長いのでほのかに暖かくなっている状態しか知りません。
信号などでの停車時はオフにするように習慣付けます。

それにしても、海外通販サイトって安いですね。
ご紹介くださったサイトの特売品(今は501とカスタマイズされたC8ですね)も欲しくなってしまいます。
なんの知識もなくフラッシュライトを搭載したので、少しづつ覚えて行きたいです。
[ 2012/11/05 00:42 ] [ 編集 ]
只今モジュールを交換し、点灯テスト中です。
温まってきたので止めました。
確かに1modeになりました。
後は、ホルダーが手元に無いので、買ってきて自転車に搭載して実験するのみです。

日本語のオーダーフォームからの注文でしたが、届きました。
実はあれから、言語を英語に切り替え
501b1mode完成品(カモフラ模様)を注文しました。発送したらしいので、
そのうち到着することを祈っています。
いろいろとアドバイスを頂き感謝しています!
ありがとうございますm(__)m
[ 2012/11/17 14:00 ] [ 編集 ]
取手大王さん、今晩は。
おお!届きましたか!結構早かったですね。

オーバーサイズのハンドルだとホルダーは悩みますよね。
私は、
台座にCG-901(アークスパン)(無理やり広げて取り付け)を使用して、
GENTOS(ジェントス) 閃 SG-355Bの本体は捨ててライトマウントだけ使用して、
Ultrafire 502Bを取り付けています。
[ 2012/11/17 20:07 ] [ 編集 ]
安物ホルダーのストックがあったのを思い出したので、
セットしたらゴム一枚カマしただけでピッタリでした(^O^)

でも、なんか、暗い・・・。
満充電ではない電池で光軸調整しているうちに、暖かさがなくなったので、電池が消耗したのでしょうか?
明日は出勤前からピストの整備と格納があるので自転車通勤できそうもないので、
明日帰宅後(我慢出来なければ今夜)に、満充電の電池で試してみます。
[ 2012/11/18 21:24 ] [ 編集 ]
取手大王さん、こんばんは。

買ったばかりの電池は自然放電しています。
そのためにすぐに無くなったのかもしれませんね。
満充電で約1.5時間です。
電池も真・偽いろいろありますので試してみると面白いです。

ライトマニアの深みに足を踏み入れているかもです。
[ 2012/11/18 23:19 ] [ 編集 ]
コメントの投稿













管理者にだけ表示を許可する
プロフィール

けんちゃん

Author:けんちゃん
東京在住、和歌山生まれ
自称、和田峠ニスト
中華カーボンと手組みホイールでシクロクロス参戦中