機能デザイン
自宅で使っているシーリングライトのリモコンで操作できること。
私の家にあるシーリングライトのリモコンHK9327Kはチャンネル設定ができるので、 一つのリモコンで複数の機器を独立して操作できます。ボタンがたくさん付いているリモコンもあるので、どちらのリモコンでも操作できるようにしました。 NEC方式とAEHA方式を認識できます。
私の家にあるシーリングライトのリモコンHK9327Kはチャンネル設定ができるので、 一つのリモコンで複数の機器を独立して操作できます。ボタンがたくさん付いているリモコンもあるので、どちらのリモコンでも操作できるようにしました。 NEC方式とAEHA方式を認識できます。
ハードウエア
メインの処理にはPIC12F675を使い、内蔵オシレータの4MHzで動作させます。
超高輝度LEDの電流制限は手抜きをしてCRDに任せました。緑のLEDは目の波長感度の関係で明るく見えるため、若干少なめの電流に抑えてあります。
リモコンの入力は割り込みが使えるGP2に接続します。GP3は入力専用ですが割り込みには使えないので接続しません。 GP4はINTOSC(GP4=I/O)とする事でデバッグLED用の出力ポートとして、INTOSC(GP4=CLKOUT)とする事で内蔵オシレータのキャリブレーションとして使います。 リモコンのコードを解析するために必要なタイマーは内蔵オシレータと同期しているので、受信精度を上げるためにクロックは正しく校正する必要があります。
Mini-USBのコネクタから給電を行い4.7Fのスーパーキャパシタに充電することで、電源が断たれても20~30分は点灯させることが可能です。 USBコネクタから電流が流れ出さないように保護用のダイオードもきっちり入れます。Ifが大きく取れてVfができるだけ低いものが良いでしょう。Vfは実測で0.3Vでした。
超高輝度LEDの電流制限は手抜きをしてCRDに任せました。緑のLEDは目の波長感度の関係で明るく見えるため、若干少なめの電流に抑えてあります。
リモコンの入力は割り込みが使えるGP2に接続します。GP3は入力専用ですが割り込みには使えないので接続しません。 GP4はINTOSC(GP4=I/O)とする事でデバッグLED用の出力ポートとして、INTOSC(GP4=CLKOUT)とする事で内蔵オシレータのキャリブレーションとして使います。 リモコンのコードを解析するために必要なタイマーは内蔵オシレータと同期しているので、受信精度を上げるためにクロックは正しく校正する必要があります。
Mini-USBのコネクタから給電を行い4.7Fのスーパーキャパシタに充電することで、電源が断たれても20~30分は点灯させることが可能です。 USBコネクタから電流が流れ出さないように保護用のダイオードもきっちり入れます。Ifが大きく取れてVfができるだけ低いものが良いでしょう。Vfは実測で0.3Vでした。
ソフトウエア
ソースリスト Ver.0.09
PWM制御
PWMのタイミング生成はTimer0割り込みを使います。通常Timer0の割り込みは256命令周期ですが、割り込みルーチン内でTimer0カウンタを192に書き換えることで割り込み周期を64命令に変更しています。
4MHzのクロックで動作しているので、1命令の時間は1us、Timer0のオーバーフローは64usになります。これ以上高速に割り込みをかけると、後述のリモコン受信割り込みが発生した場合に光量の変化が目立って逆効果になります。
PWMの分解能は各色7bit/128段階としたので1フレームは8.192ms、フレームレートは122fpsに相当するのでチラつきが目立ちにくくなっています。
PWMの分解能は各色7bit/128段階としたので1フレームは8.192ms、フレームレートは122fpsに相当するのでチラつきが目立ちにくくなっています。
リモコンコードのデコード
右の図は受光素子で受信される信号の概要です。NECとAEHAは信号のタイミングが異なるだけでデータの構造は全く同じです。
受光素子から出力される信号はPICのGP2/INTに入力しておき、立ち下げ割り込みを有効にしておきます。
そして、フリーランで動作させたTimer1を使って割り込みの時間間隔をカウントし、リモコンのタイプやリピートコードの判断を行います。
- 初回の割り込みが入るとTimer1をクリアします。
- 次の割り込みはリーダーが終わったところでかかるので、Timer1の値を見てリモコンのタイプとリピートの判断を行えます。 Timer1は1usごとにカウントアップするので粒度を荒くするためにTMR1Hのみで長さの判定を行います。すると、NECのリーダーは24T×562us÷256=52、AEHAのリーダーは12T×425us÷256=19となります。
- Timer1を再度クリアした後に次の割り込みが来ると、2Tまたは4Tのどちらかがカウントされている事になるのでビットが0か1を判断できます。 リモコンのタイプに応じて一定のビット数を読み込んだらチェックサムの照合などを経てデータバッファに入れて終了です。
- Timer1のオーバーフロー割り込みも有効にしておき、2度オーバーフローが発生(131ms)以内にリピートコードが出現すれば前回のデータを再利用するようにします。
ケースデザイン
LEDはレンズで光が集中しないように頭の部分をカットしてサンドペーパーで透明になるまで磨き、半透明のテープなどを貼り付けて光がむらなく拡散するようにします。
拡散キャップは意外と光量が減るので使いませんでした。
基板を収めるケースは東急ハンズで買った紙製のリングケースにリモコン用の穴を開けます。上部にはピンポン玉の一部分に丸い穴を開けてLEDの基板の上にかぶせてエポキシ接着剤で固定しました。
苦労した点と今後の展開
- PWMのリフレッシュレートを上げるためにTimer0の周期を工夫したところ。製作当初は60Hzで考えていたがとても使い物にならなかった。
- HSL色空間を使うために小数の計算をしなければいけなかった。気圧高度計で使った固定小数点演算と乗除算のルーチンを流用している。
- 円錐型の土台に球体が乗っているデザインにしたかったが、中空になっている円錐のケースが見つからなくて泣く泣く円柱形の土台になってしまった。
- ケースの外観を優先したので赤外線受光部の穴を大きく開けられなかった。リモコンの入射範囲に若干制限がある。
- ケースがプラスチックではないため固定がうまくできない。紙製なので汚れやすい。二度と外さない前提でホットボンドで固めてしまおうか…
- メモリに余裕があるので自動的に色相や輝度が変わったり、黒体放射のシミュレートができるようにしてみたい。
- プログラムを書き換えなくてもいろんなリモコンに対応できるようにするため、EEPROMからキー情報を読み込んで動作するようにしてみたい。
- 内蔵キャパシタのみで動作させると電圧低下に伴い青→緑→赤の順に光量が減るので、夕焼けみたいでとてもきれいだ。
- メーカー出荷時のOSCCALのキャリブレーション値は意外と誤差が大きい。AEHAは正しく受信するのにNECの反応が悪かったので、まさかと思いCLKOUTの周波数を見ると本来の周波数(1MHz)より低かった。