PMX ArduinoLib MemWRITE()
『PMX Library for Arduino』のMemWRITE()関数について解説します。
【解説】
MemWRITEコマンドは、RAM領域のメモリマップにデータを書き込むためのコマンドです。このコマンドを使用することで各種設定値の書き換えや、サーボのトルク指示、動作指令などを実行することができます。
【構文】
status = MemWRITE(ID, address, dataArray[], txDataSize, writeOpt);
【例】
1 2 3 4 |
short newMinVoltageLimit = 9500; // MemWRITEで新しく書き込むデータ byte txDataArray[2]; DataConv::uint16ToBytes(newMinVoltageLimit, txDataArray); // データを2Byteに分割する flag = pmx.MemWRITE(ServoID, PMX::RamAddrList::MinVoltageLimit, txDataArray, 2, 0); |
【パラメータ】
引数1:ID(byte型)
第一引数の「ID」はサーボIDです。「ID」は、MemWRITEコマンドの命令の対象になるサーボを指定しています。「ID」を0に指定すると、ID0のサーボを指定することができます。
引数2:address(unsigned short型)
第二引数の「address」は先頭アドレスです。「先頭アドレス」とは、メモリマップのアドレスを指し、読み出すデータの先頭のアドレスを指定することができます。上記の例では「PMX::RamAddrList::MinVoltageLimit」と書いていますが、これはライブラリ内で定義された変数で、メモリマップのアドレスを指定しています。「PMX::RamAddrList::MinVoltageLimit」には76が代入されていますので、実行の際は76に変換されます。また数値で76と指定しても同じ番地にデータを書き込むことができます。アドレスは『オンラインマニュアル』をご参照ください。
引数3:dataArray[](byte配列型)
第三引数の「dataArray」は書込データです。サーボに書き込むデータを第三引数で渡します。書込データはリトルエンディアンで1バイトずつに分割したデータをbyte型の配列で渡します。2バイト以上のデータを1バイトずつに変換する方法は、下記の【データを用意する方法】をご参照ください。
引数4:txDataSize(int型)
第四引数の「txDataSize」は書き込むデータのサイズです。例で書き込むデータは2Byteですので2を指定しています。
引数5:writeOpt(byte型)
第五引数の「writeOpt」は、サーボがトルクオンの状態でMemWRITEコマンドの実行を許可するかを指定できます。許可する場合は1、許可しない場合は0を渡します。
【データを用意する方法】
このライブラリには、データを分割するためのuint16ToBytes()という便利な関数が用意されています。この関数を使用することで簡単にデータをbytes型の配列に変換することができます。
1 2 3 |
short newMinVoltageLimit = 9500; // MemWRITEで新しく書き込むデータ byte txDataArray[2]; DataConv::uint16ToBytes(newMinVoltageLimit, txDataArray); // データを2Byteに分割する |
第一引数のに元のデータ、第二引数にリトルエンディアンに変換したデータを受け取る配列のポインタを渡します。uint16ToBytes()が実行されるとtxDataArray[]にデータが入っていますので、そのままMemWRITE()の引数3:dataArray[]として使用することができます。
他にもデータの型に合わせて関数を用意しています。
1 2 3 4 5 6 7 8 9 10 11 |
// 符号あり2byte型の場合 static void int16ToBytes(short shortData, unsigned char byteDatas[]); // 符号なし2byte型の場合 static void uint16ToBytes(unsigned short wordData, unsigned char byteDatas[]); // 符号あり4byte型の場合 static void int32ToBytes(long longData, unsigned char byteDatas[]); // 符号なし4byte型の場合 static void uint32ToBytes(unsigned long dwordData, unsigned char byteDatas[]); |
【戻り値】
戻り値:status(unsigned short型)
戻り値は、サーボとの通信状態とサーボの状態が正常かどうかのステータスを足したものが返ってきます。データが0であれば問題ありません。0以外の場合は、なんらかの問題が発生していますので、ステータス部がエラーの場合はオンラインマニュアルの『5.エラー状態』、または『PmxStatusErrorList』を、通信部がエラーの場合は『ComError』を参照してください。
status = PMXからの返信のステータス(PMX::PmxStatusErrorList) + 送受信の状態(PMX::ComError)