HTML5でスマートフォンからファービーとかテレビとかを操作する赤外線リモコンを!(1/2)
2014/05/22 7M4MON
まずは↓をご覧ください。
ファービーをiPhone5Sからコントロールしています。赤外線アダプタをイヤフォンジャックに差し込み、
HTML5+CSS3+JavaScriptで作成したWEBページからファービーを操作できる赤外線コマンドを送信しています。
デモページはこちらです。audio要素でwave(48ksps, 8bit, stereo)をサポートしていないブラウザ(IE等)では動作しません。
(「応用編:リモコンを解析してテレビやカメラを操作する」はこちら。WAVEファイル作成のWebアプリは こちら。)
- ファービーとは
“ファービー"とは1998年にアメリカで開発された電気仕掛けのぬいぐるみです。
日本でも世紀末にTOMYから発売され、その愛くるしい容姿とつぶらな瞳で社会現象を起こしました。
ブームが去り10年以上が経過した今でもヤフオクでの取引は活発で、700円くらいで手に入れる事が出来ます。
- どうやって操作するの?
ファービーには赤外線入力があり、先人が解析したコマンドを送ることにより、任意の動作をさせることができます。
(ただし、スリープからは解除されている必要があります。)
用意されているコマンドは下記の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」を送る。
2.「0101」を送る
3.上のコマンドを反転した「1010」を送る。
4.1〜3を6回送る。
となります。
- 赤外線リモコンおよびアダプタについて
赤外線リモコンは38kHzの搬送波を一定の時間でON/OFFさせることにより、コマンドを送っています。
詳しいことはルネサスのページに記載されていますので、興味のある方はご一読ください。
イヤフォンジャックに差し込む赤外線アダプタは↓です。
19kHzの位相が180度ずれたステレオの音を再生すればLEDが交互に点滅し、38kHzの信号を送信することができます。
このアダプタはスイッチサイエンスさんにキットがあります。
- 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丁度でなくても大丈夫ですが、外れるにしたがって赤外線センサーの感度が下がります。
赤外線センサの周波数対感度特性
なお、サンプリング周波数を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に移植してみました。
- ファービー用の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ファイルをオシロスコープで確認すると、希望通りの波形になっていました。
- HTML5で操作用のページを作る
audio要素とJavaScriptを使って作成したWAVEファイルを再生します。
「iPad対応!HTML5 Audioで作るブラウザーピアノ」の記事を参考にしました。
ボタンはCSSを使って見た目を整えてみました。
赤外線アダプタを差しこみ、ボタンを押すとファービーを操作することが出来ます。
デモページはこちらです。
位相が逆なWAVファイルはイヤフォンからは再生できても本体のスピーカーからは音が出ないようなので
こんな治具を作るといいと思います。
- 動作が遅いときは…
外のサーバーだと読み込みまでに時間がかかるので、LAN内のサーバーで使うといいと思います。
- 次ページ:リモコンを解析してテレビを操作する。