B3Mサーボモータを動かそう(C#位置制御編)

Posted on 2015.12.21 in

 

【関連記事】

  第1回 B3Mサーボモータを動かそう(準備編(1))(改訂版)

  第2回 B3Mサーボモータを動かそう(準備編(2))

  第3回 B3Mサーボモータを動かそう(C#下準備編)

  第5回 B3Mサーボモータを動かそう(Arduino制御編)(改訂版)

  第6回 B3Mサーボモータを動かそう(Python編(1))(改訂版)

 

 

B3Mサーボモータをプログラムで動かす

前回、Visual StudioのC#を用いてライブラリの読み込みや通信設定を行いました。

今回は、実際に角度を指定して、その角度まで動作させてみます

角度指定

B3Mサーボモータを動かす手順

B3Mサーボモータを動かす手順は、下記のようになります。

①B3Mサーボモータの動作モードをFreeにします

②制御モードを変更します

③制御モードに応じてゲインを変更します

④B3Mサーボモータの動作モードをNormalにします

⑤目標値を設定します

 

今回は位置制御モードで角度指令を行いその角度に動くようにします。

出荷設定では位置制御モード、位置制御用のゲインに設定していますので、②、③は省略します。

 

プログラム作成する前に

今回解説するプログラムではボタン等を用います。

以下がサンプルプログラムのスクリーンショットになります。

B3MSampleProgramSS

 

それぞれのボタンには下記機能が実装されます。

Free B3Mサーボモータの動作モードをFreeにします。
Normal B3Mサーボモータの動作モードをNormalにします。
SetPos 角度を指定してB3Mサーボモータを動かします。
getPos B3Mサーボモータの現在角度を取得します。

 

Normalモードに設定する方法

B3Mサーボモータは電源投入時、意図せず動かないようにFreeに設定されています。

動かすにはFreeからNormal(トルクON)状態にする必要があります。

Normalモードに設定するには、Writeコマンドで0x28番地のデータを変更します。

まずは、0x28番地の値を変更する関数を作成しました。

コマンドを送信し、成功するとSynchronizeはtrueを返し、何もデータが返ってこなく、失敗した場合はfalseが返ってきます。

0x28番地は制御モードも含まれますので、Normalモードと位置制御モードの論理和(OR)をとった値になります。

Normalモードにするには、上記関数のmodeにデータを渡すことでモードが変更できます。

 

フリーモードも同様に関数化しておきます。

関数化しましたので、あとは実際にこの関数を呼びます。

今回のプログラムでは、ボタンをクリックしたときにこれらの関数を呼ぶようにしました。

 

ノーマルボタンが押されたときに呼ばれるイベント関数

 

フリーボタンが押されたときに呼ばれるイベント関数

今回、IDを指定できるよう、NumericUpDownを配置してその値を呼ぶようにしています。

これを実行してみます。

IDをセットして、Freeボタンをクリックすると、脱力するのでホーンが手で回せるようになります。また、Normalボタンをクリックすると手では回らないようになります。

また、IDが違うとエラーメッセージが出ることが確認できると思います。

 

目標位置を指定する

次に、目標位置をB3Mサーボモータに送ります。

目標位置を設定するには2種類ありますが、今回はPositionコマンドを用います。

これを関数化すると下記の通りになります。

軌道生成の時間の概念についてはソフトウェアマニュアルをご覧ください。

角度は、実際の角度を100倍した値を用います(1度 => 100になります)。

ボタンをクリックした時に、この関数を呼ぶようにしました。

ID以外にも角度を指定できるよう、NumericUpDownを配置してその値を用います。

これを実行しますが、Normalモードになっていないと動きませんので、先ほど作成したNormalモードのボタンをクリックしておきます。

IDおよび角度指定のNumericUpDownで指定された角度に動くことが確認できると思います。

 

現在角度を取得する

さて、目標位置へ動いたはずですが、実際に目標位置に到達したかどうかを確認するためB3Mサーボモータの位置情報の取得も行いたいと思います。

現在位置は0x2C番地から2byte分データが格納されます。

データを読み取るためには、Readコマンドを用います。

角度取得コマンドを実装すると、下記の通りになります。

2byteのデータを取得する場合、リトルエンディアンで保存されていますので、変換するときに注意が必要です。

 

下記は、ボタンをクリックしたときに指定したIDの現在位置を取得し、それをNumericUpDownに代入、表示を行うイベント関数です。

Freeの場合でもNormalの場合でも現在の位置が取得できるようになりました。

 

まとめ

今回、動作モードを変更する、指令位置を送る方法、現在位置を読み取る方法を解説いたしました。

これらをまとめると、下記のようになります。

動作 コマンド アドレス(番地) アクセスするデータ数
動作モードを変更  Write 0x28 1Byte
目標位置を送る  Position - -
現在位置を読み取る  Read 0x2C 2Byte

 

Readコマンドを用いる事でデータを取得し、Writeコマンドでデータを書き込むことができます。

アドレスを変更することで違うデータの読み込み、書き込みができるようになります。

また、Byte数を変更することで、続いているデータの読み込みや書き込みもできるようになります。

これらを応用することで、現在の電流を取得したりゲインの変更等ができるようになります。

サンプルプログラム

最後に今回解説しました内容に関して、サンプルプログラムを公開します。

参考にしてください。

【ダウンロード】B3M_Sample_C#_20160405

2018.4.20追記 ダウンロードを再開しました。

 

 

第1回 B3Mサーボモータを動かそう(準備編(1))

第2回 B3Mサーボモータを動かそう(準備編(2))

第3回 B3Mサーボモータを動かそう(C#下準備編)

 

 

B3M-SB-1040-Aの詳細をみる B3M-SC-1040-Aの詳細をみる B3M-SC-1170-Aの詳細をみる の詳細をみる RS485USB/シリアル変換アダプターの詳細をみる