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送っているので、 かなりアバウトですがだいたい計算は合いますね。
コメントを残す