Robotのページ

 

BTX030 Dynamixel AX-12+とは



Dynamixel AX-12

安くてそこそこのトルクが出るシリアルサーボ
(クリックでロボット王国から購入できます。)

製造元は韓国のロボティス社
日本での販売は
ベストテクノロジーさん

 

参考保持トルク 12(7V)~16.5(9.6V)kgf•cm
減速比 1/254
速度 0.269(7V)~0.196(9.6V)sec/60°
最大動作角度 300°(Endless turn可)
電源電圧範囲 DC7~12V (Recommended voltage: 9.6V)
最大電流 900mA
動作温度範囲 -5~+85℃
重量 55g
Command Signal デジタルパケット
プロトコル Half duplex Asynchronous Serial Communication
リンク方式 1ワイヤ双方向(5V TTLレベル)
ID数 254 ID (0~253)
通信速度 7343~1Mbps
フィードバック Position, Speed, Load, Temperature, Input Voltage
材質 Engineering Plastic Gear, Engineering Plastic Body
モータ Cored Motor
付属品 ホーン ×1 (出荷時に本体装着済)
リンクフレーム OF-12SH×1, OF-12S×1
ネジキット ×1式
フレキシブルワイヤ 約12cm×1

日本語のマニュアルはベステクさんのHPにあります > 
こちら

利点

  • 価格は4500円とKHR-1のKRS-786ICS-Red Versionより安い
  • トルクもKRS-786ICS-Red Versionよりかなり強い
  • FETが燃えない(燃える前にエラーコードを吐いてストップ)
  • シリアルで角度を送るので、マイコンのタイマの数や精度などで頭を抱えなくて良い!

問題

  • ファイナルギアが金属じゃないのでグニャグニャ(補正をかければそこそこ制御できる)
  • TTLでの通信のためモーション実行中にGNDが瞬間断線すると複数サーボのファームウェアが同時に壊れる(修復不能)
    (LEDが点滅ではなく点灯している場合、だいたいご臨終ですorz )

    ※AXシリーズの問題でありDXシリーズは大丈夫です!

ただ、単純にPWM送れば動くって訳じゃないんで、ある程度シリアル通信に関しての知識が必要となりますが、そこら辺はマイコンやってる人ならどうにでもなるでしょう。
 


 

C言語ソースのダウンロード

 
ソースのダウンロード
 
  SH2/7144(CQ/Interface付録基板用) - Ver.3.01
コンパイラ : High-performance Embedded Workshop
ダウンロード

SH2/7045(秋月 ・ベステク) - Ver.3.01
コンパイラ : GCC Developer Lite
ダウンロード

H8/3052(秋月) - Ver.3.01
コンパイラ : GCC Developer Lite
ダウンロード

Ver.3.01 - 2007/06/21公開

  • Ver.2シリーズに比べて実行がかなり軽く、高速化されました
  • AX-12に加えて、Dynamixelシリーズ(RX-64・DX-117)でも動くことを確認しました、回路は各サーボのマニュアルに掲載されております
  • H8/3052版も新しくしました
  • SH2/7045版が追加されました
  • ユーザー関数名を一新しました。過去のバージョンとの互換性はありません
  • 単独でコンパイルが通るようにmain関数をつけました

Ver.2.02 - 2006/12/29公開

  • 関数名の一部変更(High-performance Embedded Workshopに照準)
  • AX-12からの受信失敗のときに値を返さずエラーコードを返す
    値は引数でポインタでとるよう仕様変更
  • エラー時に復帰させるためax_limitmax関数(トルク設定をMAXにする関数)を追加

 Ver.1.51 - 2006/08/31公開

  • ax_lock関数を追加(書き換え禁止コマンド)
  • stone_ppos関数の仕様を変更(トルク設定によるコマンドに変更)

 Ver.1.00 - 2006/08/03公開

  • 公開開始

既知の問題点(手抜き)
受信データのチェックサムの真偽を書いてません。
既にテストする環境がないので勝手に書き加えるにも行かず放置中・・・。

 

マイコンとの接続


AX-12に関しては単線双方向UART、DX-117・RX-64に関してはRS-485通信の回路を作成する必要があります。
基本的にマイコンとはGND、TxD、RxD、DIRポートの4箇所の接続となります。

必要なものは

AX-12

  • ロジックIC (74HC126)
  • ロジックIC (74HC04)
  • 抵抗 (10kΩ)
  • 抵抗 (47Ω)

DX-117・RX-64

  • 485ドライブIC (MAX485)
  • 抵抗 (10kΩ)
  • セラミックコンデンサ (0.1μF)

各サーボの回路図はベストテクノロジーさんのサイトからマニュアルをダウンロードしてください。

ちなみに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) に設定されていますが、これには誤差を含んでいます。
Dynamixelシリーズでは誤差に対して3%の許容があるのですが、実はマイコンの方も誤差を持っていて、お互いに3%未満の誤差でも、お互いの誤差を合わせると3%以上になって「通信できない」という事が、頻発します。

