4: 2021-09-09 (木) 17:49:32 takaboo ソース 現: 2023-03-21 (火) 18:09:15 takaboo ソース
Line 1: Line 1:
-DXSHIELDを[[ソフトウェアシリアル>#ee08b548]]もしくは[[ハードウェアシリアル>#ce79cebb]]モードに設定した場合、ArduinoのスケッチからDynamixelを制御するためのライブラリが利用できます。+TITLE:DXLIB for Arduino 
-PC版DYNAMIXEL Protocol [[1.0>Dynamixel Library]]/[[2.0>Dynamixel Protocol 2 Library]] Libraryと同様にプロトコルやシリアル通信を意識せずともコントロールテーブルへの読み書きが行えますが、Arduino版は一部機能を限定したサブセット版となります。+Dynamixelを制御するためのプログラムを作成する際のライブラリを提供します。Arduino IDEにライブラリをインストールして使用します。
 +PC版DYNAMIXEL Protocol [[1.0>Dynamixel Library]]/[[2.0>Dynamixel Protocol 2 Library]] Libraryと同様にコントロールテーブルへの読み書きを行うAPIを用意しています。なおAVRではメモリの都合からV1.5から追加されたライブラリは使用できないのと、クラスのインスタンス化の際の引数が以前のバージョンから大幅に変更されている点に注意が必要です。
--ライブラリのダウンロード(Arduino UNO/MEGAを想定)~ +-ライブラリのダウンロード
---dxlib1.4_for_arduino.zip (2022/6中旬公開予定)+-- 
 +#ref(dxlib1.5_for_arduino.zip)~ 
 +---定義の修正を行ったため一部β版との互換性なし 
 +---Arduino UNO以外も対象とするためにソースからシリアルライブラリに関する記述を削除し、シリアル通信にかかる8つのハンドラを新たに設置 
 +---Arduino UNOに限って初期化を始め送受信にかかるハンドラをソフトウェアシリアルとハードウェアシリアル用に提供 
 +---AVRを除くターゲットに適用した場合、PCやARM系マイコン用に提供しているDXLIBに[[追加されたAPI>DXL_intuitive]]が使用可能~ 
 +詳細は追って公開 
 +---仕様変更に伴うサンプルプログラム修正 
 + 
 +-- 
 +#ref(dxlib1.4_for_arduino.zip)
---チェックサムの検証を厳密化 ---チェックサムの検証を厳密化
---新たにReadBlockDataとWriteBlockData関数を追加し、コントロールテーブルの読み出し及び書き込みはこの関数を介するように変更 ---新たにReadBlockDataとWriteBlockData関数を追加し、コントロールテーブルの読み出し及び書き込みはこの関数を介するように変更
----プロトコルV2の例外時(0xFF 0xFF 0xFDの並びでデータが現れた場合に末尾に0xFDが付与)に0xFDの自動除去をReadBlockDataへ追加(制約あり)+---プロトコルV2の例外時(0xFF 0xFF 0xFDの並びでデータが現れた場合に末尾に0xFDを付与)の処理を全ての関数へ適用(一部制約あり)
---コンパイル時のwarningを抑止 ---コンパイル時のwarningを抑止
 +---多少サンプルプログラムの構成を変更
 +---Win版dxlibからアイテムのアドレスをマクロ定義したヘッダをコピー
-- --
Line 31: Line 44:
インストールが完了すると、ユーザーフォルダ配下に「Arduino/libraries/dxlib」が作られ、ライブラリのソースといくつかのサンプルプログラムがその中に展開されます。詳しくはサンプルプログラムとライブラリのソースを参照して下さい。~ インストールが完了すると、ユーザーフォルダ配下に「Arduino/libraries/dxlib」が作られ、ライブラリのソースといくつかのサンプルプログラムがその中に展開されます。詳しくはサンプルプログラムとライブラリのソースを参照して下さい。~
-DXLIB v1.2以降で使用できるヘッダファイルとAPIは以下の通りです。+DXLIB v1.5以降で使用できるヘッダファイルとAPIは以下の通りです。
-&color(#0099ff){''dxlib.h''};~ -&color(#0099ff){''dxlib.h''};~
-[[DYNAMIXEL Communiation Protocol 1.0]]対応デバイスを対象とする場合、'''dxlib.h'''をスケッチにインクルードする事で'''DXLIB'''クラスが利用できるようになります。なお、Arduinoのリソースの都合から、'''dx2lib.h'''との共存はできません。+[[DYNAMIXEL Communiation Protocol 1.0]]対応デバイスを対象とする場合、'''dxlib.h'''をスケッチにインクルードする事で'''DXLIB'''クラスが利用できるようになります。'''dx2lib.h'''との共存は想定していません。
#html{{ #html{{
-<pre class="brush: c;">+<pre class="brush:c; highlight:[1];">
#include <dxlib.h> #include <dxlib.h>
-DXLIB dxif (true); // select software serial+#include "avr_uno_softserial.h" 
 +const DXLIB::TDXHost_ConfParam param { 
 +  us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush 
 +}; 
 + 
 +DXLIB dxif ((DX2LIB::TDXHost_ConfParam *)&param); 
void setup() { void setup() {
  dxif.begin (57600);   dxif.begin (57600);
Line 43: Line 62:
}} }}
-&color(#0099ff){''dx2lib.h''};~ -&color(#0099ff){''dx2lib.h''};~
-[[DYNAMIXEL Communiation Protocol 2.0]]対応デバイスを対象とする場合、'''dx2lib.h'''をスケッチにインクルードする事で'''DX2LIB'''クラスが利用できるようになります。なお、Arduinoのリソースの都合から、'''dxlib.h'''との共存はできません。+[[DYNAMIXEL Communiation Protocol 2.0]]対応デバイスを対象とする場合、'''dx2lib.h'''をスケッチにインクルードする事で'''DX2LIB'''クラスが利用できるようになります。'''dxlib.h'''との共存は想定していません。
#html{{ #html{{
-<pre class="brush: c;"> +<pre class="brush:c;  highlight:[1];"> 
-#include <dxlib.h> +#include <dx2lib.h> 
-DX2LIB dxif (true); // select software serial+#include "avr_uno_softserial.h" 
 +const DX2LIB::TDXHost_ConfParam param { 
 +  us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush 
 +}; 
 + 
 +DX2LIB dxif ((DX2LIB::TDXHost_ConfParam *)&;param); 
void setup() { void setup() {
  dxif.begin (57600);   dxif.begin (57600);
}</pre> }</pre>
}} }}
--&color(#0099ff){''DXLIB/DX2LIB'' (bool ss, HardwareSerial *hws, uint8_t rxpin, uint8_t txpin)};~ + 
-ヘッダファイルに応じて'''DXLIB'''ないし'''DX2LIB'''いずれかのクラスが使用できます。同時にソフトウェアシリアルの使用('''ss''')・ハードウェアシリアルオブジェクト('''hws''')・受信端子('''rxpin''')・送信端子('''txpin''')を指定した上でオブジェクトを生成できます。+-&color(#0099ff){DXLIB/DX2LIB::''TDXHost_ConfParam''};~ 
-なお、'''ss'''にtrueを指定したら[[ソフトウェアシリアルモード>#ee08b548]]、falseを指定したら[[ハードウェアシリアルモード>#ce79cebb]]にDXSHIELDを設定しなくてはなりません。~ +ライブラリv1.5より導入された通信を担う8つの関数のポインタを保持する構造体で、クラスをインスタンス化する際に引数として渡します。
-また、'''hws'''や'''rxpin'''、'''txpin'''は通常指定する必要はありませんが、他のSHIELDやArduinoの機能の都合で使用できない場合に限り指定します。+各メンバーの関数のプロトタイプに合わせた通信処理関数を予め作成しておく必要があります。
#html{{ #html{{
-<pre class="brush: c;"> +<pre class="brush:c;  highlight:[48];"> 
-#include <dxlib.h> +// Assuming HardwareSerial of Arduino UNO 
-// dxifの名前でDynamixel Protocol V.2 Libraryをインスタンス化 +#include <dx2lib.h> 
-// ソフトウェアシリアルモードで使用 + 
-DX2LIB dxif(true);</pre>+// Initialize UART 
 +uint32_t us_init (uint32_t baud) { 
 +  Serial.begin (baud); 
 +  Serial.setTimeout (20); 
 +  return baud; 
 +
 + 
 +// Terminate use of UART 
 +void us_deinit (void) { 
 +  Serial.end(); 
 +
 + 
 +// Changing the baudrate 
 +uint32_t us_setbaudrate (uint32_t baud) { 
 +  us_deinit(); 
 +  return us_init (baud); 
 +
 + 
 +// Purge receive buffer 
 +void us_rxpurge (void) { 
 +  while (Serial.available()) Serial.read(); 
 +
 + 
 +// Send one byte 
 +void us_putc (uint8_t c) { 
 +  Serial.write (c); 
 +
 + 
 +// Send specified number of bytes 
 +void us_puts (const uint8_t *buf, int len) { 
 +  Serial.write (buf, len); 
 +
 + 
 +// Receive specified number of bytes (Timeout must be set in advance) 
 +int us_gets (uint8_t *buf, int len) { 
 +  return Serial.readBytes (buf, len); 
 +
 + 
 +// Waiting for transmission completion 
 +void us_flush (void) { 
 +  Serial.flush(); 
 +
 + 
 +// Enclose each communication function in a structure 
 +const DX2LIB::TDXHost_ConfParam param { 
 +  us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush 
 +}; 
 + 
 +DX2LIB dx2 ((DX2LIB::TDXHost_ConfParam *)&param); 
 +</pre> 
 +}} 
 +なおライブラリに同梱されるサンプルスケッチでは '''avr_uno_hardserial.h''' と '''avr_uno_softserial.h''' のヘッダファイルにArduino UNOを前提としたこれらの通信処理関数がまとめて記述してあります。 
 +-&color(#0099ff){''DXLIB/DX2LIB'' (const PDXHost_ConfParam param)};~ 
 +ヘッダファイルに応じて'''DXLIB'''ないし'''DX2LIB'''いずれかのクラスが使用できます。外部で定義したシリアル通信処理部分をまとめた構造体'''TDXHost_ConfParam'''を指定した上でオブジェクトを生成できます。 
 +#html{{ 
 +<pre class="brush:c; highlight:[3,4,11];"> 
 +#include <dx2lib.h> 
 +// Select SoftwareSerial 
 +//#include "avr_uno_hardserial.h" 
 +#include "avr_uno_softserial.h" 
 + 
 +const DX2LIB::TDXHost_ConfParam param { 
 +  us_init, us_deinit, us_setbaudrate, us_rxpurge, us_putc, us_puts, us_gets, us_flush 
 +}; 
 + 
 +// Instantiate Dynamixel Protocol V.2 Library with the name dxif 
 +DX2LIB dxif((DX2LIB::TDXHost_ConfParam *)&;param); 
 +</pre>
}} }}
-&color(#0099ff){void DXLIB/DX2LIB::''begin'' (long baud)};~ -&color(#0099ff){void DXLIB/DX2LIB::''begin'' (long baud)};~
ライブラリを使用可能にします。引数('''baud''')にはDynamixelに設定されたボーレートを指定します。~ ライブラリを使用可能にします。引数('''baud''')にはDynamixelに設定されたボーレートを指定します。~
-なお、選択したモードにより使用できるボーレートに制限があります。+ボーレートの精度や範囲は使用するシリアルポートに依存します。
#html{{ #html{{
-// 生成されたdxifを57143bpsで初期化+<pre class="brush: c;"> 
 +// Initialize dxif at 57143bps
void setup() { void setup() {
  dxif.begin (57143);   dxif.begin (57143);
Line 76: Line 169:
#html{{ #html{{
<pre class="brush: c;"> <pre class="brush: c;">
-// ID=1へPingインストラクションパケットを送信+// Send ping instruction packet to ID=1
dxif.TxPacket (1, 0x01, NULL, 0);</pre> dxif.TxPacket (1, 0x01, NULL, 0);</pre>
}} }}
Line 85: Line 178:
uint8_t buf[10], id, err; uint8_t buf[10], id, err;
uint16_t len; uint16_t len;
-// ID=1へPingインストラクションパケットを送信+// Send ping instruction packet to ID=1
dxif.TxPacket (1, 0x01, NULL, 0); dxif.TxPacket (1, 0x01, NULL, 0);
-// ステータスパケットを受信 +// Receive status packet 
-dxif.RxPacket (buf, sizeof (buf), &id, &len, &err)</pre>+dxif.RxPacket (buf, sizeof (buf), &amp;id, &amp;len, &amp;err)</pre> 
 +}} 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''ReadBlockData'' (uint8_t id, uint16_t addr, uint8_t *data, uint16_t len, uint8_t *err)};~ 
 +指定されたID('''id''')・アドレス('''addr''')から8ビットのデータを'''data'''へ'''len'''の長さ分読み出します。'''err'''にはDynamixelのエラーが返ります。&br; 
 +なおDX2LIBで4バイト以上を読み出す場合、まずサフィックスが付与された状態でdataへ読み出し、その後に必要に応じてサフィックス削除が行われます。そのため実際に必要なサイズよりも大きめにdataを確保しておく必要があります(最大で1.34倍)。 
 +#html{{ 
 +<pre class="brush: c;"> 
 +// Get Compliance for AX-12 with ID=1 
 +uint8_t compliance[4]; 
 +dxif.ReadBlockData (1, 26, &compliance, 4, NULL);</pre>
}} }}
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadByteData'' (uint8_t id, uint16_t addr, uint8_t *data, uint8_t *err)};~ -&color(#0099ff){bool DXLIB/DX2LIB::''ReadByteData'' (uint8_t id, uint16_t addr, uint8_t *data, uint8_t *err)};~
Line 94: Line 196:
#html{{ #html{{
<pre class="brush: c;"> <pre class="brush: c;">
-// ID=1のAX-12のLEDを取得+// Get the status of the LED on AX-12 with ID=1
uint8_t led; uint8_t led;
-dxif.ReadByteData (1, 25, &led, NULL);</pre>+dxif.ReadByteData (1, 25, &amp;led, NULL);</pre>
}} }}
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadWordData'' (uint8_t id, uint16_t addr, uint16_t *data, uint8_t *err)};~ -&color(#0099ff){bool DXLIB/DX2LIB::''ReadWordData'' (uint8_t id, uint16_t addr, uint16_t *data, uint8_t *err)};~
Line 102: Line 204:
#html{{ #html{{
<pre class="brush: c;"> <pre class="brush: c;">
-// ID=1のAX-12からPresentPositionを取得+// Get PresentPosition from AX-12 with ID=1
uint16_t ppos; uint16_t ppos;
-dxif.ReadWordData (id, 36, &ppos, NULL);</pre>+dxif.ReadWordData (id, 36, &amp;ppos, NULL);</pre>
}} }}
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadLongData'' (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)};~ -&color(#0099ff){bool DXLIB/DX2LIB::''ReadLongData'' (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')から32ビットのデータを'''data'''へ読み出します。'''err'''にはDynamixelのエラーが返ります。 指定されたID('''id''')・アドレス('''addr''')から32ビットのデータを'''data'''へ読み出します。'''err'''にはDynamixelのエラーが返ります。
 +
 +-&color(#0099ff){bool DXLIB/DX2LIB::''WriteBlockData'' (uint8_t id, uint16_t addr, const uint8_t *data, uint16_t len, uint8_t *err)};~
 +指定されたID('''id''')・アドレス('''addr''')・8ビットのデータ('''data''')・指定バイト数('''len''')をDynamixelに書き込みます。'''err'''にはDynamixelのエラーが返ります。
 +#html{{
 +<pre class="brush: c;">
 +// Set Compliance for AX-12 with ID=1
 +uint8_t err;
 +uint8_t compliance[4] = {1,1,32,32};
 +dxif.WriteBlockData (1, 26, &compliance, 4, &err);</pre>
 +}}
 +
