RPU-10でサーボ通信(ロングパケット)の速度
シリーズ化しつつありますが、20個サーボへのロングパケットも実測で速度を測ってみました。
//----------------------------------------------------------------------------------------
// 20個サーボの制御
// サーボの通信速度をLEDのポートを利用して実測します。
//
// 環境 RPU-10、GDL V2.00
// 説明 ビルドされた本プログラムをRPU-10へ転送後、パソコン側で「SIMPLE TERM」(GDLに
// 同梱)などを使って通信速度115200bpsで通信ポートを開いてください。その後RPU-10
// を再起動するとプログラムがスタートします。
//
// AUTHORED BY Micchy@DreamDrive!!
//----------------------------------------------------------------------------------------
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include <stdio.h>
#include <avr/boot.h>
#include <avr/wdt.h>
#include <sv.h>
#include <rs.h>
#include <../ATmega128/rs0_printf_P.c> // URART0用フォーマット(ROM用)
// 定数定義
#define SERVO_MAX 20 // 制御対象サーボ数
// 通信バッファ
unsigned char GRaucTBuff[256]; // RS485通信用バッファ
SRV_PACKET GOAL_svPacket[SERVO_MAX+1]; // サーボの目標値(G-ROBOTSのIDが1始まりなので+1
//
// サーボ動作管理
// 要求された時間、角度により、分割した角度指示をサーボに行います。
//
void sendAngles( void ){
unsigned char ucID;
SRV_PACKET asvrPacket[SERVO_MAX];
for( ucID = 0; ucID < SERVO_MAX; ucID++ ){
asvrPacket[ucID].id = ucID + 1;
asvrPacket[ucID].angle =GOAL_svPacket[ucID+1].angle;
asvrPacket[ucID].time = 0;
}
SV_TxPacket( GRaucTBuff, 0, 0x00, 0x1E, 5, 20, (unsigned char*)asvrPacket, 100 );
}
//
// メインルーチン
//
int main( void ){
unsigned char ucID; // サーボID
RPU_InitConsole( br115200 ); // RPU-10ライブラリの初期化
SV_Init( br115200 ); // サーボ制御ライブラリの初期化
sei(); // 割り込み処理開始
// 1秒待つ(よく知らないけど必要らしい)
RPU_ResetTimerCounter();
while( RPU_GetTimerCounter10() < 100 );
// 起動メッセージの表示
rs0_puts_P( PSTR( "サーボ20個通信テストn" ));
// サーボトルクオン
for( ucID = 0; ucID < SERVO_MAX; ucID++ ){
SV_TorqueOnOff( GRaucTBuff, ucID+1, 1 );
}
// 全サーボホームポジション(0)設定
for( ucID = 0; ucID < SERVO_MAX; ucID++ ){
GOAL_svPacket[ucID+1].angle=0;
}
while( 1 ){
LED_ON; //LED点灯
sendAngles(); //角度送信
LED_OFF; //LED消灯
sendAngles(); //角度送信
}
return 1;
}

こちらは10msec弱といったところでしょうか。
115200bpsで(100+α)byte送っているので、 かなりアバウトですがだいたい計算は合いますね。

コメントを残す