実際、今回取り扱う SH2/7144 ・ SH2/7045 ・ H8/3052の中で、初期の57600bpsの設定で通信できるのはH8/3052だけです。

通信速度の設定には、Dynamixel設定用のケーブル「 BTE062 Dynamixel DX用接続ケーブル」もしくは「BTE063 Dynamixel AX用接続ケーブル」で行えます。
いろいろ設定できて便利だし、どちらも1000円なので買っていて損はないかもしれません。
(といいつつ、僕はケーブルを持っていませんが・・・。H8/3052で設定用のプログラムを走らせて設定しています。)

で!
じゃあ、いくつに設定したらいいの!?って話ですよね。下に僕の使っている設定をまとめておきます。
ちなみにダウンロードしたソースは下記の設定値に設定されてます。
 

マイコン名 マイコン側(BRRレジスタ) Dynamixel側 誤差
SH2/7144 11(62500bps) 31(62500bps) 0%
SH2/7045 20(42619.04762bps) 46 (42553.19149bps) 1%未満
H8/3052 13( 公称 57600 bps) 34 (57142.9bps) -

すみません。3052は、普通に通信できたんでちゃんと計算してません;;
 

 

基本的な使い方


メイン関数のなかでServo_Init()関数を呼べば、そのあとは全ての関数が使用できるようになります。

基本的にはPos_sav[SAVNUM]のグローバル変数の中身を書き換えてall_send関数を呼べばその角度まで動きます。
Pos_sav[SAVNUM]は、サーボのポジションで、Speed_sav[SAVNUM]はサーボの角速度です。
設定範囲は0〜1023の範囲です。この辺はマニュアルにも記載してありますね。

基本のソースを載せますと・・・。]

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やボーレートの書き換えを禁止するための命令です。
動作中にIDが書き換わると誤動作の原因になるので、プログラムのはじめに実行しておきましょう。
一度実行すると電源を切る以外解除方法がないので、実行中に動的にボーレートやIDを書き換えたい人は実行しなくてもいいです。
普通に使う人はなるべく実行しておきましょう。

 

 

ユーザー関数一覧


void Servo_Init(void);

SCI(Dynamixel通信用)の初期設定
Dynamixel用の変数の初期化

void all_send(void);

シンクライトパケット(全サーボに命令)
全サーボにそれぞれの速度とポジションを送ります

int Servo_Read_Torque(unsigned char id);

トルクを発生しているか否かを受け取る
ID引数を引数にとり、状態をリターン、-1なら受信エラー

int Servo_Read_Voltage(unsigned char id);

現在かかっている電圧を受け取る
ID引数を引数にとり、状態をリターン、-1なら受信エラー
単位は ( n * 100mV )

int Servo_Read_Temperature(unsigned char id);

現在のサーボ温度を受け取る
ID引数を引数にとり、状態をリターン、-1なら受信エラー

int Servo_Read_Position(unsigned char id);

現在のサーボの角度を受け取る
ID引数を引数にとり、状態をリターン、-1なら受信エラー

int Servo_Read_Speed(unsigned char id);

現在のサーボのスピードを受け取る
ID引数を引数にとり、状態をリターン、-1なら受信エラー

int Servo_Read_Load(unsigned char id);

現在サーボにかかっている力と向きを受け取る
ID引数を引数にとり、状態をリターン、-1なら受信エラー
フォーマットはマニュアル参照

void Servo_ON_ALL(void);

現在のポジションで固める

void Servo_OFF_ALL(void);

すべてのサーボの動作をOFFにする。

void Servo_Lock_ALL(void);

AX-12サーボにLockをかけてID等の書き換えを禁止する

void Servo_Spd_ALL(int spd);

すべてのサーボを指定したスピードに設定

void Servo_Limitmax_ALL(void);

トルクリミットをMAXにする(エラーの解除に使用)

 

エラーLEDが点滅して動かなくなった。


内部温度エラーでトルクオフした際、マニュアルではTorque Enableを1にすればOKと書いてますが、上手くいかなかったのでベステクさんにメールしたところ

運用的に従来の方法(アラーム停止→最指令→復帰→連続運用)ではあえて復帰しない様にしてあります。
同時にトルクリミット値が0になりますのでアラーム要因が解消していれば再設定する事で動作します。

とのことでした。

つまるところ、「温度が設定値を超えたとき」「設定したトルク以上の力でモーターが力を受けた」場合に発生するエラーに関して、最命令を実行する前に、

Servo_Limitmax_ALL();

を実行してください。それで、万事OKです。
 

 

ちょいワザ!


接続されているAX-12のIDを一覧で表示する

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」が返ってくるのを利用して表示させます。
SAVNUMは検索する範囲の最大のIDを指定します。全検索の場合、254を代入します。

 

参考サイト

 

 

 


Copyright ©2004-2006 HM(みっちー) All Rights Reserved.