BTX030 Dynamixel AX-12+とは |
安くてそこそこのトルクが出るシリアルサーボ
製造元は韓国のロボティス社
|
|
||||||||||||||||||||||||||||||||||
日本語のマニュアルはベステクさんのHPにあります > こちら 利点
問題点
ただ、単純にPWM送れば動くって訳じゃないんで、ある程度シリアル通信に関しての知識が必要となりますが、そこら辺はマイコンやってる人ならどうにでもなるでしょう。 |
C言語ソースのダウンロード |
ソースのダウンロード
Ver.3.01 - 2007/06/21公開
Ver.2.02 - 2006/12/29公開
Ver.1.51 - 2006/08/31公開
Ver.1.00 - 2006/08/03公開
既知の問題点(手抜き) |
マイコンとの接続 |
必要なものは AX-12
DX-117・RX-64
各サーボの回路図はベストテクノロジーさんのサイトからマニュアルをダウンロードしてください。 ちなみにH8/3052・SH2/7045マイコンは 5V駆動なのでそのまま回路を作成して構いませんが、CQ/Interface付録のSH2/7144基盤は3.3V駆動のため5V駆動のロジックIC・ドライブICを接続すると壊れる可能性があります。レベル変換ICを使用してください。 その際、5V ->
3.3Vのレベル変換ICはSO基盤用のピッチ(1.27mm)が多いので、取り付けは少々難易度が上がります。 |
Dynamixelの通信速度設定 |
では、実際にサーボとマイコンで通信するわけですが、当然通信の速度(ボーレート)がお互いに同じ速度になっていないと、通信できません。
Dynamixelシリーズは初期で57600bps (AX-12+は1Mbps)
に設定されていますが、これには誤差を含んでいます。 実際、今回取り扱う SH2/7144 ・ SH2/7045 ・ H8/3052の中で、初期の57600bpsの設定で通信できるのはH8/3052だけです。 通信速度の設定には、Dynamixel設定用のケーブル「 BTE062 Dynamixel
DX用接続ケーブル」もしくは「BTE063 Dynamixel AX用接続ケーブル」で行えます。 で!
すみません。3052は、普通に通信できたんでちゃんと計算してません;; |
基本的な使い方 |
メイン関数のなかでServo_Init()関数を呼べば、そのあとは全ての関数が使用できるようになります。
基本的にはPos_sav[SAVNUM]のグローバル変数の中身を書き換えてall_send関数を呼べばその角度まで動きます。 基本のソースを載せますと・・・。]
void main(void){ int pos; unsigned int i; //wait用のループ変数 Servo_Init(); //サーボ通信プログラム初期化 Servo_Lock_ALL(); //サーボ通信プログラム誤動作防止用ロック Servo_ON_ALL(); //サーボをその角度で固める for(;;){ //無限ループ for(pos = 0 ; pos < 1024 ; pos++){ //行ったり Pos_sav[0] = pos; all_send(); //全サーボの値を更新 for(i = 0;i < 1000 ; i++); //ウェイト } for(pos = 1023 ; pos > 0 ; pos--){ //来たり Pos_sav[0] = pos; all_send(); //全サーボの値を更新 for(i = 0;i < 1000 ; i++); //ウェイト } } } これで、ID:0のサーボは行ったり来たりを繰り返します。 あとServo_Lock_ALL関数についてですが、これは全てのAX-12のLockアドレスを1にする関数で
、不慮のパケットでIDやボーレートの書き換えを禁止するための命令です。
|
ユーザー関数一覧 |
void Servo_Init(void);
void all_send(void);
int Servo_Read_Torque(unsigned char id);
int Servo_Read_Voltage(unsigned char id);
int Servo_Read_Temperature(unsigned char id);
int Servo_Read_Position(unsigned char id);
int Servo_Read_Speed(unsigned char id);
int Servo_Read_Load(unsigned char id);
void Servo_ON_ALL(void);
void Servo_OFF_ALL(void);
void Servo_Lock_ALL(void);
void Servo_Spd_ALL(int spd);
void Servo_Limitmax_ALL(void);
|
エラーLEDが点滅して動かなくなった。 |
内部温度エラーでトルクオフした際、マニュアルではTorque Enableを1にすればOKと書いてますが、上手くいかなかったのでベステクさんにメールしたところ
とのことでした。 つまるところ、「温度が設定値を超えたとき」「設定したトルク以上の力でモーターが力を受けた」場合に発生するエラーに関して、最命令を実行する前に、
Servo_Limitmax_ALL(); を実行してください。それで、万事OKです。 |
ちょいワザ! |
prstr1("Check ID of AX-12 OnLine ...\n"); //表示 for(i=0 ; i < SAVNUM ; i++){ //サーボの個数分ループ if (Servo_Read_Torque(i) == -1) { } else { sprintf(m,"ID:%03d /",i); prstr1(m); svn++; } if (( i % 10) == 0 ){ prstr1("\n"); } } sprintf(m,"%d個のAX-12モーターが検出されました\n",svn); prstr1(m); エラーのときに「-1」が返ってくるのを利用して表示させます。 |
参考サイト |
Copyright ©2004-2006 HM(みっちー) All Rights Reserved.