ロビ2の赤外線通信調査
2022年2月3日


 ロビ2の赤外線通信調査について調べてみました。
 ロビ1の赤外線通信は送信機能しかありませんでしたがロビ2では受信機能もありロビ2同士ではこの通信機能を使って連携プログラム(ロビリンク)を動かす事ができます。
 またロビ1とロビ2の連携はロビ1から送信された赤外線をロビ2が受信して連携プログラム(ロビリンク)を動かしています。
 この記事では連携の仕組みを実際のプログラムの命令で説明しています

 ロビ2でもロビ1と同様テレビのリモコン操作ができます。
 ロビ2では予めいくつかのメーカーのリモコン信号のパターンが学習されています。
 この仕組みも含めてテレビのリモコン操作についても説明しています。

赤外線リモコン操作

 赤外線によるリモコン操作はロビ1と同じ「電源ON/OFF」「チャンネル変更」「音量大」「音量小」「チャンネル変更」の4つの命令です。
 これらの赤外線信号を送信するにはマイコンボードのメモリに対して固定の値を書込むとそれに対応した赤外線信号が赤外線リモコンボードを経由して送信されます。
 このアドレスと値はロビ1のものと同じで以下の通りになっています。

  アドレス:0x0e62(16進数)
  電源ON/OFF:177(10進数、電源ONとOFFは同じ信号で電源がONの状態で送信されると電源がOFFになります)
  チャンネル変更:178(10進数)
  音量大:179(10進数)
  音量小:180(10進数)

 実際のプログラムでは以下のような命令で書かれています。(ロビ1も同じ)
   <calc><const data="177"/><mem_w size="2" adr="0x0e62"/></calc>

 ロビ2の場合、これらの信号を送る前に信号のパターンを赤外線リモコンボードに教えてやる必要があります。
 その信号のパターンの設定も同じマイコンアドレスに固定の値を書込む事によって行えます。
 パターンはテレビのメーカーによって決まっておりそのメーカーを指定します。
 またそれとは別に赤外線リモコンボードに実際のリモコンで学習させたパターンを使う事もできます。
 このアドレスと値はロビ1のものと同じで以下の通りになっています。

  アドレス:0x0e62(16進数、信号の送信と同じ)
  オリジナル:160(10進数、リモコンで学習させた信号)
  ソニー:161(10進数)
  パナソニック:162(10進数)
  シャープ:163(10進数)
  東芝:164(10進数)
  日立:165(10進数)
  三菱:166(10進数)
  LG:167(10進数)

 メーカーの値はロビ2のSDカードのTV_SETTING.BINというファイルに書かれています。
 このファイルには認識語の「チャンネル設定」で定義したメーカーに対応する値が書かれています。
 この値はロビ設定ファイルエディタ2の設定データ変更機能で確認/変更する事ができます。
 なおこの値は0x0e62に書き込む値から-128した値です。

 TV_SETTING.BINの値を読込んで0x0e62に書き込む処理は以下のサブルーチンで行っています。
   <call adr="0x0010b38e"/>

   <fread filename="TV_SETTING.BIN" adr="0x0e62"/>
   <calc><mem_r size="1" adr="0x0e62"/><const data="128"/><mem_w size="2" adr="0x0e62"/></calc>
 なおこのサブルーチンでは赤外線リモコンボードがこの命令を処理した事を確認して終了しています。


ロビ1との連携

 ロビリンクでロビ1と連携する時はロビ1からの赤外線信号を受信してロビ2が連動します。

 ロビ2で受信した赤外線信号はマイコンのアドレス0x0e66(16進数)の値を読むことによって信号の値が取得できます。
 実際のプログラムでは以下のような命令で書かれています。(65をチェックしている例)
   <calc><mem_r size="2" adr="0x0e66"/><const data="65"/><sub/><eq/><jump adr="0x00003281"/></calc>

 ロビ1とのロビリンクには4つの信号が割り当てられています。
 これらの信号は2つずつ組み合わせて8通りの信号としてロビ2が受信します。
 ロビ1はリモコン信号と同じようにマイコンのメモリ0x0e62にこれらの値を書き込みます。
 ロビ1とのロビリンク用に割り当てられた値は181〜184(10進数)の4つの値です。
 ロビ1ではこの中から2つの値を1.67秒間隔を空けて連続してマイコンボードに書き込んでいます。
 この処理はロビリンクのロビ1_ロビ2_パターン0x*_TX.RM4(*=0〜7)という8つのプログラムで行われています。
 ロビ1が送信した赤外線信号でロビ2が取得する値は次の通りです。

  ロビ1(ロビ1_ロビ2_パターン0x0_TX.RM4):181,181→ロビ2(0x0e66):65(しりとり1)
  ロビ1(ロビ1_ロビ2_パターン0x1_TX.RM4):181,182→ロビ2(0x0e66):66(しりとり2)
  ロビ1(ロビ1_ロビ2_パターン0x2_TX.RM4):181,183→ロビ2(0x0e66):67(しりとり3)
  ロビ1(ロビ1_ロビ2_パターン0x3_TX.RM4):181,184→ロビ2(0x0e66):68(あっち向いてホイ1)
  ロビ1(ロビ1_ロビ2_パターン0x4_TX.RM4):182,181→ロビ2(0x0e66):69(あっち向いてホイ2)
  ロビ1(ロビ1_ロビ2_パターン0x5_TX.RM4):182,182→ロビ2(0x0e66):70(ジャンケン1)
  ロビ1(ロビ1_ロビ2_パターン0x6_TX.RM4):182,183→ロビ2(0x0e66):71(ジャンケン2)
  ロビ1(ロビ1_ロビ2_パターン0x7_TX.RM4):182,184→ロビ2(0x0e66):72(ダンス)
 なおロビ1がどのプログラムを実行するかはランダムに決められます。

 ロビ1とロビ2が同期を取るため上記の信号は2回同じものが送信されます。(この間隔も1.67秒開けています)
 ロビ2は65〜72の値を取得した場合はすぐに対応するプログラムは動かさずに再び65〜72の値が取得するまで待ちます。
 ロビ2は最初の信号をアイドリングで受信しますがアイドリングで受信した場合、受信するタイミングで実行するのが遅れる事があります。
 2回目の信号を受け取る時は取得間隔を短くしているため遅れずにプログラムが開始できるのでロビ1と同期させる事ができます。
 なお実際のプログラムは2回目の信号に対応するため1回目の信号は8つのうちどの信号でも構いません。(上記プログラムは同じ組み合わせで送っています)
 一定時間(3秒)の間に65〜72の値が取得出来ない場合はロビ2が首を傾げ「ン」と言って処理を終えます。
 この場合、ロビ1はロビ2が受信できなかった事が分からないのでそのまま連携プログラムを実行します。
 なお181〜184に対応する赤外線信号はロビ1の赤外線リモコンボードでしか送信できないようでロビ2の赤外線リモコンボードから送信した場合はロビ2は無反応でした。

 ロビ1との連携テストプログラムです。
 ロビ1テストプログラム
   ロビ1でこのプログラムを動かすとロビ2でしりとりを行います。
 ロビ1とロビ2はロビリンクを行う時と同じように向かい合わせて立たせておいてください。


ロビ2との連携

 ロビ2同士で連携する時はお互いに赤外線信号を送受信して連動させています。
 「いっしょに遊ぼう」で動かしたロビ2は連携用の赤外線信号を連携ざるロビ2に送信します。
   ロビ2で受信した赤外線信号はマイコンのアドレス0x0e66(16進数)の値を読むことによって信号の値が取得できます。
 ロビ2同士のロビリンクには15の信号が割り当てられています。
 リモコン信号と同じようにマイコンのメモリ0x0e62にこれらの値を書き込みます。
 送信側ロビ2が送信した赤外線信号で受信側ロビ2が取得する値は次の通りです。

  ロビ2(0x0e62):240→ロビ2(0x0e66):112(しりとり1)
  ロビ2(0x0e62):241→ロビ2(0x0e66):113(しりとり2)
  ロビ2(0x0e62):242→ロビ2(0x0e66):114(しりとり3)
  ロビ2(0x0e62):243→ロビ2(0x0e66):115(しりとり4)
  ロビ2(0x0e62):244→ロビ2(0x0e66):116(ダンスB)
  ロビ2(0x0e62):245→ロビ2(0x0e66):117(あっち向いてホイ1)
  ロビ2(0x0e62):246→ロビ2(0x0e66):118(あっち向いてホイ2)
  ロビ2(0x0e62):247→ロビ2(0x0e66):119(ジャンケン1)
  ロビ2(0x0e62):248→ロビ2(0x0e66):120(ジャンケン2)
  ロビ2(0x0e62):249→ロビ2(0x0e66):121(ダンスA)
  ロビ2(0x0e62):251→ロビ2(0x0e66):123(君もかわいいね)
  ロビ2(0x0e62):252→ロビ2(0x0e66):124(僕こそロビだよ)
  ロビ2(0x0e62):253→ロビ2(0x0e66):125(漫才)
  ロビ2(0x0e62):254→ロビ2(0x0e66):126(怪獣ゴッコ)
  ロビ2(0x0e62):255→ロビ2(0x0e66):127(よく見るとカッコいいね)
 なおロビ2がどの信号を送信するかはランダムに決められます。

 送信したロビ2はすぐに連携プログラムは実行せず受信したロビ2からの応答を待ちます。
 受信したロビ2は直ちに次の命令で応答信号を送信します。
  受信側ロビ2(0x0e62):240→送信側ロビ2(0x0e66):112
 受信側ロビ2どの連携プログラムを行う場合も応答としては必ず240を書き込みます。
 一定時間(3秒)の間に112の値が取得出来ない場合は送信側ロビ2が首を傾げ「ン」と言って処理を終えます。

 ロビ2との連携テストプログラムです。
 ロビ2テストプログラム
   このプログラムをロビプログラムコンパイラーでSTARTUP.BINに組み込んで動かすともう一方のロビ2でしりとりを行います。
 お互いのロビ2はロビリンクを行う時と同じように向かい合わせて立たせておいてください。
 なおこのプログラムを動かしたロビ2も応答信号(240)に反応してしりとりを行います。



 本来は両方のロビが直立モードでないとロビリンクは動かす事ができません。
 以下のパッチファイルで充電椅子モードでもロビリンクをを動くようにする事ができます。

  chair_link.csv

   ロビ設定ファイルエディタ2でロビ2のSTARTUP.BINに適用してください。

 ロビは赤外線通信はテレビリモコンやロビリンク以外にロビクルを操作する事ができます。
 ロビクルを操作するにはロビクル用の赤外線送信器(ロビクルの付属品)が必要です。
 ロビクルはロビ1でもロビ2でも操作する事ができます。
 ロビクル用の赤外線信号を送信する場合もリモコンやロビリンクと同様マイコンのメモリ0x0e62にロビクルに割り当てられた値を書き込む事で送信する事ができます。
 ロビクルに割り当てられた値は以下の通りです。
  128〜141,142〜149,151〜154,164,189〜194,200〜202,204,206,208〜211,216〜220,233,239〜241,243,244,252

目次に戻る