16: 2021-09-17 (金) 22:09:36 takaboo | 現: 2023-11-12 (日) 00:09:35 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]]・[[BTE074B]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTE079C]]・[[BTE080C]]・[[BTE096]]・[[BTE101]]・[[BTE110]]・[[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~ | + | -''2023/11/6 Ver.3.0''~ |
+ | #ref(https://www.besttechnology.co.jp/download/DX2LIB_V3.0.zip) | ||
+ | 更新内容 | ||
+ | --最新GCC Developer Liteの更新に伴うコンパイル環境の調整 | ||
+ | --python向けのサンプルを拡充 | ||
+ | -2022/3/1 Ver.2.9~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DX2LIB_V2.9.zip) | ||
+ | 更新内容 | ||
+ | --最新GCC Developer Liteの更新に伴うコンパイル環境の調整 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
+ | --コンパイル用バッチファイルの名称を変更 | ||
+ | --バッチファイル中のパスの指定はジャンクションを使用する事で空白を含むファイル名によるコンパイル時の問題を回避 | ||
+ | -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 75: | ||
--ベータリリース~ | --ベータリリース~ | ||
- | アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください(ベータ版では一部欠損)。 | + | 最新版のアーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。 |
|DX2LIB|dx2lib_x32.dll|<|ライブラリ本体 | | |DX2LIB|dx2lib_x32.dll|<|ライブラリ本体 | | ||
|~|dx2lib_x64.dll|<|~| | |~|dx2lib_x64.dll|<|~| | ||
Line 72: | Line 88: | ||
|~|dx2lib_matlab.h|<|matlab用ヘッダ | | |~|dx2lib_matlab.h|<|matlab用ヘッダ | | ||
|~|dx2lib.py|<|python用モジュール | | |~|dx2lib.py|<|python用モジュール | | ||
- | |~|makelib.bat|<|Windows向けライブラリ再構築用バッチ | | + | |~|makelib.cmd|<|Windows向けライブラリ再構築用バッチ | |
- | |~|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 | | ||
+ | |~|~|makeexe.cmd|Windows向け再構築用バッチ | | ||
|~|~|dx2lib.h |DX2LIBフォルダに収録されるものと同一 | | |~|~|dx2lib.h |DX2LIBフォルダに収録されるものと同一 | | ||
|~|~|dx2memmap.h |~| | |~|~|dx2memmap.h |~| | ||
Line 87: | Line 106: | ||
|~|~|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 118: | ||
|~|~|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 127: | ||
***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 134: | Line 152: | ||
動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりソース中でdx2lib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 | 動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりソース中でdx2lib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 | ||
#html{{ | #html{{ | ||
+ | <style type="text/css"> | ||
+ | .syntaxhighlighter { | ||
+ | overflow-y: auto !important; | ||
+ | overflow-x: auto !important; | ||
+ | max-height: 900px; | ||
+ | -webkit-text-size-adjust: 100%; | ||
+ | } | ||
+ | </style> | ||
<pre class="brush: c;"> | <pre class="brush: c;"> | ||
#define _DYNAMICLOAD | #define _DYNAMICLOAD | ||
Line 155: | Line 181: | ||
}} | }} | ||
LoadDLLが成功していない状態で各APIを呼び出してはいけません。またDLL自体は実行プログラムと同じフォルダかOSがDLLを検索できる場所に配置しておく必要があります。 | LoadDLLが成功していない状態で各APIを呼び出してはいけません。またDLL自体は実行プログラムと同じフォルダかOSがDLLを検索できる場所に配置しておく必要があります。 | ||
+ | |||
+ | ****サンプルフォルダ内のmakefileを使用 [#a00c8b73] | ||
+ | サンプルをコンパイルするだけならばGCC Developer Liteを起動する必要は無く、サンプルフォルダ内に同梱される「makeexe.cmd」を実行すればmakefileを読み込んでGCC Developer Liteに同梱されるmakeを使用してコンパイルします。~ | ||
+ | 引数にソース名をしていするとそのソースだけコンパイル、何も付けなければフォルダ内の拡張子がCのソースファイル全てがコンパイル対象となります。 | ||
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | makeexe sample2_ping2 (特定のソースのみコンパイル) | ||
+ | makeexe (カレントの全ソースをコンパイル) | ||
+ | </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 236: | ||
***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 244: | ||
***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 274: | ||
</pre> | </pre> | ||
}} | }} | ||
+ | なおdx2lib.pyはctypesによるDLLの単純なラッパーに過ぎませんので、Pythonならではの抽象的な定義は何一つ受け付けてくれません。Pythonからプログラミングを始めた方は微妙に扱いづらいかと思いますので、詳細はサンプルコードを参考にしてください。 | ||
+ | |||
+ | LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。 | ||
***Java [#ceff395d] | ***Java [#ceff395d] | ||
Line 234: | Line 302: | ||
***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_V3.0.zip | ||
+ | unzip DX2LIB_V3.0.zip | ||
+ | </pre> | ||
+ | }} | ||
+ライブラリ及び共有ライブラリの生成~ | +ライブラリ及び共有ライブラリの生成~ | ||
- | DXLIB2ディレクトリに移動し同梱のスクリプトファイルを実行 | + | DXLIB2ディレクトリに移動し同梱のスクリプトファイルを実行~ |
+ | gccは予めインストールされている必要がある | ||
#html{{ | #html{{ | ||
<pre class="brush: bash;"> | <pre class="brush: bash;"> | ||
+ | cd DX2LIB_v3.0/DX2LIB | ||
bash ./build_dx2lib.sh | bash ./build_dx2lib.sh | ||
</pre> | </pre> | ||
Line 254: | Line 330: | ||
}} | }} | ||
- | なおサンプルプログラムはGCC Developer Liteフォルダに同梱されたものを多少修正したものです。付属のmakefileを介してmakeを使って簡便にコンパイルできます。 | + | 'SampleCode\C'のサンプルプログラムはmakeを使ってコンパイルできます。 |
#html{{ | #html{{ | ||
<pre class="brush: bash;"> | <pre class="brush: bash;"> | ||
Line 261: | Line 337: | ||
</pre> | </pre> | ||
}} | }} | ||
- | コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存しますので、そのまま使用できない場合は適宜ソースを修正下さい。 | + | コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存しますので、そのまま使用できない場合は適宜ソースを修正下さい。またWindowsを前提とした_DYNAMICLOADマクロが宣言されているとコンパイルできません。~ |
+ | なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。~ | ||
+ | またmacOSの場合のポート名は「/dev/tty.usbserial-????」ではなく「/dev/cu.usbserial-????」を指定してください。更に最近のmacOSにおける標準の機能ではlatency timeを変更できなかったので、以下のようなコードで対応してみてください(USB I/Fの抜き挿しの度に実行する必要がありますが...)。 | ||
+ | |||
+ | #html{{ | ||
+ | <pre class="brush: c;"> | ||
+ | // brew install libftdi | ||
+ | // cc -I/opt/homebrew/include/libftdi1 -L/opt/homebrew/lib -lftdi1 setlatency.c -o setlatency | ||
+ | |||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <stdbool.h> | ||
+ | #include <ftdi.h> | ||
+ | |||
+ | int main (void) { | ||
+ | int result = EXIT_FAILURE; | ||
+ | struct ftdi_context *ftdic; | ||
+ | struct ftdi_device_list *devlist; | ||
+ | bool f = true, b = false; | ||
+ | |||
+ | if ((ftdic = ftdi_new ()) != 0) { | ||
+ | ftdi_set_interface (ftdic, INTERFACE_ANY); | ||
+ | int num = ftdi_usb_find_all (ftdic, &devlist, 0, 0); | ||
+ | if (num > 0) { | ||
+ | for (int i = 0; i < num; i++) { | ||
+ | printf ("%d: ",i); | ||
+ | if (ftdi_usb_open_dev (ftdic, devlist[i].dev) == 0) { | ||
+ | char s[2][512]; | ||
+ | unsigned char prev_latency; | ||
+ | if (ftdi_read_eeprom(ftdic) == 0 && ftdi_eeprom_decode(ftdic,0) == 0 && ftdi_eeprom_get_strings(ftdic, s[0], 512, s[1], 512, NULL, 0) == 0) | ||
+ | printf("[%s][%s] ", s[0], s[1]); | ||
+ | if (ftdi_get_latency_timer (ftdic, &prev_latency) == 0) { | ||
+ | b = (ftdi_set_latency_timer (ftdic, 1) == 0); | ||
+ | printf ("prev latency = %i to %s\n", prev_latency, b ? "1" : "?"); | ||
+ | } else b = false; | ||
+ | f = f && b; | ||
+ | } | ||
+ | ftdi_usb_close (ftdic); | ||
+ | } | ||
+ | } else printf ("no device found.\n"); | ||
+ | |||
+ | if (f && b) result = EXIT_SUCCESS; | ||
+ | ftdi_list_free (&devlist); | ||
+ | ftdi_free (ftdic); | ||
+ | } | ||
+ | return result; | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
**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 444: | ||
既にオープンされている[[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 498: | ||
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); | ||
-パラメータ | -パラメータ | ||
Line 405: | Line 531: | ||
if (dev) { | if (dev) { | ||
// ID=1にPINGを発行 | // ID=1にPINGを発行 | ||
- | if (DX2_Ping (dev, 1, &err)) | + | if (DX2_Ping (dev, 1, &err)) |
printf ("Found [%08X]\n", err); | printf ("Found [%08X]\n", err); | ||
else | else | ||
Line 445: | Line 571: | ||
if (dev) { | if (dev) { | ||
// 不明な対象に対してPINGを発行 | // 不明な対象に対してPINGを発行 | ||
- | if (DX2_Ping2 (dev, &num, stat, &err)) { | + | if (DX2_Ping2 (dev, &num, stat, &err)) { |
for (i = 0; i < num; i++) | for (i = 0; i < num; i++) | ||
printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); | ||
Line 509: | Line 635: | ||
if (dev) { | if (dev) { | ||
// ID=1にREBOOTを発行 | // ID=1にREBOOTを発行 | ||
- | if (DX2_Reboot (dev, 1, &err)) | + | if (DX2_Reboot (dev, 1, &err)) |
printf ("Success [%08X]\n", err); | printf ("Success [%08X]\n", err); | ||
else | else | ||
Line 546: | Line 672: | ||
if (dev) { | if (dev) { | ||
// ID=1のXL-320からLEDの状態を取得 | // ID=1のXL-320からLEDの状態を取得 | ||
- | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { | + | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { |
printf ("LED STAT=%d\n", dat); | printf ("LED STAT=%d\n", dat); | ||
} | } | ||
Line 582: | Line 708: | ||
if (dev) { | if (dev) { | ||
// ID=1のXL-320からLEDの状態を取得 | // ID=1のXL-320からLEDの状態を取得 | ||
- | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { | + | if (DX2_ReadByteData (dev, 1, 25, &dat, &err)) { |
- | dat = (dat + 1) & 7; | + | dat = (dat + 1) & 7; |
// ID=1のXL-320へLEDの状態を設定 | // ID=1のXL-320へLEDの状態を設定 | ||
- | DX2_WriteByteData (dev, 1, 25, dat, &err); | + | DX2_WriteByteData (dev, 1, 25, dat, &err); |
} | } | ||
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
Line 619: | Line 745: | ||
if (dev) { | if (dev) { | ||
// ID=1のXL-320から現在位置を取得 | // ID=1のXL-320から現在位置を取得 | ||
- | if (DX2_ReadWordData (dev, 1, 30, &dat, &err)) { | + | if (DX2_ReadWordData (dev, 1, 30, &dat, &err)) { |
printf ("PRESENT POS=%d\n", dat); | printf ("PRESENT POS=%d\n", dat); | ||
} | } | ||
Line 654: | Line 780: | ||
if (dev) { | if (dev) { | ||
// ID=1のXL-320へ位置(511)を指令 | // ID=1のXL-320へ位置(511)を指令 | ||
- | DX2_WriteWordData (dev, 1, 30, 511, &err); | + | DX2_WriteWordData (dev, 1, 30, 511, &err); |
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
} | } | ||
Line 687: | Line 813: | ||
if (dev) { | if (dev) { | ||
// ID=1のXM430から現在位置を取得 | // ID=1のXM430から現在位置を取得 | ||
- | if (DX2_ReadWordData (dev, 1, 132, &dat, &err)) { | + | if (DX2_ReadWordData (dev, 1, 132, &dat, &err)) { |
printf ("PRESENT POS=%d\n", dat); | printf ("PRESENT POS=%d\n", dat); | ||
} | } | ||
Line 722: | Line 848: | ||
if (dev) { | if (dev) { | ||
// ID=1のXM430へ位置(2047)を指令 | // ID=1のXM430へ位置(2047)を指令 | ||
- | DX2_WriteWordData (dev, 1, 116, 2047, &err); | + | DX2_WriteWordData (dev, 1, 116, 2047, &err); |
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
} | } | ||
Line 756: | Line 882: | ||
if (dev) { | if (dev) { | ||
// ID=1のXL-320からPIDゲインのデータを取得 | // ID=1のXL-320からPIDゲインのデータを取得 | ||
- | if (DX2_ReadBlockData (dev, 1, 26, gain, 3, &err) { | + | if (DX2_ReadBlockData (dev, 1, 26, gain, 3, &err) { |
printf ( | printf ( | ||
"D=%d I=%d P=%d\n", | "D=%d I=%d P=%d\n", | ||
Line 796: | Line 922: | ||
if (dev) { | if (dev) { | ||
// ID=1のXL-320のPIDゲインを変更 | // ID=1のXL-320のPIDゲインを変更 | ||
- | DX2_WriteBlockData (dev, 1, 26, gain, 3, &err); | + | DX2_WriteBlockData (dev, 1, 26, gain, 3, &err); |
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
} | } | ||
Line 842: | Line 968: | ||
if ((dev = DX2_OpenPort ("\\\\.\\COM5", 1000000))) { | if ((dev = DX2_OpenPort ("\\\\.\\COM5", 1000000))) { | ||
uint32_t num = 3; // 3軸 | uint32_t num = 3; // 3軸 | ||
- | DX2_ReadSyncData (dev, ¶m, &num, (uint8_t *)&rdat, &err); | + | DX2_ReadSyncData (dev, &param, &num, (uint8_t *)&rdat, &err); |
printf("resul num=%d\n", num); | printf("resul num=%d\n", num); | ||
for (int i = 0; i < num; i++) { | for (int i = 0; i < num; i++) { | ||
Line 894: | Line 1020: | ||
if (dev) { | if (dev) { | ||
// 2台のXM430へ個別の位置を指令 | // 2台のXM430へ個別の位置を指令 | ||
- | DX2_WriteSyncData (dev, (uint8_t *)&syncw, sizeof(syncw), &err); | + | DX2_WriteSyncData (dev, (uint8_t *)&syncw, sizeof(syncw), &err); |
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
} | } | ||
Line 927: | Line 1053: | ||
const TBulkReadParam param[3] = { | const TBulkReadParam param[3] = { | ||
- | {1,100,20}, // ID=1の124番地から20バイト分 | + | {1,100,20}, // ID=1の100番地から20バイト分 |
{2,124,12}, // ID=2の124番地から12バイト分 | {2,124,12}, // ID=2の124番地から12バイト分 | ||
{3, 0, 7} // ID=3の0番地から7バイト分 | {3, 0, 7} // ID=3の0番地から7バイト分 | ||
Line 936: | Line 1062: | ||
uint32_t num = 3; // 3軸 | uint32_t num = 3; // 3軸 | ||
PBulkReadResult pr = (void *)rdat; | PBulkReadResult pr = (void *)rdat; | ||
- | DX2_ReadBulkData (dev, ¶m[0], &num, (uint8_t *)&rdat, &err); | + | DX2_ReadBulkData (dev, &param[0], &num, (uint8_t *)&rdat, &err); |
printf("resul num=%d err=$%04x\n", num, err); | printf("resul num=%d err=$%04x\n", num, err); | ||
for (int i = 0; i < num; i++) { | for (int i = 0; i < num; i++) { | ||
Line 987: | Line 1113: | ||
if (dev) { | if (dev) { | ||
// 3台のXM430へ個別の情報を書き込み | // 3台のXM430へ個別の情報を書き込み | ||
- | DX2_WriteBulkData (dev, (uint8_t *)&BW, sizeof(BW), &err); | + | DX2_WriteBulkData (dev, (uint8_t *)&BW, sizeof(BW), &err); |
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
} | } | ||
Line 1023: | Line 1149: | ||
if (dev) { | if (dev) { | ||
// ID=1のAX-12+のLEDを消灯 | // ID=1のAX-12+のLEDを消灯 | ||
- | DX2_TxPacket (dev, 1, INST_WRITE, param, 2, &err); | + | DX2_TxPacket (dev, 1, INST_WRITE, param, 2, &err); |
DX2_ClosePort (dev); | DX2_ClosePort (dev); | ||
} | } | ||
Line 1065: | Line 1191: | ||
if (dev) { | if (dev) { | ||
// ID=1のAX-12+からLEDの状態を読み出す要求 | // ID=1のAX-12+からLEDの状態を読み出す要求 | ||
- | if (DX2_TxPacket (dev, 1, INST_READ, param, 2, &err)) { | + | if (DX2_TxPacket (dev, 1, INST_READ, param, 2, &err)) { |
// ステータスパケットを受信 | // ステータスパケットを受信 | ||
- | DX2_RxPacket (dev, dat, sizeof (dat), &len, 100, &err); | + | DX2_RxPacket (dev, dat, sizeof (dat), &len, 100, &err); |
for (i = 0; i < len; i++) { | for (i = 0; i < len; i++) { | ||
printf ("[%02X]", dat[i]); | printf ("[%02X]", dat[i]); |