Ultrafire C3 - XM-L2 U2化改造 自転車けんちゃん

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

ホーム > 改造 - ライト > Ultrafire C3 - XM-L2 U2化改造

Ultrafire C3 - XM-L2 U2化改造

自転車用に最も軽量で、最も明るいライトと言えばUltrafire C3でしょう。
このライトを最強LED XM-L2 U2に変更してみましょう。
XM-L2 U2は、XML U2とほぼ同じですが、若干明るく光るように作られています。

XML U2とXM-L2 U2の見た目の違いですが、
LEDの丸いドームの周囲が銀色になっています。
ultrafire_20131214-7.jpg

こちらは改造したライト。自作のひさし付き。
ultrafire_20131214-6.jpg

改造ベースとなるライトは
Ultrafire C3 Cree Q3 6-Mode LED Flashlight (14500) Kaidomain
ただし、このライトはコピー品でかつドライバー基板が頻繁に変わる。
今回購入したライトの基板はこちら。
ultrafire_20131214-1.jpg ultrafire_20131214-2.jpg
14500専用のはずなのに、昇圧回路がついている。
多分単3電池でも点灯可能なのだろう。
昇圧回路はロスがあるので外すことにする。

上の6pin SOT-23パッケージは捺印が無い。PICの模造品のようだ。

改造にはPIC10F322を使用する。
ultrafire_20131214-4.jpg
米粒サイズなので半田付けが面倒です。

書き込み用にソケットも用意した。
ultrafire_20131214-3.jpg

こちらは改造箇所の説明。
ultrafire_20131214-5.jpg
①②③:ジャンパー
④:47uf100uFのコンデンサ追加
⑤⑥:パタンカット
⑦:PICは自作プログラム版に交換

改造に使用したPIC10F322は米粒大なのに機能豊富です。
PWM、ADC、NCO、CWG・・・
機能多すぎです。結局、汎用I/Oと割り込みのみでプログラム作成しました。

#2013/12/16
#注意点:
#このライトはいろんなところが接触不良になりやすい
#一度接触不良になるとその場所を特定するのは結構手間がかかります。
#それもあわせて楽しむ余裕が必要です。
#接触不良箇所の直し方はまた別途・・・

PICのソースコードはこちらです。
お好きな方はご自由にコピー、流用、改造してください。
(参考にしたよ~ってコメントいただけるとうれしいです。)
// ========================================================
// バージョン   1.6 (2013/12/11)
// デバイス     PIC10F322
// コンパイラ   HI-TECH C Compiler for PIC10-12-16 MCUs V9.83
// 作成者       自転車けんちゃん
// 仕様
//   UltraFireのLED制御回路
//   4モード(点滅、Low-Mid-High点灯)
//   点滅:0.25秒周期で点滅(0.035秒ON,0.215秒OFF)
//   Low点灯 :5ms周期、デューティ20%のPWMでLEDを点灯
//   Mid点灯 :5ms周期、デューティ30%のPWMでLEDを点灯
//   High点灯:5ms周期、デューティ40%のPWMでLEDを点灯
//
// クロックの設定
//   Clock                    :4MHz
//   命令                        :1us
//   プリスケーラ        :プリスケーラOFF
//   タイマ0(TMR0)    :250us(1us x 250 x 1)
//   PWM周期                :5ms(250us x 20)
//
// I/Oポートの設定
//   PORTA3 (6 pin):NC  (WPU)
//   PORTA2 (4 pin):NC  (WPU)
//   PORTA1 (3 pin):NC  (WPU)
//   PORTA0 (1 pin):PWM出力

#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) 80%(=16/20)
#define    PWM_DUTY20        4
#define    PWM_DUTY30        6
#define    PWM_DUTY40        8
#define    PWM_DUTY60        12
#define    PWM_DUTY80        16
// 点滅周期 0.25秒(=5ms*50)
#define    BLINK_250MS        50
// 点滅のON期間 100%=(50/50) 20%(=10/50)
#define BLINK_DUTY100    50
#define BLINK_DUTY20    10
#define BLINK_DUTY14    7
// 点滅のMODE
#define MODE_BLINK        0
#define MODE_LOW            1
#define MODE_MID            2
#define MODE_HIGH            3

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

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

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

unsigned char mode;                    // 点灯モード
bit           mode_b0_flg;    // 点灯モードのbit0
bit           mode_b1_flg;    // 点灯モードのbit1

