JavaScriptで家電を操作するための赤外線信号の基礎知識:Arduinoで始めるWeb技術者のためのIoT入門(4)(3/3 ページ)
今注目のInternet of Thingsを実現するセンサーデバイスのインターフェースとしてArduinoを使い、電子工作の基礎から実装までを紹介する連載。今回は、エアコンの制御をWebブラウザーから行うために、制御の媒介となる赤外線リモコンの信号をJavaScriptとArduinoの機能で再現する方法を解説します。
Arduino IDEの「シリアルモニタ」ツール
次に、「シリアルモニタ」ツールを起動します。ツールバーで「シリアルモニタ」を選択すると、モニター画面が表示されます。
画面右下のbaudレートを先ほどのスケッチで指定した値と同じにしてください。
リモコンを赤外線センサーに向けて、リモコンの電源ON/OFFのボタンを押してみます。次のような出力が表示されるでしょう。
3500, 3480, 856, 824, 860, 828, 852, ……, 892
これは、左から順に、奇数個目がONの継続時間、偶数個目がOFFの継続時間を表しています。つまり、最初に3500マイクロ秒間ONが続いた後、OFFの状態が3480マイクロ秒間続くといった具合です。
筆者のリモコンからは271個の値が出力されており、長い信号を発信していることが分かります。これと同じタイミングで赤外線LEDを点滅させればよいのです。
JavaScriptで赤外線信号を発生させる
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ブラウザーからリアルタイムにリモコン制御
今回は、制御の媒介となる赤外線リモコンの信号を再現する方法を解説しました。次回はWebブラウザーからリアルタイムに制御できるようにUIを作りつつ、System Exclusiveメッセージを使ってJavaScriptと連携させる方法を解説します。
外出中の遠隔制御はもちろんのこと、音声エンジンと組み合わせれば、声で電源のON/OFF、温度変更までできるようになります。お楽しみに。
著者プロフィール
岩永 義弘(いわなが よしひろ)
株式会社インターネットイニシアティブ
データ分析とワインが好物。通信アノマリ検知システムや地震速報配信システムの開発と運用を経た後、Webアプリのフロントエンドに手を伸ばし、図らずもフルスタックな道を突き進んでいる。最近は趣味でHTTP/2の実装を楽しんでいる。
Twitter:@y_iwanaga_
Bot:@quake_alert @WeatherAlertJP
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 三国大洋の箸休め(26):忘れずに手を洗おう……ビッグデータとIoTの活用例
張り紙に頼る代わりに、センサーとInternet of Things(IoT)、ビッグデータといった技術を活用して手洗い忘れ防止を実現したケースを紹介する。 - Database Watch(2014年2月版):確定不能なデータたち――IoT時代を受け止めるOracle NoSQL、JSON Anywhere
エンタープライズを指向するOracle NoSQL、マルチデバイスでのデータハンドリングのための環境を整備するCouchbase、適用用途は異なるものの、IoT時代を見据えた開発を進める2つの非RDBをウォッチした。 - ATが影響、ただし「将来的には元凶となる恐れ」:冷蔵庫は「無実」――シマンテックがスパム発信元を調査
「インターネットにつながったスマート家電から75万通以上のスパムメールが発信された」という報道に関して、シマンテックは2014年1月27日、実際に感染していたのは同じホームネットワーク内のWindows搭載PCであり、冷蔵庫は「無実だ」とするブログを公開した。 - 「俺たちのJavaは、まだまだこれからだ」未来の鍵はInternet of Thingsにあり?〜JavaOne 2013まとめレポート(前編)
Java開発者の年次カンファレンス、JavaOne 2013がサンフランシスコで9月22〜26日に開催された。3つの基調講演、そして400を超えるセッションが行われるなど、圧巻のボリュームは、まさに「Java開発者の祭典」といえる。基調講演と主なセッション、全体の雰囲気を前中後編に分けてレポートする。 - Microsoft Azure情報アップデート:IoTをクラウドで管理、「Microsoft Azure Intelligent Systems Service」プレビュー公開
米マイクロソフトは2014年4月15日、デバイスやセンサーといった「モノのインターネット」(IoT)からのデータを収集し、ビジネスインテリジェンスツールと結び付けて分析する「Microsoft Azure Intelligent Systems Service」の限定パブリックプレビューを公開した。