Robotのページ
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.