新プログラム環境は見込みあるか?(1)

ROBOの新プログラム環境候補のひとつを少し実験した。ROBOのファームウェアに対して、PCから複数バイト指令を送信する方法が、果たして使い物になるか感触を得るのが目的。【追記】再実験して好感触を得た。

実験方法
・ROBOに複数バイト指令を所定時間間隔で送信し、応答結果が正常か否かを確認

複数バイト指令としては、ファームウェアのバージョン確認指令を採用した
   PC側送信データ:0xF0, 00, 00, 00, 00, 00, 00
 の7バイトを送ると、ROBO側から応答として
   PC側受信データ:0xF0, ID, Ver, Rev, Mem, Heap, Stack
 の7バイトが返送される。

・PC側のバイト送信する時間間隔を変えながら、ROBO側の 応答が追従して正常データが返送されるか否か確認。
  ※プログラム主要部は右欄のとおり。RS232制御用
    のフリーのライブラリ ERSLIB を、ボーランドC++
    用に少し修正して使わせて頂いた。感謝m(_ _)m

結果
PC側のデータ送出間隔が10ミリ秒で問題ないケースもあったが、90ミリ秒以下では正常に返送されないことも。ということは、確実にROBOをコントロールするには、2バイト送信で0.1秒、10バイト送信で約1秒必要になる。
【再実験】
その後、ふと気づいてROBO側プログラムのメインループに入っているREMOCON命令をコメントアウトしたところ、10ミリ秒のデータ送出間隔で全く問題ないと確認。REMOCON命令の処理に260ミリ秒程かかるのが問題のようだ。

リモコンは1バイト単位の送信なので、元々多バイト通信は別手段が前提。サーボモーター個別に角度を指定する類の多数バイト指令でROBOを操縦できそうだ。
void test(int port)
{
 int i, n, rcd ;
 char ibuf[8] ;
 static char obuf[] = {0xF0, 0, 0, 0, 0, 0, 0} ;

 for (i = 0; i < 7; ++i) {
  // 1byte出力
  ERS_Send(port, obuf + i, 1) ;
  Sleep(90) ;//WindowsのSleep関数
         //引数の単位はミリ秒
 //受信バッファのチェック
  rcd = ERS_CheckRecv(port) ;
  fprintf(stderr, "%d bytes in rbuf.\n", rcd) ;
 }
 Sleep(10) ;
 n = ERS_CheckRecv(port) ;
 for (i = 0; i < n; ++i) {
  //受信バッファから1byte取得
  rcd = ERS_Recv(port, ibuf + i, 1) ;
  if (rcd != 1) break ;
  fprintf(stderr, "%02x ", ibuf[i]) ;
 }
 fprintf(stderr, "\n") ;
}
   

※この記事が何かのお役にたつことを願っていますが、記事内容についてのいかなる保証もしません