HTML5でスマートフォンからファービーとかテレビとかを操作する赤外線リモコンを!(1/2)

2014/05/22 7M4MON


まずは↓をご覧ください。 


ファービーをiPhone5Sからコントロールしています。赤外線アダプタをイヤフォンジャックに差し込み、
HTML5+CSS3+JavaScriptで作成したWEBページからファービーを操作できる赤外線コマンドを送信しています。

デモページはこちらです。audio要素でwave(48ksps, 8bit, stereo)をサポートしていないブラウザ(IE等)では動作しません。
(「応用編:リモコンを解析してテレビやカメラを操作する」はこちら。WAVEファイル作成のWebアプリは こちら。)

  1. ファービーとは
    “ファービー"とは1998年にアメリカで開発された電気仕掛けのぬいぐるみです。
    日本でも世紀末にTOMYから発売され、その愛くるしい容姿とつぶらな瞳で社会現象を起こしました。
    ブームが去り10年以上が経過した今でもヤフオクでの取引は活発で、700円くらいで手に入れる事が出来ます。
      
  2. どうやって操作するの?
    ファービーには赤外線入力があり、先人が解析したコマンドを送ることにより、任意の動作をさせることができます。
    (ただし、スリープからは解除されている必要があります。)
    用意されているコマンドは下記の16種類です。

    0000 - Hello  1000 - Hello
    0001 - Boo Koo-Doh / Sneeze 1001 - Wee-Tee / Sing
    0010 - Noh-Lah / Party 1010 - Noh-Lah / Dance 
    0011 - Who-Bye / Hide 1011 - Who-Bye / Hide
    0100 - Hello 1100 - Hello
    0101 - Loo-Loo / Joke 1101 - Twinkle Twinkle
    0110 - Mmm... OK 1110 - Noh-Lah / Dance
    0111 - Way-Loh / Tired 1111 - Way-Loh / Sleep


    詳しいことはここのページに書かれていますが、簡単に説明すると、

    「1」は2ms(厳密でなくても良い)の間に150〜200usのLEDの点灯を2回行う。「0」は1回のみ。
    例えば、「0101 - Loo-Loo / Joke」の場合、

    1.スタートビットとして「1」を送る。
  3. 2.「0101」を送る
    3.上のコマンドを反転した「1010」を送る。
    4.1〜3を6回送る。

    となります。
      
  4. 赤外線リモコンおよびアダプタについて
    赤外線リモコンは38kHzの搬送波を一定の時間でON/OFFさせることにより、コマンドを送っています。
    詳しいことはルネサスのページに記載されていますので、興味のある方はご一読ください。

    イヤフォンジャックに差し込む赤外線アダプタは↓です。


    19kHzの位相が180度ずれたステレオの音を再生すればLEDが交互に点滅し、38kHzの信号を送信することができます。

    このアダプタはスイッチサイエンスさんにキットがあります。

  5. WAVEファイルを作成する。(アプリを作る)
    リモートコントロールコマンドを送るためのWAVEファイルを作成するためのアプリを作成します。

    フォーマットは「48ksps、8bit、ステレオ」とします。
    Waveファイルフォーマットに関してはこちらを参考にしました。

    19kHz付近の音を作成する際は、使用するバイト数が少なければ少ないほどON/OFFの時間的分解能高くなるので有利です。
    サンプリング周波数を48kHzとすると、

    48kHz/2/5*4 = 19.2kHz

    ですので、5バイトで19.2kHz(ステレオで38.4kHz)が作成できます。
    具体的なバイト列は、

    0x80, 0x35, 0xF9, 0x07, 0xCB

    です。
    WAVEファイルのステレオフォオーマットは、LchとRchが交互に並んでいて、位相を180度ずらしたいので、

    0x80, 0x80, 0x35, 0xCB, 0xF9, 0x07, 0x07, 0xF9, 0xCB, 0x35

    というバイト列をヘッダの後に2バイトずつ並べていきます。
    38kHz丁度でなくても大丈夫ですが、外れるにしたがって赤外線センサーの感度が下がります。

    赤外線センサのf-d特性
    赤外線センサの周波数対感度特性


    なお、サンプリング周波数を44.1kHzとすると、44.1/7*6 = 37.8kHz なので、7バイト(0x80, 0x49, 0xE3, 0x04, 0xFC, 0x1D, 0xB7)必要です。
    ただし、iPhone5sではこのフォーマットは再生できないようでした。

    無音は0x80,0x80の連続です。

    ヘッダ部分は毎回の使い回しなので、先に用意しておきます。("WAVE_HEAD_48000_8BIT_STEREO"というファイル)
    これを最初に読み込み、ON/OFFの時間(実時間(マイクロ秒)/ 20.833 )が書かれているカンマ区切りの文字列を引数として
    WAVEファイルのバイト配列を作成します。

    ソースコードはこちら
    もともとはWindowsフォームアプリケーションだったのですが、せっかくなのでASP.NETに移植してみました

  6. ファービー用のWAVEファイルを作る
    4で作成したアプリに2で説明したデータ列を入れます。最小繰り返し単位が5バイトなので5の倍数でデータを作ります。
    ですので、「1」は「15,70,15,70」とし、「0」は「15,155」としました。
    よって、「0000 - Hello」は[(15,70,15,70,15,155,15,155,15,155,15,155,15,70,15,70,15,70,15,70,15,70,15,70,15,70,15,70)×6]となります。
    作成したWAVEファイルをオシロスコープで確認すると、希望通りの波形になっていました。

    btl.png  wavcom.png

  7. HTML5で操作用のページを作る
    audio要素とJavaScriptを使って作成したWAVEファイルを再生します。
    「iPad対応!HTML5 Audioで作るブラウザーピアノ」の記事を参考にしました。
    ボタンはCSSを使って見た目を整えてみました。
    赤外線アダプタを差しこみ、ボタンを押すとファービーを操作することが出来ます。
    デモページはこちらです。
    位相が逆なWAVファイルはイヤフォンからは再生できても本体のスピーカーからは音が出ないようなので
    こんな治具を作るといいと思います。
    ledjig

  8. 動作が遅いときは…
    外のサーバーだと読み込みまでに時間がかかるので、LAN内のサーバーで使うといいと思います。

  9. 次ページ:リモコンを解析してテレビを操作する