ドリームライト

製作:2016年1月~2016年3月
執筆:2016年3月9日
全景 3色カラーのLEDを使ったインテリア用の照明で、PhilipsのHueのようなものを3,000円ぐらいで作れます。 赤外線リモコンを使って209万色の色をコントロールします。

機能デザイン

リモコン 自宅で使っているシーリングライトのリモコンで操作できること。
私の家にあるシーリングライトのリモコンHK9327Kはチャンネル設定ができるので、 一つのリモコンで複数の機器を独立して操作できます。ボタンがたくさん付いているリモコンもあるので、どちらのリモコンでも操作できるようにしました。 NEC方式とAEHA方式を認識できます。

リモコン 色は感覚的に選べるようにする。
RGBの強度を単純に指定するのではなく、HSL色空間(色相・彩度・輝度)を使って感覚的に選びやすく配慮しました。 HSV色空間ではなくHSL色空間を使う理由は、彩度の高い色からさらに明るくしたペールトーンを選びやすくするためです。 ちなみにWindows標準のカラーピッカーで採用されている方式はHSVです。
参考)
HSL色空間Wikipedia
HSV色空間Wikipedia

ハードウエア

回路図 メインの処理には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でした。

ソフトウエア

ソースリスト Ver.0.09

PWM制御

PWM PWMのタイミング生成はTimer0割り込みを使います。通常Timer0の割り込みは256命令周期ですが、割り込みルーチン内でTimer0カウンタを192に書き換えることで割り込み周期を64命令に変更しています。 4MHzのクロックで動作しているので、1命令の時間は1us、Timer0のオーバーフローは64usになります。これ以上高速に割り込みをかけると、後述のリモコン受信割り込みが発生した場合に光量の変化が目立って逆効果になります。
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)以内にリピートコードが出現すれば前回のデータを再利用するようにします。
リモコンの受信中はTimer0・INT・Timer1の割り込みが入り乱れてPWMのタイミングが変動するため、LEDの明るさが微妙に変化します。PWMの分解能やフレームレートを上げると顕著になります。

ケースデザイン

LEDはレンズで光が集中しないように頭の部分をカットしてサンドペーパーで透明になるまで磨き、半透明のテープなどを貼り付けて光がむらなく拡散するようにします。 拡散キャップは意外と光量が減るので使いませんでした。 基板を収めるケースは東急ハンズで買った紙製のリングケースにリモコン用の穴を開けます。上部にはピンポン玉の一部分に丸い穴を開けてLEDの基板の上にかぶせてエポキシ接着剤で固定しました。

苦労した点と今後の展開