16: 2021-09-17 (金) 22:09:36 takaboo | 17: 2021-10-03 (日) 21:54:42 takaboo | ||
---|---|---|---|
Line 2: | Line 2: | ||
**概要 [#va21cbfb] | **概要 [#va21cbfb] | ||
Dynamixel Protocol 2 Libraryは[[DYNAMIXEL Communiation Protocol 2.0]]に対応した製品をWindows等のOSから操作するためのライブラリ集です。~ | Dynamixel Protocol 2 Libraryは[[DYNAMIXEL Communiation Protocol 2.0]]に対応した製品をWindows等のOSから操作するためのライブラリ集です。~ | ||
- | シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等をライブラリ内で行うため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。 | + | シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等をライブラリ内で行うため、シリアル通信である事をほとんど意識する事無くアプリケーションの作りこみに専念できます。 |
- | なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE068C]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTE079C]]・[[BTE080C]]・[[BTE096]]・[[BTX229>http://emanual.robotis.com/docs/en/parts/interface/u2d2/]]・[[BTE100]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。 | + | なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE068C]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTE079C]]・[[BTE080C]]・[[BTE096]]・[[BTX229>http://emanual.robotis.com/docs/en/parts/interface/u2d2/]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。[[BTE100]]の場合はRaspberry Piに依存します。 |
|CENTER:BGCOLOR(red): :idea:|[[DYNAMIXEL Communiation Protocol 1.0]]と[[DYNAMIXEL Communiation Protocol 2.0]]を装備した装置を同一ネットワーク上で同時に運用する事は推奨できない。| | |CENTER:BGCOLOR(red): :idea:|[[DYNAMIXEL Communiation Protocol 1.0]]と[[DYNAMIXEL Communiation Protocol 2.0]]を装備した装置を同一ネットワーク上で同時に運用する事は推奨できない。| | ||
Line 10: | Line 10: | ||
**ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] | **ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] | ||
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | ||
- | -2021/10/? Ver.2.8~ | + | -''2021/10/8 Ver.2.8''~ |
+ | #ref(https://www.besttechnology.co.jp/download/DX2LIB_V2.8.zip) | ||
更新内容 | 更新内容 | ||
--タイムアウトのデフォルトオフセット時間を30msに変更 | --タイムアウトのデフォルトオフセット時間を30msに変更 | ||
--全プラットホームにおけるコンパイル時のウォーニング抑止 | --全プラットホームにおけるコンパイル時のウォーニング抑止 | ||
--Linux上における非標準ボーレート指定を許容 | --Linux上における非標準ボーレート指定を許容 | ||
+ | --makedll.batとbuild_dxlib.shの内容を一部変更 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
--Dynamixelの最新ファームに備わったTime-based profileに対応したAPI(DXL_SetDriveMode, DXL_SetDriveModesEquival, DXL_SetGoalAngleAndTime2, DXL_SetGoalAnglesAndTime2)を追加 | --Dynamixelの最新ファームに備わったTime-based profileに対応したAPI(DXL_SetDriveMode, DXL_SetDriveModesEquival, DXL_SetGoalAngleAndTime2, DXL_SetGoalAnglesAndTime2)を追加 | ||
- | --macOS暫定対応 | + | --暫定的にmacOSへ対応 |
--C言語のサンプルコードをプラットホーム共通に | --C言語のサンプルコードをプラットホーム共通に | ||
- | -''2021/07/20 Ver.2.7''~ | + | --放置していたRubyのサンプルを修正 |
+ | -2021/07/20 Ver.2.7~ | ||
#ref(https://www.besttechnology.co.jp/download/DX2LIB_V2.7.zip) | #ref(https://www.besttechnology.co.jp/download/DX2LIB_V2.7.zip) | ||
更新内容 | 更新内容 | ||
Line 59: | Line 63: | ||
--ベータリリース~ | --ベータリリース~ | ||
- | アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください(ベータ版では一部欠損)。 | + | 最新版のアーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。 |
|DX2LIB|dx2lib_x32.dll|<|ライブラリ本体 | | |DX2LIB|dx2lib_x32.dll|<|ライブラリ本体 | | ||
|~|dx2lib_x64.dll|<|~| | |~|dx2lib_x64.dll|<|~| | ||
Line 75: | Line 79: | ||
|~|83.bat|<|~| | |~|83.bat|<|~| | ||
|~|build_dx2lib.sh|<|Linux向けライブラリ再構築用スクリプト | | |~|build_dx2lib.sh|<|Linux向けライブラリ再構築用スクリプト | | ||
- | |SampleCode|GCCDeveloperLite|smpl??.c |サンプル | | + | |SampleCode|C|smpl??.c |サンプル | |
+ | |~|~|dxmisc.h |サンプル共通設定 | | ||
+ | |~|~|kbhit.h |kbhitエミュレーション | | ||
+ | |~|~|makefile |サンプルコンパイル用makefile | | ||
+ | |~|~|makewin.bat|Windows向け再構築用バッチ | | ||
+ | |~|~|83.bat|~| | ||
|~|~|dx2lib.h |DX2LIBフォルダに収録されるものと同一 | | |~|~|dx2lib.h |DX2LIBフォルダに収録されるものと同一 | | ||
|~|~|dx2memmap.h |~| | |~|~|dx2memmap.h |~| | ||
Line 87: | Line 96: | ||
|~|~|dx2lib_x64.dll |~| | |~|~|dx2lib_x64.dll |~| | ||
|~|Python|smpl??.py |サンプル | | |~|Python|smpl??.py |サンプル | | ||
+ | |~|~|kbhit.py |kbhitエミュレーション | | ||
|~|~|dx2lib.py |DX2LIBフォルダに収録されるものと同一 | | |~|~|dx2lib.py |DX2LIBフォルダに収録されるものと同一 | | ||
|~|~|dx2lib_x32.dll |~| | |~|~|dx2lib_x32.dll |~| | ||
Line 98: | Line 108: | ||
|~|~|dx2lib_x32.dll |DX2LIBフォルダに収録されるものと同一 | | |~|~|dx2lib_x32.dll |DX2LIBフォルダに収録されるものと同一 | | ||
|~|~|dx2lib_x64.dll |~| | |~|~|dx2lib_x64.dll |~| | ||
- | |~|Linux|smpl??.c |サンプル | | + | |~|Ruby|smpl??.rb |サンプル | |
- | |~|~|kbhit.h |kbhitエミュレーション | | + | |~|~|dx2lib_x32.dll |DX2LIBフォルダに収録されるものと同一 | |
- | |~|~|makefile |サンプルコンパイル用makefile | | + | |~|~|dx2lib_x64.dll |~| |
- | |~|~|dx2lib.h |DX2LIBフォルダに収録されるものと同一 | | + | |
- | |~|~|dx2memmap.h |~| | + | |
- | |~|Ruby|SMPL1.rb |サンプル | | + | |
- | |~|~|SMPL3.rb |~| | + | |
**開発環境毎の設定 [#u3ff03d9] | **開発環境毎の設定 [#u3ff03d9] | ||
Line 111: | Line 117: | ||
***GCC Developer Lite [#e1d4017c] | ***GCC Developer Lite [#e1d4017c] | ||
GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~ | GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~ | ||
- | 'SampleCode\GCCDeveloperLite'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。 | + | 「基本パック」と「WINパック」を[[ダウンロード>GCC Developer Lite#DOWNLOAD]]してインストールしてください。 |
+ | |||
+ | 'SampleCode\C'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。 | ||
****DLLの静的リンク [#la562acf] | ****DLLの静的リンク [#la562acf] | ||
Line 155: | Line 163: | ||
}} | }} | ||
LoadDLLが成功していない状態で各APIを呼び出してはいけません。またDLL自体は実行プログラムと同じフォルダかOSがDLLを検索できる場所に配置しておく必要があります。 | LoadDLLが成功していない状態で各APIを呼び出してはいけません。またDLL自体は実行プログラムと同じフォルダかOSがDLLを検索できる場所に配置しておく必要があります。 | ||
+ | |||
+ | ****サンプルフォルダ内のmakefileを使用 [#a00c8b73] | ||
+ | サンプルをコンパイルするだけならばGCC Developer Liteを起動する必要は無く、サンプルフォルダ内に同梱される「makewin.bat」を実行すればmakefileを読み込んでGCC Developer Liteに同梱されるmakeを使用してコンパイルします。~ | ||
+ | 引数にソース名をしていするとそのソースだけコンパイル、何も付けなければフォルダ内の拡張子がCのソースファイル全てがコンパイル対象となります。 | ||
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | makewin sample2_ping2 (特定のソースのみコンパイル) | ||
+ | makewin (カレントの全ソースをコンパイル) | ||
+ | </pre> | ||
+ | }} | ||
+ | なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。 | ||
+ | #html{{ | ||
+ | <pre class="brush: c;"> | ||
+ | // マクロ定義 | ||
+ | #if _WIN32 // Wiindows時 | ||
+ | #define _COMPORT "\\\\.\\COM3" // ポート名 | ||
+ | #define _COMPORT2 "\\\\.\\COM4" | ||
+ | #else // LinuxやmacOS時 | ||
+ | #define _COMPORT "/dev/ttyUSB0" // ポート名 | ||
+ | #define _COMPORT2 "/dev/ttyUSB1" | ||
+ | #endif | ||
+ | #define _BAUDRATE (57600) // ボーレート[bps] | ||
+ | #define _TARGETID (1) // 対象ID | ||
+ | #define _TARGETID2 (2) // 対象ID | ||
+ | </pre> | ||
+ | }} | ||
+ | |||
+ | またバッチファイル内においてコンパイラなどのツール類へのパスを通す際に64bit環境を優先しています。 | ||
***Microsoft Visual C++ [#j5a74d33] | ***Microsoft Visual C++ [#j5a74d33] | ||
Line 182: | Line 218: | ||
***DELPHI [#bdd8ef87] | ***DELPHI [#bdd8ef87] | ||
'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | 'SampleCode\DELPHI'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | ||
- | [[DELPHI:http://www.embarcadero.com/jp/products/delphi]]はPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事が出来ます。サンプルに含まれるDX2LIB.pas内にdx2lib_x32.dllないしdx2lib_x64.dllを動的にロードする関数を用意しましたので、ユーザソースのuses節にdx2libを追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。 | + | [[DELPHI:http://www.embarcadero.com/jp/products/delphi]]はPASCAL言語によるPC向け開発ツールであり、外部のDLLへ容易にアクセスする事ができます。サンプルに含まれるDX2LIB.pas内にdx2lib_x32.dllないしdx2lib_x64.dllを動的にロードする関数を用意しましたので、ユーザソースのuses節にdx2libを追記すればDynamixel Libraryの各APIへ簡便にアクセスできます。 |
***VB [#p8d7963b] | ***VB [#p8d7963b] | ||
Line 190: | Line 226: | ||
***Ruby [#r63b1e3e] | ***Ruby [#r63b1e3e] | ||
- | 'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | + | 'SampleCode\Ruby'フォルダにサンプルが同梱されます。ライブラリ名・ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ |
- | [[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ | + | [[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のライブラリはfiddleを使用してアクセスします。 |
- | require 'dl/import' | + | #html{{ |
- | molude dx2lib | + | <pre class="brush: ruby;"> |
- | extend DL::Importer | + | require "fiddle/import" |
- | dlload "./dx2lib_x32.dll" | + | |
- | extern "int DX2_OpenPort( char *, long )" | + | module DX2LIB |
- | end | + | extend Fiddle::Importer |
- | devid = dx2lib.DX2_OpenPort( "ポート名", ボーレート ) | + | dlload './dx2lib_x32.dll' |
+ | extern 'void * DX2_OpenPort( const char *, long )' | ||
+ | extern 'char DX2_Active( void * )' | ||
+ | extern 'char DX2_Ping( void *, unsigned char, unsigned short * )' | ||
+ | extern 'char DX2_ClosePort( void * )' | ||
+ | end | ||
+ | |||
+ | devid = dx2lib.DX2_OpenPort( 'ポート名', ボーレート ) | ||
+ | </pre> | ||
+ | }} | ||
+ | |||
+ | LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。 | ||
***Python [#mc6a5a49] | ***Python [#mc6a5a49] | ||
'SampleCode\Python'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | 'SampleCode\Python'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | ||
- | [[Python:http://www.python.jp]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ | + | [[Python:http://www.python.jp]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスできます。~ |
各APIのPython用の宣言を定義したdx2lib.pyをimportするだけで済みます。 | 各APIのPython用の宣言を定義したdx2lib.pyをimportするだけで済みます。 | ||
#html{{ | #html{{ | ||
Line 209: | Line 256: | ||
</pre> | </pre> | ||
}} | }} | ||
+ | なおdx2lib.pyはctypesによるDLLの単純なラッパーに過ぎませんので、Pythonならではの抽象的な定義は何一つ受け付けてくれません。Pythonからプログラミングを始めた方は微妙に扱いづらいかと思いますので、詳細はサンプルコードを参考にしてください。 | ||
+ | |||
+ | LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。 | ||
***Java [#ceff395d] | ***Java [#ceff395d] | ||
Line 234: | Line 284: | ||
***Linux & macOS[#w5c096b8] | ***Linux & macOS[#w5c096b8] | ||
LinuxないしmacOS上でのdx2libのコンパイル方法を紹介します。~ | LinuxないしmacOS上でのdx2libのコンパイル方法を紹介します。~ | ||
- | +コンパイル準備~ | + | +ダウンロードと展開~ |
- | ダウンロードファイルを解凍~ | + | ライブラリのアーカイブファイルをダウンロードし展開~ |
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | wget https://www.besttechnology.co.jp/download/DX2LIB_V2.8.zip | ||
+ | unzip DX2LIB_V2.8.zip | ||
+ | </pre> | ||
+ | }} | ||
+ライブラリ及び共有ライブラリの生成~ | +ライブラリ及び共有ライブラリの生成~ | ||
- | DXLIB2ディレクトリに移動し同梱のスクリプトファイルを実行 | + | DXLIB2ディレクトリに移動し同梱のスクリプトファイルを実行~ |
+ | gccは予めインストールされている必要がある | ||
#html{{ | #html{{ | ||
<pre class="brush: bash;"> | <pre class="brush: bash;"> | ||
+ | cd DX2LIB_v2.8/DX2LIB | ||
bash ./build_dx2lib.sh | bash ./build_dx2lib.sh | ||
</pre> | </pre> | ||
Line 254: | Line 312: | ||
}} | }} | ||
- | なおサンプルプログラムはGCC Developer Liteフォルダに同梱されたものを多少修正したものです。付属のmakefileを介してmakeを使って簡便にコンパイルできます。 | + | 'SampleCode\C'のサンプルプログラムはmakeを使ってコンパイルできます。 |
#html{{ | #html{{ | ||
<pre class="brush: bash;"> | <pre class="brush: bash;"> | ||
Line 261: | Line 319: | ||
</pre> | </pre> | ||
}} | }} | ||
- | コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存しますので、そのまま使用できない場合は適宜ソースを修正下さい。 | + | コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存しますので、そのまま使用できない場合は適宜ソースを修正下さい。またWindowsを前提とした_DYNAMICLOADマクロが宣言されているとコンパイルできません。~ |
+ | なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。 | ||
**API [#ybae1454] | **API [#ybae1454] | ||
Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~ | Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~ | ||
C言語のソースにdx2lib.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 | C言語のソースにdx2lib.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 | ||
+ | |||
+ | ''注意事項'':~ | ||
+ | DynamixelのStatus Return Levelを必ず''2''に設定した上で使用する事。それ以外の値が設定されていた場合はAPIが想定した応答が得られず、タイムアウトするまでAPIから返らない。 | ||
***DX2_OpenPort [#zbd2f6ef] | ***DX2_OpenPort [#zbd2f6ef] | ||
Line 317: | Line 379: | ||
既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ | 既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ | ||
実行すると強制的に受信バッファがクリアされる。~ | 実行すると強制的に受信バッファがクリアされる。~ | ||
- | なお、Linux環境におけるボーレートの設定は、POSIX.1でサポートする値(50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000)であればtcsetattrを使用して処理するが、これらの値に当てはまらない場合はioctrlを使用する。その際I/Fがこれらのボーレートに対応していなかったり、ioctrlをサポートしない場合、本APIは失敗する。 | ||
bool DX2_SetBaudrate (TDeviceID dvid, long baud); | bool DX2_SetBaudrate (TDeviceID dvid, long baud); | ||
-パラメータ | -パラメータ | ||
Line 372: | Line 433: | ||
I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ | I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ | ||
内部で算出している受信タイムアウト時間とタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理する。~ | 内部で算出している受信タイムアウト時間とタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理する。~ | ||
- | デフォルトは20[ms]。 | + | デフォルトは30[ms]。 |
void DX2_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime); | void DX2_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime); | ||
-パラメータ | -パラメータ |