🎤

【NatureRemo×IR制御×PIXMOB】ライブで配布されたLEDリストバンドを光らせたい

に公開

PixMob X2をNature Remoで自宅発光!IR信号制御の備忘録

概要

PixMob X2の光らせ方について記載。
とあるアーティストのライブで配布された遠隔操作LEDリストバンド(PixMob X2)を、公演後も自宅で操作して光らせようと試みた備忘録です

対象者

  • IR制御LEDリストバンドを発光させる手段に興味のある人
  • REST APIについて理解できる人

ご注意

  • ※ 一般的な家電のIR(赤外線)サブキャリアは36〜40kHz帯を利用しており、本記事で利用する38kHz信号は他機器が誤動作する恐れがあります。必ず動作確認を行い、不要な影響を避けてください。
  • ※ Nature Remoは非指向性赤外線のため、信号が拡散し思わぬ機器が受信する可能性があります。
  • ※ 記事中のLocal API仕様は変更される可能性があります。必ず最新の公式ドキュメントをご確認ください。
  • ※ 記事中で操作対象としたPixMobデバイスはイベント用途として配布・設計されており、私的利用に関する保証や責任はメーカーは負っていません。安全上、イベント外での利用は自己責任となりますので、ご留意願います。
  • ※ プライベートな場所での、非営利かつ私的な利用に留めてくださいますよう、お願い致します。

必要なもの

インターネットでリストバンドの商品名やモデル名を検索すると、IR(赤外線)で発光を遠隔制御するリストバンド型LEDライトとのこと

そのため、自宅でのリストバンド発光には

  • リストバンドに任意のIR(赤外線)信号を送信できるデバイス
  • リストバンドの発光指示となるIR(赤外線)信号パターン

の両方が必要になります。

必要なものの詳細

任意のIR信号を送信できるデバイス

まずは、任意のIR(赤外線)信号を送信できるデバイスを準備します。
幸いな事に我が家には、Nature株式会社のスマートリモコン「Nature Remo 2」があり、Local API経由で任意のIR(赤外線)信号パターンを送信できる機能を持っていたため、それを利用しました。
後述のIR(赤外線)信号パターンを出力できるものであれば、他のデバイスでも構いません。

発光指示となるIR信号パターン

こちらは、解析を試みた先人様が、その成果物をGitHub上に公開されていましたので、そちらを参照させて頂きました。ありがとうございます。

システム構成

以下が自宅で試した構成です。

PCやiPhoneから、ローカルネットワーク上のNatureRemo2対してLocalAPIを発行し、NatureRemo2がIR(赤外線)信号をリストバンドに送信し、リストバンドを発光させる。

NatureRemo LocalAPI仕様確認

NatureRemoシリーズのLocalAPI仕様を確認すると、任意のIRパターンを送信するためには

  1. NatureRemoのローカルIPアドレスを確認
  2. HTTPリクエストヘッダにX-Requested-With:(値は任意)を付与し、/messagesエンドポイントに対して、IR信号パターン情報を含んだJSON情報をPOSTメソッドで発行する

という手順が必要なことがわかります。
1.については、mDNSによる_remo._tcpサービス検出、またはFingアプリ等によるネットワーク接続機器検出により、NatureRemoのローカルIPアドレスを確認します。今回はFingアプリでNatureRemoのローカルIPアドレスを取得しました。
2.については、LocalAPI仕様にあるModels/IRSignal定義に基づき、リストバンドを発光させるための

  • IR(赤外線)のサブキャリア周波数の指定 (指定はkHz単位)
  • IR(赤外線)信号パターン情報(赤外線をオンオフさせる時間の長さを列挙した配列)
  • 信号パターン情報に列挙する時間の単位(API仕様上「マイクロ秒」固定)

を、JSONデータとして準備した上で、cURL等のAPI発行手段を用いてNatureRemoのLocalAPIを実行します。

NatureRemoのLocalAPIはCloudAPIとは異なり、ローカルネットワークから直接デバイスのエンドポイントにアクセスする前提の仕様のため、トークンやAPIキー等の一般的なセキュリティ仕様やCORS対応のレスポンスヘッダを返す機能等がありません。利用の際は、仕様が混同しないよう注意願います。

LED発光指示となるIR信号パターン確認

先に紹介した先人様のGitHubリポジトリ上にあるPixMob_main.irファイルに、基本的なIR信号パターンが収録されています。
一例として、先頭に記載されてるRED(赤色で短く光らせる)パターンを確認します。
https://github.com/danielweidman/flipper-pixmob-ir-codes/blob/main/PixMob_main.ir#L8-L12
これを見ると

  • サブキャリア周波数:38kHz(38000Hz)
  • 信号パターン:[1400 1400 700 700 700 1400 700 2800 700 2100 1400 700 700 700 700 1400 1400 2800 1400 2800 700]

という情報が取得できます。

この信号パターンは、赤外線LEDの「オン・オフの時間(マイクロ秒)」を交互に列挙したもので、
例:[1400, 1400]なら1400usオン → 1400usオフの意味です。

この情報からNatureRemoのLocalAPI送信用JSONデータを作成すると以下になります

{
  "freq":38,
  "data":[1400,1400,700,700,700,1400,700,2800,700,2100,1400,700,700,700,700,1400,1400,2800,1400,2800,700],
  "format":"us"
}

