実験方法
・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") ;
}
|