先にお知らせした内容の問い合わせをいただいたので、ちょっと出し。
ICS3.0ないし3.5の近藤科学社製モータであればOK。残念ながらボーレートの誤差が抑え切れない都合から、最大通信速度が115.2kまでの対応。
ICS対応のサーボモータは制御する上での情報がメモリマップとして提供されていないため、FDIIIライブラリ内に以下の様な仮想メモリマップを構成し、それらに対してAPIからアクセスするといった方式を採用。
仮想アドレス |
データ |
サイズ |
0 |
モータフリー |
1 byte |
1 |
指令位置 |
2 byte |
3 |
現在位置 |
2 byte |
5 |
電流 |
1 byte |
6 |
温度 |
1 byte |
サーボモータのEEPROM領域の割り当ては無い。
主なAPIを以下に抜粋。
- ホストボーレート変更
bool KRS_ChangeBaudrate (uint32_t baudrate)
- バイト書き込み
bool KRS_WriteByteData (uint8_t id, uint8_t adr, uint8_t data, uint32_t timeout, uint16_t *errcode)
- ワード書き込み
bool KRS_WriteWordData (uint8_t id, uint8_t adr, uint16_t data, uint32_t timeout, uint16_t *errcode)
- バイト読み出し
bool KRS_ReadByteData (uint8_t id, uint8_t adr, uint8_t *data, uint32_t timeout, uint16_t *errcode)
- ワード書き込み
bool KRS_ReadWordData (uint8_t id, uint8_t adr, uint16_t *data, uint32_t timeout, uint16_t *errcode)
- 同期書き込み
bool KRS_WriteSyncData (uint8_t *data, uint8_t size, uint16_t *errcode)
IDと仮想アドレスを指定して各APIを呼べば、適宜ICSのプロトコルに変換してサーボモータとおしゃべりしてくれる。
例としてID=0のサーボモータに位置を指令してさらに現在位置を取得する事を繰り返すプログラムを作ってみた。少しだけ紹介していないAPIも使っているが、そこそこシンプルでしょう。
#include <fd.h>
void main (void) {
uint16_t now = 0, p;
// ポートオープン
KRS_ChangeBaudrate (115200);
while (!fd_GetPB ()) {
// 位置指令
KRS_WriteWordData (0, KRS_ADDRESS_GOAL_POSITION, now, 5, NULL);
// 位置取得
KRS_ReadWordData (0, KRS_ADDRESS_PRESENT_POSITION, &p, 5, NULL);
fd_printf("goal pos=%5d, present pos=%5d\r", now, p);
now += 10;
if (now > 16383) now = 0;
fd_Wait (10);
}
// モータOFF
fd_KRSEnableControl (0, false);
}