今回はCQカチャduino(WSN282)を8MHz、3.3V仕様にして乾電池2本で駆動できるようにしました。
●8HMz化
8MHz仕様にするには、クリスタルを16MHzから8MHzのものに交換し、ファームを書き換える必要があります。詳細はこちらを参照してください。↓
http://www.wsnak.com/wsnakblog/?p=94
今回は電源LED(向かって左側)も省いたものを別に用意しました。なお、デバッグなどの際は5Vで使っても全く問題ありません。WSN283(USB/電源部)もそのまま接続可能です。
8MHz版のWSN282電源LED、ICソケットは実装なし
●プログラム修正
キャリア波を出力している処理がクリティカルなため、ディレイ値を調整する必要があります。
修正したものを以下に示します。キャリア波の生成処理でパルス幅のディレイ値を修正しただけです。
/* アイリスオーヤマ LEDシーリングライト用赤外線リモコン評価 copyright (c) 2013 www.wsnak.com 13/10/20 新規作成 13/10/21 省電力試行 13/10/22 8MHz版 スイッチ入力によりコマンド切り替え メモリ点灯、消灯、全灯、常夜灯 */ /* ディジタル・ポート・アサイン スイッチポート D2-D5 IR発光(LED) D8 */ // ライブラリのリンク #include <wSwitch.h> // スイッチ用ライブラリ(w4Switch) #include <wCTimer.h> // タイマ・ライブラリ(wCtcTimer2A) #define ON HIGH #define OFF LOW #define IR_OFF digitalWrite(8, LOW); // IR LED(D7) #define IR_ON digitalWrite(8, HIGH); // IR LED(D7) // ライブラリのインスタンス生成 w4Switch sw; // スイッチオブジェクトの実体化 wCtcTimer2A tm; // タイマオブジェクトの実体化 // // 初期化 // void setup(void) { int i; tm.init(125); // タイマ初期化 sw.SwitchInit(2, 3, 4, 5); // SW用ポート定義 sw.onKeyPress(KeyPress); // スイッチが押された時に呼び出される関数の登録 pinMode(8, OUTPUT); // IR発光 (IR-LED) IR_OFF; // ペリフェラルのパワーダウン TIMER0とTIMER2を除く PRR = (1<<PRTWI) | (1<<PRTIM1) | (1<<PRSPI) | (1<<PRUSART0) | (1<<PRADC); } // // リモコン コマンド出力 // void irOut(byte sw) { int i, k; // (C) for(i = 0; i < 74; i++) { IR_ON; delayMicroseconds(6); IR_OFF; delayMicroseconds(6); } delay(1); // ********* リピート部分 ************ for(k = 0; k < 3; k++) { // 共通部分 // (D) for(i = 0; i < 205; i++) { IR_ON; delayMicroseconds(6); IR_OFF; delayMicroseconds(5); } delay(1); pulseB(); // (E) pulseA(7); pulseB(); // 共通部分終わり // コマンド依存部分 switch(sw) { case 0: // 消灯 pulseA(4); pulseB(); pulseA(19); pulseB(); pulseA(1); pulseB(); pulseB(); pulseB(); pulseB(); pulseA(1); pulseA(1); break; case 1: // メモリ点灯 pulseA(6); pulseB(); pulseA(17); pulseB(); pulseA(1); pulseB(); pulseB(); pulseA(1); pulseB(); pulseB(); pulseA(1); break; case 2: // 全点灯 pulseA(3); pulseB(); pulseA(20); pulseB(); pulseA(1); pulseB(); pulseA(2); pulseB(); pulseA(2); break; case 3: // 常夜灯 pulseA(5); pulseB(); pulseA(18); pulseB(); pulseA(1); pulseB(); pulseB(); pulseA(4); break; } delay(9); } } // // パルス(A)出力 // void pulseA(int n) { int i, j; for(j = 0; j < n; j++) { for(i = 0; i < 19; i++) { IR_ON; delayMicroseconds(5); IR_OFF; delayMicroseconds(5); } delayMicroseconds(520); } } // // パルス(B)出力 // void pulseB(void) { int i; // for(i = 0; i < 57; i++) { for(i = 0; i < 55; i++) { IR_ON; delayMicroseconds(4); IR_OFF; delayMicroseconds(5); } delayMicroseconds(520); } // // メインループ // void loop(void) { if(tm.checkTimeup()) { // 8ms周期 sw.KeyProc(); // キーセンス処理 } } // // キー入力ハンドラ // スイッチが押された時に呼び出される関数 // void KeyPress(byte keyval) { switch(keyval) { case 1: // SW1(上) メモリ点灯 irOut(1); break; case 3: // SW3(下) 消灯 irOut(0); break; case 2: // SW2(右) 全灯 irOut(2); break; case 4: // SW4(左) 常夜灯 irOut(3); break; } }
遠目で見て、ちょうどよい形になりました。ロジアナ測定のハードコピーを載せておきます。上から順に、製品リモコンの出力波形、16MHz版の自作リモコンの出力波形、8MHz版の自作リモコンの出力波形です。
●LEDドライブ回路
電源電圧が下がる関係で、赤外線LEDに流れる電流が減ります。今回は、既に付いている47Ωの抵抗器にさらに並列に47Ωの抵抗器を付けて47//47=23.5Ωにしました。
●エネループで駆動
単三型のエネループで試してみました。2個直列で実測電圧2.7Vのとき、リモコンのアイドル状態(非スリープ)で2.6mAまで下がりました。アイドル時は関係ありませんが、赤外線LED発光確認用のLEDは外しました。
すこし、LEDを向ける方向がクリティカルになったような気もしますが、問題無く作動しました。
●そのほか
スリープの件はまだペンディングですが、スイッチのプルアップ抵抗器の抵抗値を大きくして電流を減らせばもう少し下がると思います。
赤外線LED周りは抵抗値を調整するとか、もう一組LEDを付けるとか改造の余地があると思います。なお、LEDを並列に接続する場合は、LEDのA、Kそれぞれを直接接続してはいけません。かならず、一方は電流制限用抵抗器を通したところで接続するようにしてください。
トランジスタを使っているので、マージン込で7~80mAぐらいは流せます。