Siriで赤外線リモコン操作を実現する

前回の記録: SiriでArduinoを操作する
前回の記録ではSiriに喋りかけることでArduinoに取り付けられたLEDを制御した. 今回はArduinoに赤外線LEDと受光素子を取り付け,学習リモコンとして利用することで,Siriによるリモコン操作を実現する. 例えば送風機やTV,照明器具などなど...赤外線リモコンで操作できる家電をSiriでも操作できるようにする.

目指すところ

↑クリックでAmazonへ↑
今回は部屋についたペンダントライト(照明器具)をSiriで操作できるようにする. 部屋にある照明器具はそのままでは赤外線操作に対応していないので,Panasonicが販売しているスイッチ(通称ほたるスイッチ)を購入した(右図). これは壁に取り付けられるプッシュスイッチだが,下のスイッチのみ赤外線リモコンでOn/Offの切り替えが出来るという代物. このスイッチに対応したリモコンの赤外線信号をArduinoに覚えさせ,Siriのコマンドに応じて照明器具をOn/Offできるようする.

用意するもの (用意したもの)

  • Arduino UNO R3
  • Ethernetシールド
  • USBケーブル(A-B)
  • ブレッドボード
  • ジャンパワイヤ(導線)
  • あればプッシュボタン
  • 受光素子: TSOP38238
  • 赤外線(IR)LED: YSL-R531FR1C-F1
  • 上で説明したほたるスイッチと対応リモコン
Ethernetシールドは今のうちにArduinoに取り付ける. 受光素子とIR-LEDは千石電商さんより購入. 38kHzに対応している赤外線受光素子はTSOP38238が有名らしい. この38kHzとはほとんどの赤外線リモコンが変調に利用している周波数,すなわち38kHzの信号を受け取れる受光素子が学習リモコンにはベストということになる(今回の用途にぴったり!). 赤外線LED(IR-LED)は基本的にはどのようなものでも大丈夫. 私が購入したLEDは940nmまわりで光り,指向性も緩やかなため,ある程度角度がついても赤外線通信ができる品. この他,Arduinoと接続するためにブレッドボードと数本のワイヤが必要. また,プッシュボタンがあると学習したリモコンコードを試す時に重宝する(無くても良い).

ハードウェア

配線は上図を参照(Ethernetシールドの上から配線して問題ない). 私はブレッドボードで動作を確認した後,基盤へはんだ付けをして,Arduinoシールドを自作した(詳細は後述). シールドの自作は日常使いに対応した気分になるのでおすすめ. 下の写真は配線済みのもの. 私はLEDを2個並列につなげてみた. 1個でも十分なのだが,LEDの指向性を更に広げるため,2個のLEDをハの字状に配置する魂胆(注:写真はハの字状に向ける前に撮ったもの).

ライブラリの準備

z3t0/Arduino-IRremote | GitHub.com Arduinoで赤外線通信を実現するためのライブラリである"Arduino-IRremote"がGitHubにて公開されているので,上記リンクよりダウンロード. GitHubをよく知らない方は緑色の"Clone or downloads"ボタンをクリックして"Download ZIP"するとよい.
ZIPでダウンロード出来たら早速展開. 出てきたフォルダを"IRremote"へ名称変更しておくと良い. そのフォルダをArduinoのプロジェクトフォルダ内にある"libraries"フォルダ内へ移動(上図参照). 続いてライブラリ間の競合を避けるため,ArduinoアプリをFinderで表示したら右クリックで"Show Package Contents(パッケージの内容を表示)"を選択し,"Contents > Java > libraries"内にある"RobotIRremote"フォルダを削除する(同じく上図参照). Windowsの場合は"C:\Program Files (x86)\Arduino\libraries"フォルダ内の同フォルダを削除でOK. これでArduinoを学習リモコンにするための準備が整った.

Homebridgeの設定変更

前回の記録で,homebridge-httpを次のように設定した.
  • "on_url": "http://192.168.11.5?9=ON"
  • "off_url": "http://192.168.11.5?9=OFF"
これは"Arduino(192.168.11.5)の9ピンをON/OFFにしてください"という意味を持たせるためだった. 今回は"LightというアクセサリをON/OFFにしてください"という意味合いにするため,次のように変更したい.
  • "on_url": "http://192.168.11.5?Light=ON"
  • "off_url": "http://192.168.11.5?Light=OFF"
この設定変更を行わず,後で紹介するHomeBridgeIRControllerスケッチの次の部分を編集するだけでも,もちろん良い.

Ethernet.ino

if (getKey == "Light")
               ↓
if (getKey == "9")
この変更を行えば,RPiの設定をいじくる必要はまったく無い. ただ,後でこのスケッチを見返したときに,"なんで9なんだっけ?"とならないようにHomebridgeの設定を変更したいというだけの話.
まずはSSHでRPiへ接続. ssh ユーザー名@ホスト名.local おそらくHomebridgeをデーモン化してあると思うので次の場所にある設定ファイルを開く. nano /var/homebridge/config.json 設定ファイル中の次の箇所を変更する("9"を"Light"へ変更).

config.json

