検索
連載

JavaScriptで家電を操作するための赤外線信号の基礎知識Arduinoで始めるWeb技術者のためのIoT入門(4)(2/3 ページ)

今注目のInternet of Thingsを実現するセンサーデバイスのインターフェースとしてArduinoを使い、電子工作の基礎から実装までを紹介する連載。今回は、エアコンの制御をWebブラウザーから行うために、制御の媒介となる赤外線リモコンの信号をJavaScriptとArduinoの機能で再現する方法を解説します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena

可変長の汎用的なデータをやりとりする「SYSEX Message」とは

 デバイスとその命令のパターンは無数に存在し得るため、Firmata規格で通信内容を厳格に定めることは不可能でした。そこでFirmata v2.0で、可変長の汎用的なデータをやりとりするためにSYSEXという機構が導入されました。SYSEXのフォーマットは、下記に示す通り非常にシンプルです。

位置 データ
0(先頭) START_SYSEX 0xF0
1 コマンド 0x00〜0x7F
2〜N-1 データ部 7 bitデータの配列
N(末尾) END_SYSEX 0xF7

 下記リストは、ここから押さえておくべきポイントです。

  • データの先頭と末尾にSYSEXの開始と終了の目印がある
  • コマンドでデバイス側で実行するハンドラー関数を指定
  • Firmata 仕様で定義されたコマンドを指定。この値を見てArduinoは処理を切り替える

 実は、johnny-fiveモジュールを使ってArduinoとシリアル通信を確立直後に、裏側でこの仕組みが動いています。具体的には、SYSEXの「CAPABILITY_QUERY(0x6B)」コマンドでピンの情報を取得した後、「ready」イベントを発火させています。

SYSEXはどう使うべきなのか

 ここで、Arduinoに任意の処理を実行させるために2つアプローチが考えられます。

  1. オリジナルのコマンドを定義してリクエスト/レスポンスを実現する
  2. 「STRING_DATA(0x71)」コマンドで与えた文字列を基に挙動を分岐させる

 しかしながら、Node.jsでArduinoを操作する場合、執筆時点では後者を選ばざるを得ません。理由はjohnny-fiveが依存しているnpmモジュール「firmata」が知らないコマンドを伝達しない実装になっているためです。

 よって、STRING_DATAを使いつつ、送信した文字列で処理を切り替えるアプローチを取ります。johnny-fiveからSTRING_DATAコマンドを送信する方法は次回に解説します。今回は、STRING_DATAコマンドから呼び出される関数を実装します。

回路作成

 前回と同様、ブレッドボードを使わず、パーツをつなぐだけです。赤外線センサーをデジタルピンの11番に、赤外線LEDをデジタルピンの12番に結線します。

JavaScriptで赤外線情報を読み取る

 前述の通り、JavaScriptではマイクロ秒単位でON/OFFの変化を判定することが困難なので、赤外線情報を読み取る作業は、スケッチとArduino IDEの「シリアルモニタ」機能で完結させます。ここで得たON/OFF情報は、後の赤外線信号を発生させるときに、そのまま利用します。

読み取り用スケッチ

 読み取り用スケッチは次のようになります。

#define IR_RECV_PIN      11
#define IR_TIMEOUT_USEC  100000
 
void setup()
{
  Serial.begin(57600);
  pinMode(IR_RECV_PIN, INPUT);
}
 
void loop()
{
  static int           previousBit      = HIGH;
  int                  currentBit       = digitalRead(IR_RECV_PIN);
  static unsigned long previousTimeUSec = 0;
  unsigned long        currentTimeUSec  = 0;
  unsigned long        elapsedTimeUSec  = 0;
 
  if ( currentBit == previousBit ) {
    return;
  }
 
  currentTimeUSec = micros();
  elapsedTimeUSec = currentTimeUSec - previousTimeUSec;
  if (elapsedTimeUSec < IR_TIMEOUT_USEC) {
    Serial.print(elapsedTimeUSec);
    Serial.print(", ");
  } else {
    Serial.println("");
  }
 
  // update
  previousBit      = currentBit;
  previousTimeUSec = currentTimeUSec;
}
  • ヘッダー部分

 1行目で赤外線センサーを接続するピンを指定します。今回はデジタル11番ピンです。2行目は、1回目の信号と2回目の信号を区別するための時間です。OFF状態を100ミリ秒以上継続する信号がなかったので、経験則でこの値を指定しています。

  • setup関数

 Arduinoボードでスケッチを実行したとき、最初に1回だけ実行される関数です。シリアル通信の転送速度を指定し、利用するピンを読み取りモードに設定しています。

  • loop関数

 メインの処理をここに記述します。繰り返し実行される関数です。実行するたびに赤外線センサーの値を読み取ります。loop関数が前回実行された時と今回とで赤外線のON/OFF状態に変化があったのかをチェックし、変化があったときに継続時間を出力しています。

 このスケッチを動かして、赤外線の情報を出力してみましょう。プログラムを起動するまで手順は、以前StandardFirmataをアップロードしたときと同じです。Arduino IDEで左上の「検証」ボタンを押してコンパイルした後、「マイコンボードに書き込む」ボタンを押します。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る