次に、「シリアルモニタ」ツールを起動します。ツールバーで「シリアルモニタ」を選択すると、モニター画面が表示されます。
画面右下のbaudレートを先ほどのスケッチで指定した値と同じにしてください。
リモコンを赤外線センサーに向けて、リモコンの電源ON/OFFのボタンを押してみます。次のような出力が表示されるでしょう。
3500, 3480, 856, 824, 860, 828, 852, ……, 892
これは、左から順に、奇数個目がONの継続時間、偶数個目がOFFの継続時間を表しています。つまり、最初に3500マイクロ秒間ONが続いた後、OFFの状態が3480マイクロ秒間続くといった具合です。
筆者のリモコンからは271個の値が出力されており、長い信号を発信していることが分かります。これと同じタイミングで赤外線LEDを点滅させればよいのです。
LEDの点滅パターンが分かったので、次はそれを再現します。
スケッチは次のようになります。単体では動作しませんが、次回、この処理をSYSEXハンドラーに組み込む方法を紹介します。
#define IR_EMIT_PIN 12 short AC_TOGGLE_SIGNAL[] = { 3500, 3428, 856, 2560, 856, 840, 844, 2572, 852, 2596, 832, 824, 860, 2564, 852, 836, 860, 820, 860, 2560, 852, 836, 860, 2564, 852, 2596, 828, 828, 852, 2572, 860, 820, 860, 824, 860, 828, 852, 2572, 852, 824, 860, 828, 860, 828, 852, 832, 844, 832, 864, 824, 860, 828, 852, 2572, 844, 832, 860, 828, 860, 824, 852, 836, 852, 828, 852, 832, 3472, 3424, 860, 2564, 860, 828, 852, 2564, 852, 2604, 820, 836, 852, 2568, 856, 824, 860, 828, 852, 2572, 852, 832, 856, 2564, 860, 2564, 852, 832, 860, 2560, 860, 824, 852, 836, 860, 824, 852, 2572, 844, 836, 852, 836, 860, 824, 852, 828, 860, 824, 852, 836, 852, 832, 860, 2556, 912, 776, 856, 832, 844, 832, 864, 824, 860, 824, 852, 828, 3464, 3440, 860, 13836, 3500, 3432, 852, 828, 860, 824, 852, 836, 852, 2568, 856, 2564, 860, 2564, 852, 836, 852, 2564, 860, 824, 852, 836, 884, 800, 876, 2548, 848, 2572, 860, 2564, 852, 832, 856, 2564, 852, 832, 852, 2572, 856, 2568, 856, 824, 860, 2564, 860, 2564, 852, 836, 844, 832, 884, 804, 876, 2548, 852, 2564, 864, 824, 852, 2572, 852, 2572, 844, 836, 860, 824, 3496, 3408, 844, 836, 852, 832, 876, 812, 884, 2532, 852, 2572, 856, 2568, 860, 820, 892, 2532, 852, 836, 876, 812, 880, 796, 892, 2532, 864, 2564, 844, 2568, 864, 824, 884, 2540, 884, 796, 892, 2532, 884, 2540, 888, 800, 884, 2532, 892, 2536, 876, 808, 884, 796, 892, 796, 884, 2536, 880, 2540, 884, 804, 880, 2540, 888, 2532, 892, 796, 884, 800, 3488, 3408, 892, }; void emitIRSignal() { int duration; unsigned long started_at; int signalLength = sizeof(AC_TOGGLE_SIGNAL) / sizeof(AC_TOGGLE_SIGNAL[0]); for (int i = 0; i < signalLength; i++) { duration = AC_TOGGLE_SIGNAL[i]; started_at = micros(); while(micros() - started_at < duration) { // i is even: HIGH. i is odd: LOW // keep 1/3 duty, 8 usec. digitalWrite(IR_EMIT_PIN, 1 - (i % 2)); delayMicroseconds(8); // off remaining 2/3, 16 usec. digitalWrite(IR_EMIT_PIN, 0); delayMicroseconds(16); } } }
3行目のAC_TOGGLE_SIGNALにON/OFF継続時間のデータを入れます。メーカーによって信号が違うため、先ほど読み取った値をコピー&ペーストして適宜置き換えてください。
emitIRSignal関数でやっていることはシンプルで、経過時間とLED操作継続時間を比較して、ON/OFFを切り替えているだけです。
18行目で点灯/消滅をコントロールしています。配列のインデックスが0を含む偶数のときに1、つまりHIGHを出力しLEDを点灯させます。奇数のときは0、つまりLOWを出力しLEDを消灯させます。
19行目以降の意図を説明します。注釈で補足しましたが、ONの信号は次の図のように、「1/3周期(8マイクロ秒)点灯した後、残り2/3周期(16マイクロ秒)消灯」を1サイクルとします。
このサイクルを繰り返せばONの継続を意味します。delayMircoseconds()を使って1サイクル内の点灯と消灯のタイミングを調整しています(注:今回読み取りに用いた赤外線センサーは、ONの間はHIGHを出力するようになっているため、この細かいサイクルを意識する必要がありませんでした)。
ここで、「ONの間はLEDをずっと点灯させていれば処理がシンプルになるのに」と思われるかもしれません。これは点灯時間を短くすることで消費電力を抑え、リモコンのバッテリを長持ちさせるため工夫です。OFFのときは、全てLOWの値が出力されるので、消灯のままになります。
以上で、家電を操るための土台が出揃いました。次回はこのスケッチをStandardFirmataに組み込んで、家電を操作します。
今回は、制御の媒介となる赤外線リモコンの信号を再現する方法を解説しました。次回はWebブラウザーからリアルタイムに制御できるようにUIを作りつつ、System Exclusiveメッセージを使ってJavaScriptと連携させる方法を解説します。
外出中の遠隔制御はもちろんのこと、音声エンジンと組み合わせれば、声で電源のON/OFF、温度変更までできるようになります。お楽しみに。
岩永 義弘(いわなが よしひろ)
株式会社インターネットイニシアティブ
データ分析とワインが好物。通信アノマリ検知システムや地震速報配信システムの開発と運用を経た後、Webアプリのフロントエンドに手を伸ばし、図らずもフルスタックな道を突き進んでいる。最近は趣味でHTTP/2の実装を楽しんでいる。
Twitter:@y_iwanaga_
Bot:@quake_alert @WeatherAlertJP
Copyright © ITmedia, Inc. All Rights Reserved.