-&color(#0099ff){bool DXLIB/DX2LIB::''WriteByteData'' (uint8_t id, uint16_t addr, uint8_t data, uint8_t *err)};~ -&color(#0099ff){bool DXLIB/DX2LIB::''WriteByteData'' (uint8_t id, uint16_t addr, uint8_t data, uint8_t *err)};~
指定されたID('''id''')・アドレス('''addr''')・8ビットのデータ('''data''')をDynamixelに書き込みます。'''err'''にはDynamixelのエラーが返ります。 指定されたID('''id''')・アドレス('''addr''')・8ビットのデータ('''data''')をDynamixelに書き込みます。'''err'''にはDynamixelのエラーが返ります。
#html{{ #html{{
<pre class="brush: c;"> <pre class="brush: c;">
-// ID=1のAX-12のLEDを点灯+// Lights up the LED of AX-12 with ID=1
uint8_t err; uint8_t err;
-dxif.WriteByteData (id, 25, 1, &err);</pre>+dxif.WriteByteData (id, 25, 1, &amp;err);</pre>
}} }}
-&color(#0099ff){bool DXLIB/DX2LIB::''WriteWordData'' (uint8_t id, uint16_t addr, uint16_t data, uint8_t *err)};~ -&color(#0099ff){bool DXLIB/DX2LIB::''WriteWordData'' (uint8_t id, uint16_t addr, uint16_t data, uint8_t *err)};~
Line 120: Line 233:
#html{{ #html{{
<pre class="brush: c;"> <pre class="brush: c;">
-// ID=1のAX-12のGoalPositionを511に変更+// Set GoalPosition of AX-12 with ID=1 to 511
dxif.WriteWordData (id, 30, 511, NULL);</pre> dxif.WriteWordData (id, 30, 511, NULL);</pre>
}} }}
Line 129: Line 242:
#html{{ #html{{
<pre class="brush: c;"> <pre class="brush: c;">
-// ID=1~5の5個のAX-12のLEDへ点滅を指令+// Lights up AX-12 LEDs with ID=1 to 5
uint8_t ids={1,2,3,4,5}; uint8_t ids={1,2,3,4,5};
uint16_t leds={1,1,1,1,1}; uint16_t leds={1,1,1,1,1};
Line 138: Line 251:
#html{{ #html{{
<pre class="brush: c;"> <pre class="brush: c;">
-// ID=1~5の5個のAX-12に個別のGoalPositionを指令+// Set different GoalPositions for each AX-12 with ID=1-5
uint8_t ids={1,2,3,4,5}; uint8_t ids={1,2,3,4,5};
uint16_t poss={100,200,300,400,500}; uint16_t poss={100,200,300,400,500};
Line 150: Line 263:
指定されたID('''id''')のDynamixelを出荷時状態に戻します。'''err'''にはDynamixelのエラーが返ります。 指定されたID('''id''')のDynamixelを出荷時状態に戻します。'''err'''にはDynamixelのエラーが返ります。
-また、Arduino IDEのバージョンによっては「SoftwareSerial.h: No such file or directory」のコンパイルエラーが発生しますので、その場合は自身のスケッチの先頭に以下の1行を挿入してコンパイルします。 +以降のAPIはライブラリv1.5から新設されたAPIで、AVRシリーズを除いたターゲットで使用できます。詳細は[[こちら>DXL_intuitive]]を参照してください。 
-#html{{ +-&color(#0099ff){int DXLIB/DX2LIB::''ScanDevices'' (uint8_t *ids)}; 
-&lt;pre class="brush: c;"&gt+-&color(#0099ff){PDXL_ModelInfo DXLIB/DX2LIB::''GetModelInfo'' (uint8_t id)}; 
-#include &lt;SoftwareSerial.h&gt;&lt;/pre&gt+-&color(#0099ff){bool DXLIB/DX2LIB::''PrintDevicesList'' (int (*pf) (const char *, ...))}; 
-}}+-&color(#0099ff){void DXLIB/DX2LIB::''InitDevicesList'' (void)}; 
 +-&color(#0099ff){TErrorCode DXLIB/DX2LIB::''GetErrorCode'' (uint8_t id)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetHWErrorCode'' (uint8_t id, uint8_t *hwerr)}
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetDriveMode'' (uint8_t id, uint8_t mode)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetDriveModesEquival'' (const uint8_t *ids, int num, uint8_t mode)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetOperatingMode'' (uint8_t id, uint8_t mode)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetOperatingModesEquival​'' (const uint8_t *ids, int num, uint8_t mode)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetOperatingMode'' (uint8_t id, uint8_t *mode)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetLED'' (uint8_t id, bool en)}
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetTorqueEnable'' (uint8_t id, bool en)}
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetTorqueEnables'' (const uint8_t *ids, const bool *ens, int num)}
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetTorqueEnablesEquival'​' (const uint8_t *ids, int num, bool en)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetTorqueEnable'' (uint8_t id, bool *en)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetTorqueEnables'' (const uint8_t *ids, bool *en, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngle'' (uint8_t id, double angle)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngles'' (const uint8_t *ids, const double *angles, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentAngle'' (uint8_t id, double *angle)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentAngles'' (const uint8_t *ids, double *angles, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''StandStillAngle'' (uint8_t id)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''StandStillAngles'' (const uint8_t *ids, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalVelocity'' (uint8_t id, double velocity)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalVelocities'' (const uint8_t *ids, const double *velocities, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentVelocity'' (uint8_t id, double *velocity)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentVelocities'' (const uint8_t *ids, double *velocities, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngleAndVelocity'​' (uint8_t id, double angle, double velocity)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAnglesAndVelociti​es'' (const uint8_t *ids, PAngleVelocity anglevelocity, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngleAndTime'' (uint8_t id, double angle, double sec)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAnglesAndTime'' (const uint8_t *ids, const double *angles, int num, double sec)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAngleAndTime2'' (uint8_t id, double angle, double sec)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalAnglesAndTime2'' (const uint8_t *ids, const double *angles, int num, double sec)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalCurrent'' (uint8_t id, double current)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalCurrents'' (const uint8_t *ids, const double *currents, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentCurrent'' (uint8_t id, double *current)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentCurrents'' (const uint8_t *ids, double *currents, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalPWM'' (uint8_t id, double pwm)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''SetGoalPWMs'' (const uint8_t *ids, const double *pwms, int num)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentPWM'' (uint8_t id, double *pwm)}; 
 +-&color(#0099ff){bool DXLIB/DX2LIB::''GetPresentPWMs'' (const uint8_t *ids, double *pwms, int num)};


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom