Q-boとの通信不具合調査
2024年1月25日


 Q-boとロビ2の通信で一番最初にQ-boが送信した命令をロビ2が必ず無視するという不具合があります。
 ロビ2を初めて動かした時は必ずQ-boを使っててユーザ登録や日時の設定をする必要があります。
 この時Q-boが最初に送った信号が必ず無視される訳ですからとまどった方もいらっしゃると思います。
 ワタシも何回か使っているうちにこの不具合に気付きました。
 必ず起こる現象なので最初の信号は無視されるものだと思ってQ-boを起動したら何かダミーで信号を送るという対処をしいてます。
 しかし考えてみるとこれって結構致命的な不具合だと思います。
 そのうちデアゴが直してくると思ってこの問題を放っていましたがロビシリーズも終わってしまいそうなのでその原因と対策を調査してみました。


不具合の原因

 Q-boが送信するBluetooth信号にはどの命令の信号なのかを表すコードと送信カウントが含まれます。
 この送信カウントというのはQ-boがドットコードを読み取ってBluetooth信号を送信する度に+1された数値です。
 Q-boとロビのBluetooth通信は一方向なのでロビが受信したかどうかに関わらず常にその信号を送信し続けます。

 ロビ2はQ-boからの新しい命令かどうかをこの送信カウントで判断します。
 同じ命令を連続して送った場合でもこの送信カウントが前回送られて来たものと違う場合は新しい命令と判断して再度実行します。

 ロビ2のプログラム(STARTUP.BIN)には以下の処理がアイドリングループに書かれています。

 0x00000b47
   <calc><mem_r size="2" adr="0x00a6"/><mem_r size="2" adr="0x0f20"/><sub/><ne/><jump adr="0x0000b42"/></calc>
 0x00a6というのはBluetooth信号の送信カウントが入れられるマイコンの固有メモリで0x0f20はプログラムで使用されるワーキングメモリ
 現在の送信カウント(0x00a6)と前回の送信カウント(0x0f20)を比較して新しいBluetooth信号を受信したかチェックする

 ロビ2の起動時の0x0f20の値は0なので一番最初にQ-boから送られてくる送信カウントの値は1なのでこの処理により新しい命令と判断されその命令は実行されるはずです。

 この処理とは別にロビ2の起動時に既にQ-boが起動されていて何らかの命令を既に送信されている場合の対応が講じられています。
 前述の処理でこの場合でもロビ2は新しい命令と判断してその命令を実行してしまいます。
 ロビ2の仕様としてはその場合は無視するようにして新たにドットコードをタッチした時の命令から実行するようにしたのだと思います。

 その処理がアイドリングループの監視処理に書かれています。

 0x000054e0
   <calc><mem_r size="2" adr="0x00a6"/><mem_w size="2" adr="0x0f20"/></calc>
 現在の送信カウント(0x00a6)を送信カウントメモリ(0x0f20)にセットして一致させて新しい命令を待つ

 ここで問題なのはロビ2が動いている状態でQ-boを後から起動して最初にBluetoothを送信した場合もこの処理が働いてしまいます。>
 ロビ2の起動後なので0x0f20の値は0ですがQ-boの送信カウントは一回目なので0x00a6の値は1ですがこの処理で0x0f20の値は1にセットされ前述の新しい命令かの判別ではひっかからずこの信号に対しては処理されない事になります。

不具合の対策

 一番簡単な方法としてロビ2の起動時に送信カウントを合わせる処理を行わないようにする事が考えられます。
 この対策をすると既にQ-boが命令を送っていた状態でロビ2を起動するとその命令に反応してしまいます。
 今回問題なっているのはQ-boが一番最初に送信した場合のみなのでこの時のみこの処理を行わないようにします。
 Q-boが一番最初に送信する時は送信カウントが必ず1なので送信カウントが1の場合のみこの処理を行わないようにします。

 しかしこの対策は完全ではなくQ-boが一回のみ送信(送信カウントが1)した時にロビ2を再起動すると最初にこの信号に反応してしまいます。
 このようなケース(Q-boで一回のみ送信して電源オフ)は確率的に低いと思われ万が一このケースになってもロビ2が最初に反応するだけでそれほど致命的だと思われません。
 判別の順番を変えるとかアルゴリズムを変更すれば完璧な対応ができると思いますが別の不具合を出す要因になるので今回はここで止めておきます。


 STARTUP.BINに修正パッチを当てて動かした時の動画です。

   

 ロビ2のパッチファイルは以下のファイルをダウンロードしてください。
  qbo_patch.zip

 次の操作でパッチファイルを適用してください。
 ロビプログラム設定エディタ2を開きます。


 読込みボタンを押してパッチを当てるSTARTUP.BINを読込みます。



 プログラム変更ボタンを押します。



 プログラムバイナリパッチボタンを押します。



 Qboとの通信不具合修正.csvファイルを開きます。



 パッチファイルの適用に成功しましたというダイアログに対してOKボタンを押します。
 プログラムの書出しに成功しましたというダイアログが出るまでSDカードはそのままにしてください。(少し時間がかかる事があります)

 ロビ2のリモート対応プログラムにこのパッチを適用しています。
 STARTUP.BINを置き替えるだけでこの不具合が修正されます。以下のURLよりダウンロードしてください。
 http://www.kumagaya.or.jp/~mcc/robox/RBProgram/Robi2.zip

 なおロビのプログラムにパッチを当てたりプログラムを置き替える時は必ずバックアップを取って自己責任で行ってください。

目次に戻る