__CONFIG(
   FOSC_INTOSC  // INTOSC oscillator: CLKIN function disabled
 & BOREN_ON     // Brown-out Reset enabled
 & WDTE_ON      // WDT enabled
 & PWRTE_ON     // PWRT enabled
// & MCLRE_ON     // MCLR pin function is MCLR
 & MCLRE_OFF    // MCLR pin function is digital input, MCLR internally tied to VDD
 & CP_OFF       // Program memory code protection is disabled
 & LVP_OFF      // High-voltage on MCLR/VPP must be used for programming
 & LPBOR_OFF    // LPBOR disabled
 & BORV_LO      // Brown-out Reset Voltage (VBOR) set to 2.4 V
 & WRT_OFF);    // Write protection off

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

    TMR0 = TIMER_250us;                // TIMERのリロード
    TMR0IF = 0;                                // TMR0割り込みクリア

    if(!(--pwm_cnt)){                    // -1してから0判定
        t5ms_flg = 1;                        // 5ms周期でmain関数にフラグを渡す
                                                        // PWMの1周期終了 次の設定を行う
        pwm_cnt = PWM_5MS;             // PWMの1周期カウンタを初期化
        pwm_h_cnt = pwm_h_width;// PWMのHパルス幅を設定
        pwm_h_flg = 1;                    // PWMのH期間を示す
    }else{
        if(!(--pwm_h_cnt)){            // -1してから0判定
            pwm_h_flg = 0;                // PWMのH期間終了(カウンターはオーバーランする)
        }
    }

    PORTA0=pwm_h_flg & blink_h_flg;    // PWMがH期間かつ、点滅のH期間にONにする。
}
// ==================== ノイズに強くするために頻繁に再設定する値 ===========================
void init_periodic(void) {
    // オシレータ制御
    OSCCON = 0b01010000;
                // 0 (NU)
                // 101 4MHz
                // 0000 (Read only)
    // I/Oの設定
    ANSELA = 0b00000110;
                // 00000,110(ANSA2-0:デジタル入力は0,デジタル入力は1)
    TRISA  = 0b00000110;
                // 00000,110(TRISA2-0:I/Oの出力は0,入力は1)
    WPUA   = 0b00001110;
                // 0000,1110(WPUA3-0:1でプルアップ,0で使わない)

    // WPUとタイマーの設定
    OPTION_REG = 0b01011111;
                //0 (nWPUEN 1:WPU使わない, 0:WPU使う)
                //1 (INTEDG 1:INTピン立上がりエッジ, 0:立下り)
                //0 (T0CS   1:タイマ0のクロックを外部クロック使用, 0:内部クロックを使用)
                //1 (T0SE   1:タイマ0を外部クロックのH->L同期, 0:L->H同期)
                //1 (PSA    1:プリスケーラ非アクティブ, 0:タイマで使用)
                //111 (PSx   (111:1/256 プリスケーラ)
    // ウォッチドッグタイマ制御
    WDTCON = 0b00001010;
                // 00    (NU)
                // 00101 (WDTPS  00101:32ms)
                // 0     (SWDTEN このビットは無視される)

    if(mode==MODE_HIGH){                    // High点灯のパラメータ設定
        blink_h_width = BLINK_DUTY100;// 点灯の場合は周期と同じ値を設定
        pwm_h_width   = PWM_DUTY40;        // PWMのHパルス幅を設定
    }else if(mode==MODE_MID){            // MID点灯のパラメータ設定
        blink_h_width = BLINK_DUTY100;// 点灯の場合は周期と同じ値を設定
        pwm_h_width   = PWM_DUTY30;        // PWMのHパルス幅を設定
    }else if(mode==MODE_LOW){            // LOW点灯のパラメータ設定
        blink_h_width = BLINK_DUTY100;// 点灯の場合は周期と同じ値を設定
        pwm_h_width   = PWM_DUTY20;        // PWMのHパルス幅を設定
    }else{                                                // 点滅のパラメータ設定
        blink_h_width = BLINK_DUTY14;    // 点滅の場合は点灯期間の長さを設定
        pwm_h_width   = PWM_DUTY30;        // PWMのHパルス幅を設定
    }
}

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

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

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

    TMR0 = TIMER_250us;    // TIMER周期 250us

    PORTA0 = 0;                // LED消灯

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

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

    // モード記憶用変数のリフレッシュ
    // この記述が無いとSRAMの内容は破壊されます。
    mode_b0_flg  = !mode_b0_flg;
    mode_b0_flg  = !mode_b0_flg;

    mode_b1_flg  = !mode_b1_flg;
    mode_b1_flg  = !mode_b1_flg;

    if(!nPOR){
        // Power On リセットの時は点滅に設定
        mode_b0_flg  = MODE_BLINK&1;
        mode_b1_flg  = (MODE_BLINK>>1)&1;
    }else{
        //modeの個別ビットを一つの変数modeに変換
        mode = mode_b0_flg | (mode_b1_flg <<1 );
        //modeをインクリメント
        mode++;
        mode&=3;
        //mode変数を個別のビットに分解して格納
        mode_b0_flg=(mode&1)?1:0;
        mode_b1_flg=(mode&2)?1:0;
    }
    nPOR=1;    //Power On リセットフラグをクリア

    init_periodic();    // 周期的設定

    init_once();            // 起動時設定

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

        if(t5ms_flg){        // 5ms間隔のpwm周期で実行
            t5ms_flg = 0;
            CLRWDT();            // ウォッチドッグのクリア

            if(!(--blink_cnt)){                    // -1してから0判定
                                                                    // 点滅の1周期終了
                blink_cnt = BLINK_250MS;    // 点滅の1周期カウンタを初期化
                blink_h_cnt=blink_h_width;// 点滅のパルス幅を設定
                blink_h_flg=1;                        // 点滅のH期間を示す
            }else{
                if(!(--blink_h_cnt)){            // -1してから0判定
                    blink_h_flg=0;                    // 点滅のH期間終了(カウンターはオーバーランする)
                }
            }
        }
    }
}
[ 2013/12/14 20:03 ] 改造 - ライト | TB(0) | CM(0)
コメントの投稿













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

けんちゃん

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

カテゴリ