#include <RX62N.h>上記は今回検証用に作成したプログラムで、割り込みを使ったシリアル通信を行うAPIを呼び出し、単純にエコーバックしている。
#include <us.h>
#define EI __builtin_rx_setpsw ('I')
void main (void) {
static char txb[100],rxb[100];
EI; // 割り込み許可
PORT3.ICR.BIT.B0 = 1; // P30の入力バッファを有効
PORT3.DDR.BIT.B0 = 0; // P30を入力ポートに指定
PORT1.DDR.BIT.B5 = 1; // P15(LED)を出力ポートに指定
// SCI1をライブラリで初期化
sci1_int_init (3000000, txb, sizeof(txb), rxb, sizeof(rxb));
sci1_int_printf("hello!!\n");
while (1) {
sci1_int_putc (sci1_int_getc ()); // エコーバック
PORT1.DR.BIT.B5 ^= 1; // LED反転
}
}
#include <fd.h>もうちょっとで公開です。
void main (void) {
int16_t now = -1500, p;
// ポートオープン
RS_ChangeBaudrate (230400);
// モータON
fd_RSEnableControl (1, true);
while (!fd_GetPB ()) {
// 位置指令
RS_WriteWordData (1, RS_ADDRESS_GOAL_POSITION, now, 10, NULL);
// 位置取得
RS_ReadWordData (1, RS_ADDRESS_PRESENT_POSITION, &p, 10, NULL);
fd_printf("goal pos=%5d, present pos=%5d\r",now, p);
now += 5;
if (now > 1500) now = -1500;
fd_Wait (10);
}
// モータOFF
fd_RSEnableControl (1, false);
}
仮想アドレス | データ | サイズ |
0 | モータフリー | 1 byte |
1 | 指令位置 | 2 byte |
3 | 現在位置 | 2 byte |
5 | 電流 | 1 byte |
6 | 温度 | 1 byte |
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);
}
#include <SAM3S4.h> #include <piocfg.h> static const TPin pins[] = { { PIO_PA0, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT }, }; int main () { volatile int i; PIO_Configure (pins, PIO_LISTSIZE (pins)); for (;;) { PIOA->PIO_SODR = 1; for (i = 0; i < 10000; i++); PIOA->PIO_CODR = 1; for (i = 0; i < 10000; i++); } }試しにトグル出力させるプログラムを確認していたら勝手にDutyが変更されていた。