cURLによる動作確認

作成したREDパターンのJSONデータを、cURLコマンドを用いて、NatureRemoのLocalAPIに投入し動作確認しました。
※エンドポイントのIPアドレスは、各自のNatureRemoローカルIPアドレスに読み替えて下さい

curl -X POST "http://192.168.XXX.YYY/messages" \
-H "X-Requested-With: local" \
-d '{"freq":38,"data":[1400,1400,700,700,700,1400,700,2800,700,2100,1400,700,700,700,700,1400,1400,2800,1400,2800,700],"format":"us"}'

ここで、NatureRemoからリストバンドに対してIR(赤外線)信号が送られます。
コマンドを実行時に

  • NatureRemo本体がうっすら光ること
    (赤外線出力時のリアクション)
  • cURLコマンドの応答{}が表示されること

が確認できます。

動作確認のトラブルシュート

cURLコマンドに対するNatureRemoのリアクションや応答を確認できない場合

  • REST要求が正しくNatureRemoに届いてない
  • ヘッダ不正やデータ不正等でNatureRemoが指示を正しく解釈できてない
  • (何らかのエラーで)NatureRemoがハングアップしてる

の可能性があります。ハングアップしてた場合はNatureRemoのUSB電源を抜き差しすると、再起動できます。

また、リストバンドにIR(赤外線)信号が正しく伝わると、赤く短く(0.1秒程度)光ります。
光らない場合

  • 信号パターンやパラメータが誤ってる
  • NatureRemoとリストバンドの間に障害物等がありIR(赤外線)信号が届いてない
  • リストバンドが非活性状態になってる
  • リストバンドの電池切れ

などの原因が考えられます。
リストバンドの非活性状態については、GitHub上の解析結果資料にて触れられており、非活性状態のリストバンドは「開始シーケンス」または「正規の発光信号2回」(2回の間隔については記述をみつけられず)を受信するまで光らないようです。
開始シーケンスはビット列で1000000000(1が赤外線オン、0が赤外線オフ)からなる先頭コードで、普段の信号パターン上では省略可能となっており、先のREDパターンからも省略されてます。リストバンドの活性化や連続した複数IR信号パターンを区切る際に使用されます。
光らない場合、IR(赤外線)信号パターンの先頭に開始シーケンスを挿入することを検討ください。
開始シーケンスを挿入する場合は、data配列の先頭に700,6300,を追加して下さい。(700マイクロ秒オン、6300マイクロ秒オフ=ビット列1000000000

違う色で発光させる

赤以外の色で発光させるためには、その発光指示に該当するIR(赤外線)信号パターンをJSON化して、NatureRemoのLocalAPIで実行すれば可能です。
以下は違う色の発光指示IR信号パターンをJSONにした例です

青で短時間発光

{
  "freq":38,
  "data":[700,700,700,2100,1400,700,700,2800,700,1400,700,700,700,1400,1400,700,700,1400,700,700,700,700,700,700,700,2100,700],
  "format":"us"
}

白でフェードインフェードアウト

{
  "freq":38,
  "data":[700,700,700,2100,1400,700,700,2800,700,1400,700,700,700,2800,1400,1400,700,2100,700,1400,700,1400,700,1400,700,1400,1400,700,700,700,700,700,700,2800,1400,2800,700],
  "format":"us"
}

先ほどのcURLコマンド列のJSONに差し替えれば、リストバンドの発光動作が変化します。

iOSのショートカットで発光させる

cURLによる動作確認後、iOS機能である「ショートカット」により、ボタン一発でPIXMOBを光らせてみました。
ショートカットWebWebリクエストURLの内容を取得を選択して

  • URL:NatureRemoのLocalAPIエンドポイント
    (http://192.168.XXX.YYY/messages)
  • 方法:POST
  • ヘッダ:新規ヘッダを追加
    • キー:X-Requested-With/値:local
  • 本文を要求:JSON
    • 新規フィールドを追加
      • 数値:キーfreq/値38
      • テキスト:キーformat/テキストus
      • 配列:キーdata/要素を数値で追加
        • 信号パターンの値を要素で列挙
          (要素は全て数値にして下さい)

と作成すると、ショートカット実行で、先のcURLコマンドと同等のAPIが発行できます。
つまり、ボタン一発でリストバンドを光らせることができます。(多少のラグはありますが)

他のデバイスからの一発実行

他のOSからでも下記ツールを利用することで、ショートカット実行やボタン押下から、NatureRemoのLocalAPIを実行して、リストバンドを光らせる事が可能です。

Android

  • HTTP Shortcut
  • Tasker(+RESTプラグイン)

など

Windows

  • Insomnia
  • Power Automate Desktop

など

まとめ

リストバンドを発光させるIR(赤外線)信号を、NatureRemoからLocalAPI経由で送信し、自宅でも光らせる事ができました。
アーティストさんの曲に合わせて、自分の好きなタイミングで自分の好きな色に光らせて、ライブの余韻を味わいましょう!

ライセンスに関する表記

本記事で使用しているPixMob赤外線信号データは、
danielweidman/flipper-pixmob-ir-codes リポジトリ(MITライセンス)の内容を参照・活用しています。
(© Daniel Weidman 2023)

※ MITライセンスの詳細はこちらをご参照ください。

Discussion