6: 2022-06-08 (水) 09:09:54 takaboo[6] [7] | 現: 2023-03-21 (火) 18:09:15 takaboo[6] [8] | ||
---|---|---|---|
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から追加されたライブラリは使用できないのと、クラスのインスタンス化の際の引数が以前のバージョンから大幅に変更されている点に注意が必要です。 | ||
+ | |||
+ | -ライブラリのダウンロード~ | ||
+ | -- | ||
+ | #ref(dxlib1.5_for_arduino.zip)~ | ||
+ | ---定義の修正を行ったため一部β版との互換性なし | ||
+ | ---Arduino UNO以外も対象とするためにソースからシリアルライブラリに関する記述を削除し、シリアル通信にかかる8つのハンドラを新たに設置 | ||
+ | ---Arduino UNOに限って初期化を始め送受信にかかるハンドラをソフトウェアシリアルとハードウェアシリアル用に提供 | ||
+ | ---AVRを除くターゲットに適用した場合、PCやARM系マイコン用に提供しているDXLIBに[[追加されたAPI>DXL_intuitive]]が使用可能~ | ||
+ | 詳細は追って公開 | ||
+ | ---仕様変更に伴うサンプルプログラム修正 | ||
- | -ライブラリのダウンロード(Arduino UNO/MEGAを想定)~ | ||
-- | -- | ||
#ref(dxlib1.4_for_arduino.zip) | #ref(dxlib1.4_for_arduino.zip) | ||
Line 34: | Line 44: | ||
インストールが完了すると、ユーザーフォルダ配下に「Arduino/libraries/dxlib」が作られ、ライブラリのソースといくつかのサンプルプログラムがその中に展開されます。詳しくはサンプルプログラムとライブラリのソースを参照して下さい。~ | インストールが完了すると、ユーザーフォルダ配下に「Arduino/libraries/dxlib」が作られ、ライブラリのソースといくつかのサンプルプログラムがその中に展開されます。詳しくはサンプルプログラムとライブラリのソースを参照して下さい。~ | ||
- | DXLIB v1.4以降で使用できるヘッダファイルと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 *)¶m); | ||
void setup() { | void setup() { | ||
dxif.begin (57600); | dxif.begin (57600); | ||
Line 46: | 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 *)¶m); | ||
+ | </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{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // 生成されたdxifを57143bpsで初期化 | + | // Initialize dxif at 57143bps |
void setup() { | void setup() { | ||
dxif.begin (57143); | dxif.begin (57143); | ||
Line 80: | 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 89: | 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), &id, &len, &err)</pre> |
}} | }} | ||
-&color(#0099ff){bool DXLIB/DX2LIB::''ReadBlockData'' (uint8_t id, uint16_t addr, uint8_t *data, uint16_t len, uint8_t *err)};~ | -&color(#0099ff){bool DXLIB/DX2LIB::''ReadBlockData'' (uint8_t id, uint16_t addr, uint8_t *data, uint16_t len, uint8_t *err)};~ | ||
Line 99: | Line 188: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12のComplianceを取得 | + | // Get Compliance for AX-12 with ID=1 |
uint8_t compliance[4]; | uint8_t compliance[4]; | ||
- | dxif.ReadBlockData (1, 26, &compliance, 4, NULL);</pre> | + | 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 107: | 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, &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 115: | 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, &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)};~ | ||
Line 126: | Line 215: | ||
#html{{ | #html{{ | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
- | // ID=1のAX-12のComplianceを設定 | + | // Set Compliance for AX-12 with ID=1 |
uint8_t err; | uint8_t err; | ||
uint8_t compliance[4] = {1,1,32,32}; | uint8_t compliance[4] = {1,1,32,32}; | ||
- | dxif.WriteBlockData (1, 26, &compliance, 4, NULL);</pre> | + | dxif.WriteBlockData (1, 26, &compliance, 4, &err);</pre> |
}} | }} | ||
Line 136: | Line 225: | ||
#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, &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 144: | 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 153: | 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 162: | 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 174: | 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)}; |
- | <pre class="brush: c;"> | + | -&color(#0099ff){PDXL_ModelInfo DXLIB/DX2LIB::''GetModelInfo'' (uint8_t id)}; |
- | #include <SoftwareSerial.h></pre> | + | -&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::''SetGoalAnglesAndVelocities'' (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)}; |
(This host) = https://www.besttechnology.co.jp