...
"on_url": "http://192.168.11.5?9=ON",
"off_url": "http://192.168.11.5?9=OFF"
...
↓ 次のように編集
...
"on_url": "http://192.168.11.5?Light=ON",
"off_url": "http://192.168.11.5?Light=OFF"
...
Ctrl+Xを押したらyを押し,Enterで保存. 次のコマンドでHomebridgeサーバーを再起動する. sudo systemctl restart homebridge パスワードを入力してEnterで再起動. 以上で設定変更完了. SSHをlogoutして良い.

赤外線コードの受信 - 学習

ArduinoをPCにUSB接続して,Arduinoアプリケーションを開き,メニューバーの"Tools > Board"と"Tools > Port"がそれぞれ"Arduino/Genuino UNO"と"Arduinoの接続されたUSBポート"になっていることを確認したら,次のスケッチをArduinoへアップロード. IRreceiver.ino | GitHub.com 何らかの都合によりコンパイルエラーになっても,何度か試すうちに(Arduinoのリセットボタンを押したりUSBケーブルをつなぎ直したりすると)うまくアップロードできる場合があるので,めげずに試そう. 正常にアップロード出来たら"Tools > Serial Monitor (Shift+Cmd+M)"を選択しシリアルモニターを開く. さあ,リモコンを受光素子へ向け,ボタンを押してみよう. 私はスイッチをON(点灯)にするボタンを押した. するとシリアルモニターにコードが表示されるはず. これが今リモコンから送信されたIR信号である. Arduinoに取り付けられたプッシュボタンを押すと,直前に受信したIR信号をLEDから送信してくれる. これで動作確認を行える.
一番上の行がIR信号
この調子で,続けてリモコンの消灯ボタンも取得してみよう. この2つのコード(点灯と消灯)はそれぞれ分かるようにテキストエディタやメモ帳なりにコピペしておこう.
On信号 {3350, 1800, 400, 450, ... , 350};
Off信号 {3350, 1800, 350, 550, ... , 350};

[補足] IR信号について

上で表示されるコードは受光素子が受け取ったIR信号を数値にしたものなので,多少の誤差が生じる. 同じIR信号を受信しても,環境光や反射の関係か,微妙に値が変わる場合があるのだ. しかし,赤外線リモコン機器はそういった誤差も許容できるように作ってあるため,特に問題はない(±100くらいのバラ付きは出る). また,特にエアコンのリモコンに多いが,電源のONとOFFが同じボタンであっても,ON時とOFF時に違う信号を出力するリモコンがある. ボタンがひとつでも内部で複数の信号を切替えて出力している機種があるため注意が必要.

赤外線コードの送信 - 再現

HomeBridgeIRController | GitHub.com 上記リンクからIR信号送信用のスケッチを入手. 入手したら次の項目を編集する.
  • IPアドレス: Homebridgeのstatus_urlなどと合わせる.
  • MACアドレス: Ethernetシールド背面にあるシールに書かれている.
  • On信号: 取得した点灯用IR信号の配列.
  • Off信号: 取得した消灯用IR信号の配列.
コメントで"// TODO: ..."と書かれた場所が変更箇所. MACアドレスは2桁づつに区切って入力(参考ページ). On/Off信号は次のようになれば良い.

IR.ino

...
unsigned int on_code[] = {3400, 1800, ... , 350};
unsigned int off_code[] = {3350, 1850, ... , 350};
...
変更できたらArduinoへアップロード. これで先程のリモコンの機能をそっくり真似たArduinoが出来上がる. EthernetシールドのLANポートをHomebridgeが走るRaspberry Piと同じネットワークへ接続することで,Siriのコマンドに対応したIR信号を送信してくれるようになる.
試しに,"Hey Siri, Lights On."と喋ってみると,ほたるスイッチがOnになり照明器具が点灯した! もちろんHomeアプリからの操作もできる. シーンを設定しておけば"Good night."とSiriに言うだけで電気を消してくれるし,"Good morning."で電気をつけてくれる. 素晴らしい!
HomeアプリでLightアクセサリをプレスすると上右図のようになる. "Details"をタップしてから,各アクセサリのアイコンをタップすることで,お好みのアイコンへと変更することができるので試してみよう. もちろん私はペンダントライトを選んだ. わかりやすい!

おまけ: Arduinoシールドをつくる

Switch ScienceさんからArduino用バニラシールド基板ピンソケットセットを購入,各部品をはんだ付けして上のように配線をした(注:上図は基盤を上から見た図). これでブレッドボードのときと同じ配線を持つシールドの完成である. 名付けてIRシールド! 下に完成写真を載せる. 私は欲張ってLEDを2個つけているが,もちろん配線図通りの1個でも十分だ. Ethernetシールドの上から取り付けると,LANポートが若干干渉するが,動作に問題はないので良しとする.
3285561134641279543 http://www.storange.jp/2016/10/siri.html http://www.storange.jp/2016/10/siri.html Siriで赤外線リモコン操作を実現する 2016-10-31T14:13:00+09:00 http://www.storange.jp/2016/10/siri.html Hideyuki Tabata 200 200 72 72