PMX ArduinoLib MotorWRITE()
『PMX Library for Arduino』のMotorWRITE()関数について解説します。
プログラムの詳細はサンプルプログラム「MotorWRITE_Single_Sample.ino」をご参照ください。
【解説】
MotorWRITEコマンドは、PMXサーボの動作を指示するためのコマンドです。このコマンドを使用することで、命令を受け取ったサーボは設定された「制御モード」に合わせて動作します。また、パケットを受け取った返事として「応答データ指定」で指定したデータを含んで返事を返します。
・使用手順
①「制御モード」を指定する
②「応答データ指定」を指定する
③「トルクスイッチ」の設定をTorqueONに指定する
④「MotorWRITE」コマンドで動作指示をする
【構文】
status = MotorWRITE(ID, writeDatas[], writeDataCount, receiveMode, receiveData[8], controlMode);
【例】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
byte writeOpt = 1; // ①制御モードを指定する byte controlMode = PMX::ControlMode::Position; // 位置制御モード値 flag = pmx.setControlMode(ServoID, controlMode, writeOpt); // ②応答データ指定を指定する byte receiveMode = PMX::ReceiveDataOption::Full; // すべて返す flag = pmx.setMotorReceive(ServoID, receiveMode, writeOpt); // ③トルクスイッチの設定をTorqueONにする long receiveData[8]; flag = pmx.setMotorTorqueOn(ServoID, receiveMode, receiveData, controlMode); // ④MotorWRITE関数で動作指令 long pos = 0; // 目標位置 int writeDataCount = 1; long writeDatas[1] = {pos}; flag = pmx.MotorWRITE(ServoID, writeDatas, writeDataCount, receiveMode, receiveData, controlMode); Serial.print("MotorWRITE="); Serial.println(flag, HEX); // 目標地点に到達するまで待ちます delay(2000); |
【パラメータ】
引数1:ID(byte型)
第一引数の「ID」はサーボIDです。「ID」は、MotorWRITEコマンドの命令の対象になるサーボを指定しています。「ID」を0に指定すると、ID0のサーボを指定することができます。
引数2:writeDatas[](long配列型)
第二引数の「writeDatas[]」は動作指示データです。各制御モードに合わせた数値を送り、サーボを動かします。位置制御の場合は角度を送ります。例えば、PMX-SCR-5204HVは-320°~320°の範囲で角度を指示できますが、単位は1/100[°]ですので、サーボに送信する「動作指示データ」は-32000~32000の範囲になります。サーボに100°を指示する場合は10000を送信します。
PMXサーボの特徴として、制御を組み合わせることができます。このためMotorWRITE()関数の第二引数の動作指示データは配列になっています。組み合わせが一つの場合はデータも一つ、組み合わせが二つの場合は二つのデータを送ります。今回は組み合わせが一つですので[pos]として一つのデータを引数にしています。二つの場合は[0, 0]、三つの場合は[0, 0, 0]のように用意します。
引数3:writeDataCount(int型)
第三引数の「writeDataCount」は、書き込む「writeDatas[]」の数を指定します。制御モードの組み合わせが1つのときは"1"、2つのときは"2"を渡します。
引数4:receiveMode(byte型)
第四引数の「receiveMode」は「応答データ指定」の設定値を渡します。
引数5:receiveData[8](long配列型)
第五引数の「readMotorData[8]」は読み出したデータを格納するための配列です。応答モードが設定されていない項目でも"None"を返しますのでデータ数に関係なく、必ず8個の配列を用意してください。
引数6:controlMode(byte型)
第六引数の「controlMode」は「制御モード」の設定値を渡します。PMXサーボは位置制御モードを含む場合と、速度制御のみなど無限回転する動作の場合で現在位置の値が異なります。そのため、「制御モード」を渡すことで読み出した現在位置を正しいデータに変換して返してもらいます。
位置制御モードを含む場合=-320度~320度の範囲で検出
無限回転動作の場合=0度~359度の範囲で検出
詳しくは「パラメータ読み出し」をご参照ください。
以上の引数を持ったMotorWRITE()関数を、サンプルの通り0を指定して実行すると、サーボが0°の位置に移動します。
【動作指示データ】
動作指示データは、制御モードにより単位が異なります。またサーボの機種により設定できる範囲が異なります。
・制御モードによる違い
位置制御: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サーボはメモリマップの「指令制限値」を読み出すことで各機種の指令値の制限値を知ることができます。
【戻り値】
戻り値:status(unsigned short型)
戻り値は、サーボとの通信状態とサーボの状態が正常かどうかのステータスを足したものが返ってきます。データが0であれば問題ありません。0以外の場合は、なんらかの問題が発生していますので、ステータス部がエラーの場合はオンラインマニュアルの『5.エラー状態』、または『PmxStatusErrorList』を、通信部がエラーの場合は『ComError』を参照してください。
status = PMXからの返信のステータス(PMX::PmxStatusErrorList) + 送受信の状態(PMX::ComError)