DXSHIELDをソフトウェアシリアルもしくはハードウェアシリアルモードに設定した場合、ArduinoのスケッチからDynamixelを制御するためのライブラリが利用できます。
PC版DYNAMIXEL Protocol 1.0/2.0 Libraryと同様にプロトコルやシリアル通信を意識せずともコントロールテーブルへの読み書きが行えますが、Arduino版は一部機能を限定したサブセット版となります。

  • ライブラリのダウンロード(Arduino UNO/MEGAを想定)
    • Dynamixel Protocol V.2に対応
      低位の送受信関数追加
      32bitデータの送受信関数追加
      アドレスとサイズに関する引数は全て16bitに統一

DXLIBのインストールは、ArduinoのIDEの「スケッチ→ライブラリのインクルード→.ZIP形式のライブラリをインストール...」メニューを使用してダウンロードしたZIPファイルを選択するだけです。
インストールが完了すると、ユーザーフォルダ配下に「Arduino/libraries/dxlib」が作られ、ライブラリのソースといくつかのサンプルプログラムがその中に展開されます。詳しくはサンプルプログラムとライブラリのソースを参照して下さい。

DXLIB v1.2以降で使用できるヘッダファイルとAPIは以下の通りです。

  • dxlib.h
    DYNAMIXEL Communiation Protocol 1.0対応デバイスを対象とする場合、dxlib.hをスケッチにインクルードする事でDXLIBクラスが利用できるようになります。なお、Arduinoのリソースの都合から、dx2lib.hとの共存はできません。
    #include <dxlib.h>
    DXLIB dxif (true); // select software serial
    void setup() {
      dxif.begin (57600);
    }
  • dx2lib.h
    DYNAMIXEL Communiation Protocol 2.0対応デバイスを対象とする場合、dx2lib.hをスケッチにインクルードする事でDX2LIBクラスが利用できるようになります。なお、Arduinoのリソースの都合から、dxlib.hとの共存はできません。
    #include <dx2lib.h>
    DX2LIB dxif (true); // select software serial
    void setup() {
      dxif.begin (57600);
    }
  • DXLIB/DX2LIB (bool ss, HardwareSerial *hws, uint8_t rxpin, uint8_t txpin)
    ヘッダファイルに応じてDXLIBないしDX2LIBいずれかのクラスが使用できます。同時にソフトウェアシリアルの使用(ss)・ハードウェアシリアルオブジェクト(hws)・受信端子(rxpin)・送信端子(txpin)を指定した上でオブジェクトを生成できます。
    なお、ssにtrueを指定したらソフトウェアシリアルモード、falseを指定したらハードウェアシリアルモードにDXSHIELDを設定しなくてはなりません。
    また、hwsrxpintxpinは通常指定する必要はありませんが、他のSHIELDやArduinoの機能の都合で使用できない場合に限り指定します。
    #include <dx2lib.h>
    // dxifの名前でDynamixel Protocol V.2 Libraryをインスタンス化
    // ソフトウェアシリアルモードで使用
    DX2LIB dxif(true);
  • void DXLIB/DX2LIB::begin (long baud)
    ライブラリを使用可能にします。引数(baud)にはDynamixelに設定されたボーレートを指定します。
    なお、選択したモードにより使用できるボーレートに制限があります。
    // 生成されたdxifを57143bpsで初期化
    void setup() {
      dxif.begin (57143);
    }
  • bool DXLIB/DX2LIB::TxPacket (uint8_t id, uint8_t inst, uint8_t *param, uint16_t len)
    指定されたID(id)・インストラクション(inst)・パラメータ(param)・パラメータ長(len)のインストラクションパケットを送信します。
    // ID=1へPingインストラクションパケットを送信
    dxif.TxPacket (1, 0x01, NULL, 0);
  • bool DXLIB/DX2LIB::RxPacket (uint8_t *rdata, uint16_t rdatasize, uint8_t *rid, uint16_t *rlen, uint8_t *err)
    ステータスパケットを受信します。成功するとパケット内のパラメータがrdataへコピーされ、そのパラメータのサイズがrlenに返されます。なお、ステータスパケットを受信するのに十分なサイズを確保し、そのポインタをrdataへ、サイズをrdatasizeに指定します。ridにはID、errにはDynamixelのエラーが返ります。
    uint8_t buf[10], id, err;
    uint16_t len;
    // ID=1へPingインストラクションパケットを送信
    dxif.TxPacket (1, 0x01, NULL, 0);
    // ステータスパケットを受信
    dxif.RxPacket (buf, sizeof (buf), &id, &len, &err)
  • bool DXLIB/DX2LIB::ReadByteData (uint8_t id, uint16_t addr, uint8_t *data, uint8_t *err)
    指定されたID(id)・アドレス(addr)から8ビットのデータをdataへ読み出します。errにはDynamixelのエラーが返ります。
    // ID=1のAX-12のLEDを取得
    uint8_t led;
    dxif.ReadByteData (1, 25, &led, NULL);
  • bool DXLIB/DX2LIB::ReadWordData (uint8_t id, uint16_t addr, uint16_t *data, uint8_t *err)
    指定されたID(id)・アドレス(addr)から16ビットのデータをdataへ読み出します。errにはDynamixelのエラーが返ります。
    // ID=1のAX-12からPresentPositionを取得
    uint16_t ppos;
    dxif.ReadWordData (id, 36, &ppos, NULL);
  • bool DXLIB/DX2LIB::ReadLongData (uint8_t id, uint16_t addr, uint32_t *data, uint8_t *err)
    指定されたID(id)・アドレス(addr)から32ビットのデータをdataへ読み出します。errにはDynamixelのエラーが返ります。
  • 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=1のAX-12のLEDを点灯
    uint8_t err;
    dxif.WriteByteData (id, 25, 1, &err);
  • bool DXLIB/DX2LIB::WriteWordData (uint8_t id, uint16_t addr, uint16_t data, uint8_t *err)
    指定されたID(id)・アドレス(addr)・16ビットのデータ(data)をDynamixelに書き込みます。errにはDynamixelのエラーが返ります。
    // ID=1のAX-12のGoalPositionを511に変更
    dxif.WriteWordData (id, 30, 511, NULL);
  • bool DXLIB/DX2LIB::WriteLongData (uint8_t id, uint16_t addr, uint32_t data, uint8_t *err)
    指定されたID(id)・アドレス(addr)・32ビットのデータ(data)をDynamixelに書き込みます。errにはDynamixelのエラーが返ります。
  • bool DXLIB/DX2LIB::WriteSyncByteData (const uint8_t *pid, uint16_t addr, const uint8_t *pdata, int num)
    指定されたid数(num)分のIDの配列(pid)・アドレス(addr)・8ビットのデータ配列(pdata)をDynamixelに書き込みます。
    // ID=1~5の5個のAX-12のLEDへ点滅を指令
    uint8_t ids={1,2,3,4,5};
    uint16_t leds={1,1,1,1,1};
    dxif.WriteSyncByteData (ids, 30, leds, 5);
  • bool DXLIB/DX2LIB::WriteSyncWordData (const uint8_t *pid, uint16_t addr, const uint16_t *pdata, int num)
    指定されたid数(num)分のIDの配列(pid)・アドレス(addr)・16ビットのデータ配列(pdata)をDynamixelに書き込みます。
    // ID=1~5の5個のAX-12に個別のGoalPositionを指令
    uint8_t ids={1,2,3,4,5};
    uint16_t poss={100,200,300,400,500};
    dxif.WriteSyncWordData (ids, 30, ppos, 5);
  • bool DXLIB/DX2LIB::WriteSyncLongData (const uint8_t *pid, uint16_t addr, const uint32_t *pdata, int num)
    指定されたid数(num)分のIDの配列(pid)・アドレス(addr)・32ビットのデータ配列(pdata)をDynamixelに書き込みます。
  • bool DXLIB/DX2LIB::Ping (uint8_t id, uint16_t *err)
    指定されたID(id)のDynamixelを検索します。errにはDynamixelのエラーが返ります。
  • bool DXLIB/DX2LIB::Reset (uint8_t id, uint16_t *err)
    指定されたID(id)のDynamixelを出荷時状態に戻します。errにはDynamixelのエラーが返ります。

また、Arduino IDEのバージョンによっては「SoftwareSerial.h: No such file or directory」のコンパイルエラーが発生しますので、その場合は自信のスケッチの先頭に以下の1行を挿入してコンパイルします。

#include <SoftwareSerial.h>

Front page   Diff ReloadPrint View   Page list Search Recent changes   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Last-modified: 2018-12-02 (Sun) 21:05:16 (JST) (170d)