PMX PythonLib MotorWRITE()
『PMX Library for Python』のMotorWRITE()関数について解説します。
プログラムの詳細は、サンプルプログラム「MotorWRITE_Single_Sample.py」、「MotorWRITE_Speed_Sample.py」をご参照ください。
【解説】
MotorWRITEコマンドは、PMXサーボの動作を指示するためのコマンドです。このコマンドを使用することで、命令を受け取ったサーボは設定された「制御モード」に合わせて動作します。また、パケットを受け取った返事として「応答データ指定」で指定したデータを含んで返事を返します。
・使用手順
①「制御モード」を指定する
②「応答データ指定」を指定する
③「トルクスイッチ」の設定をTorqueONに指定する
④「MotorWRITE」コマンドで動作指示をする
【構文】
.[status, torqueSwitch, [rxDataList]] = MotorWRITE(ID, option, controlMode, receiveMode, [Data])
【例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# ①制御モードを指定する controlMode = PMX.ControlMode.Position # 位置制御モード値 status = pmx.setControlMode(ServoID, controlMode, writeOpt=0x01) # ②応答データ指定を指定する receiveMode = PMX.ReceiveDataOption.Full # すべて返す status = pmx.setMotorReceive(ServoID, receiveMode, writeOpt=0x01) # ③トルクスイッチの設定をTorqueONにする status, torqueswitch, reData = pmx.setMotorTorqueOn(ServoID, receiveMode) # ④サーボに動作指令 pos = -32000 # 目標位置 status, torqueswitch, reData = pmx.MotorWRITE(ServoID, 0, controlMode, receiveMode, [pos]) print("MotorWRITE", hex(status), torqueswitch, reData) # 目標地点に到達するまで待ちます time.sleep(2) |
【パラメータ】
引数1:ID(int型)
第一引数の「ID」はサーボIDです。「ID」は、MemREADコマンドの命令の対象になるサーボを指定しています。「ID」を0に指定すると、ID0のサーボを指定することができます。
引数2:option(int型)
第二引数は、「option」です。MotorWRITEコマンドはoptionにより実行する機能を指定することができます。
機能1:トルクスイッチを設定する
一つ目は、トルクスイッチです。サーボをTorqueON、Free、Brake、Holdの状態に設定することができます。これは、アドレス500の「トルクスイッチ」にデータを書き込んでも同じ処理を実行することができます。また、このライブラリを使用する場合は、概要の③で解説した通り各モードの関数をご用意してありますので、関数を使用することをお勧めします。
機能2:サーボに動作指示をする
二つ目は、サーボの動作指示です。この場合は「option」を0に指定します。今回は動作指示の為にMotorWRITEコマンドを実行しますので「option」の引数は0を渡します。
引数3:controlMode(int型)
引数4:receiveMode(int型)
第三引数、第四引数は「controlMode(制御モード)」と「receiveMode(応答データ指定)」です。「制御モード」の内容と、「応答データ指定」で返ってくるデータの内容を関数に伝えるために引数として渡します。上記のプログラムで用意した「controlMode」「receiveMode」変数の内容を変えずにそのまま使用します。
引数5:[Data](int型のリスト)
第五引数は、「動作指示データ」です。各制御モードに合わせた数値を送り、サーボを動かします。位置制御の場合は角度を送ります。例えば、PMX-SCR-5204HVは-320°~320°の範囲で角度を指示できますが、単位は1/100[°]ですので、サーボに送信する「動作指示データ」は-32000~32000の範囲になります。サーボに100°を指示する場合は10000を送信します。
PMXサーボの特徴として、制御を組み合わせることができます。このためMotorWRITE()関数の第五引数の「動作指示データ」はリストになっています。組み合わせが一つの場合はデータも一つ、組み合わせが二つの場合は二つのデータを送ります。今回は組み合わせが一つですので[pos]として一つのデータを引数にしています。二つの場合は[0, 0]、三つの場合は[0, 0, 0]のように用意します。
以上の引数を持ったMotorWRITE()関数を、サンプルの通り-32000を指定して実行すると、サーボが-320°の位置に移動します。
【動作指示データ】
動作指示データは、制御モードにより単位が異なります。またサーボの機種により設定できる範囲が異なります。
・制御モードによる違い
位置制御:1/100° 例)1000=10°
速度制御:1/10°/S 例)1000=100°/S
電流制御:mA 例)1000=1000mA
トルク制御:mN・m 例)1000=1N・m
PWM制御:デューティ比1/100% 例)10000=100%
移動時間:ms 例)1000=1000ms
・機種による違い
機種によりギヤ比やモータが異なりますので、出力できる速度、電流などに違いがあります。PMXサーボはメモリマップの「指令制限値」を読み出すことで各機種の指令値の制限値を知ることができます。『PMX Library for Python』のprintAllRange()関数を使用することですべての制限値を一気に読み出すことができます。
【戻り値】
戻り値1:status(int型)
一つ目の戻り値は、サーボとの通信状態とサーボの状態が正常かどうかのステータスを足したものが返ってきます。データが0であれば問題ありません。0以外の場合は、なんらかの問題が発生していますので、ステータス部がエラーの場合はオンラインマニュアルの『5.エラー状態』を、通信部がエラーの場合は『ComError』を参照してください。
戻り値2:torqueSwitch(int型)
二つ目の戻り値は、トルクスイッチの現在の状態です。
戻り値3:rxDataList(int型のリスト)
三つ目の戻り値として読み出したデータが返ってきます。データは「応答データ指定」のbit0から順番にリストにまとまっています。