近藤科学のシリアルサーボKRS-2542は、マイコンから位置コマンドを受け取ると、自動的に現在位置を返す仕組みだ。
Webの指示通りにシリアル通信の受信プログラムを組むが、なぜか上手く読み取れない。試行錯誤の末、位置コマンドを3バイト送出した後に、現在位置を3バイト分じゃなく4バイト分読み取り、3と4バイト目を処理することで現在位置を読み取ることができた。送信と受信の間隔を空けたことになるのだろう。自作関数は以下の通り。
int16_t ICS_sync (uint8_t id, int16_t pos)
{
unsigned char tx[3]; //送信用のデータ
unsigned char rx[4]; //受信用のデータ
int16_t dat; //現在位置を計算するための変数
tx[0] = (unsigned char)(0b10000000 | id);
tx[1] = (unsigned char)(pos >> 7 & 0b01111111);
tx[2] = (unsigned char)(pos & 0b01111111);
HAL_UART_Transmit(&huart1, (uint8_t *)&tx, 3, 1);
HAL_UART_Receive(&huart1, (uint8_t *)&rx, 4, 1);
dat = (int16_t)(rx[2] & 0x7F);
dat = (dat << 7) + (int16_t)rx[3];
return dat;
}
読み取ったデータをもとに位置コマンドと現在位置の時間変化をグラフにしてみると、回転速度はカタログ値よりも若干いい値を示していた。
KRS-2542の初期設定上、シリアル通信速度は115,200bpsで、1回の位置コマンド送出と現在位置受取に0.6ms程度かかっており、もっと短時間で処理したい。また、槍用サーボとステアリング用サーボをデイジーチェーン接続するにはサーボのIDを違える必要がある。これを解決するには、サーボの初期設定を書き換える近藤科学の専用ツールを導入しなければならない。