
DXMIOはNXP社[5]製LPC845[6](cortex-M0+コア)を搭載し、Dynamixel互換I/Fを装備した汎用マイコンボードです。
IMUについては前バージョンのDXMIO[7]ではBNO055を採用していたのに対し、本バージョンではBNO085を採用しています。
Dynamixelで構成された装置にセンサ等を追加装備する場合、DXMIOを中継すれば同一のネットワーク上にフィードバック系を設ける事ができます。
基本機能はサンプルプログラムとして提供されるので、それらを参考に独自にプログラムを作成すれば機能拡張できるでしょう。
| 型式 | 数量 | 備考 |
| 本体 | 1 | - |
| Robot Cable X3P | 1 | - |
| Robot Cable X4P | 1 | - |
| 商品番号 | BTE098B | |
| MPU | LPC845M301JHI33[6] | |
| PCBリビジョン | E097C (4層) | |
| 通信機能 | TTL(シングルエンド)及びRS-485(ディファレンシャル)の半二重 | |
| 動作温度 | 0~+50℃ | |
| 動作電圧 | DC5.3~35V 絶対最大定格 ±50V | |
| 消費電流 | 最大35mA | |
| 電源出力 | DC5V 最大400mA | |
| リンク方式 | Multi Drop(daisy chain type Connector) | |
| アナログ入力 | 入力電圧範囲 | 0~3.3V |
| 入力インピーダンス | 0.1MΩ | |
| デジタル入出力 | デジタル入力Lowレベル検出電圧範囲 | -0.5~1.5V |
| デジタル入力Highレベル検出電圧範囲 | 1.5~5.5V | |
| シンク・ソース電流 | 最大40mA | |
| デジタル出力High電圧 | 2.9~3.3V | |
| デジタル出力Low電圧 | 0~0.4V | |
| 寸法 | 約15×30mm | |
| コネクタ等 | 14ピンランド, RS-485 x1, TTL×1, モニタLED | |
| 環境配慮 | RoHS準拠, 鉛フリー半田 | |

| No. | 端子名称 (MPU) | No. | 端子名称 (MPU) |
| 1 | GND | 14 | GPIO5(PIO0_21/ADC5) |
| 2 | 5.0V | 13 | GPIO6(PIO0_20/ADC6) |
| 3 | GPIO4(PIO0_22/ADC4) | 12 | GPIO7(PIO0_19/ADC7) |
| 4 | GPIO3(PIO0_23/ADC3) | 11 | GPIO8(PIO0_18/ADC8) |
| 5 | GPIO2(PIO0_14/ADC2) | 10 | GPIO9(PIO0_17/ADC9) |
| 6 | GPIO1(PIO0_6/ADC1) | 9 | GPIO10(PIO0_13/ADC10) |
| 7 | GPIO0(PIO0_7/ADC0) | 8 | GPIO11(PIO0_4/ADC11) |


| Pats Name | JST Parts Number |
| 基板用ヘッダー | B3B-EH, B3B-EH-A[22] |
| ハウジング | EHR-3[22] |
| ターミナル | SEH-00x[22] |

| 端子番号 | 信号名 |
| 1 | GND |
| 2 | VDD |
| 3 | TTL Signal |


| Pats Name | JST Parts Number |
| 基板用ヘッダー | B4B-EH, B4B-EH-A[22] |
| ハウジング | EHR-4[22] |
| ターミナル | SEH-00x[22] |

| 端子番号 | 信号名 |
| 1 | GND |
| 2 | VDD |
| 3 | RS-485 D+ |
| 4 | RS-485 D- |

5V電源とMPUの一部の端子が接続されています。ADCの他に入出力端子として構成したり、端子割り当てが自由なペリフェラルの機能を任意の端子に割り当てて使用する事ができます。
5V電源は外部機器へ供給する電源として使用できますが、400mAを上限とする電流制限が設定されています。
またボードそのもののサイズが小さい事もあり、電力消費量が大きくなるとそれなりの熱を持ちます。CN1に装着するピンヘッダを介して別の基板へ熱を逃がしたり、ボードそのものを放熱処置する事も考慮して下さい。
LPC-Link2[32]等を用いてMPUを直接デバッグするためのランドです。
出荷時にMPUのFLASH ROMにブートローダーを書き込む際に使用する事のみを想定しているため、コネクタは実装していません。
ボードへの電源供給と通信を担います。
両コネクタの電源は並列に接続されています。
MPUより送信を行うとどちらからも同時にデータが送出され、MPUからの送信が完全に完了すると受信待機となり、いずれか一方からのデータを受信するという運用となります。
MPUに内蔵されるFRO(Free Running Oscillator)をシステムクロックとして使用する前提のライブラリを提供しています。
ライブラリはコアのクロックを30MHzに設定し、シリアル通信のみ他の装置との通信速度を一致させる必要から分周比を適宜設定した上で32MHzのクロックを供給する設定を行います。
FROは動作温度範囲内で±1%の精度となりますが、シリアル通信であればこの精度でも概ね支障はありません。しかしながら数分程度で秒オーダーの誤差が生じる精度のため、高精度な時間測定を要求するアプリケーションの場合は、提供されるライブラリを改修して外部クロック(X1)を活性化する必要があります。
MPUに予め書き込まれているブートローダによって、RS-485 I/FないしTTL I/Fを経由してPCからユーザプログラムの転送や諸設定を行う事ができます。
通信環境を整えた上で後述のSIMPLE TERMを使ってブートローダのコマンドモードに入ると、次のメッセージが表示されます。
LPC84x BL1.0 >
この状態で'?'を入力すると、使用できるコマンドの一覧が表示されます。
>? LPC84x BL1.0 w:write e:erase d:dump g:go >
なおユーザプログラムが書き込まれている状態で電源を投入するとユーザプログラムが即実行されるため、ブートローダのコマンドモードには遷移しません。
再度ユーザプログラムの転送や消去といった操作を行う場合は、SIMPLE TERM上でキーボードの「!」キーを押したままPB1を押すか電源を再投入した後に「!」キー放せばブートローダはコマンドモードへ遷移します。
GCC Developer Liteの詳細についてはこちら[38]で紹介しています。「基本パック」と「ARMパック」をダウンロード[39]してインストールしてください。なおARMパックインストールの際に表示されるコンポーネントの選択画面では「LPC84xでのみ使用」を選択してください。

また後述のサンプルコードに含まれるPC用のC言語やpythonのテストコードを実行するには、追加で「WIN64パック」をインストールします。
LPC845で使用される主要なコンポーネントを簡単に紹介します。
ソースプログラムを編集するためのテキストエディタとその他のツールを起動するためのランチャ機能を有する。
汎用シリアルターミナル。簡易的なTELNETクライアントとしても機能する。
USB等で提供されるCOMポートの動的な検出と、COMポートを使用する弊社ツールとの排他制御機能を持つ。
ARMコア向けC/C++言語向けのコンパイラ。できる限り最新のパッチを適用している。
CMSIS-DAPに対応したICEを使用してFLASH ROMへ任意のプログラムを直接書き込むツール。
MPUの内蔵ペリフェラルを定義したヘッダファイルやUARTを簡便に使うためのAPI、GDBにてデバッグする際に使用する初期化ファイル、シリーズ毎に異なるメモリマップを定義したリンカスクリプトファイル、スタートアップルーチンを含む。基本的にコンパイル済みライブラリとしてソースとリンクして使用する。
GCC Developer Lite[38]では1つのソースプログラムのみを対象として編集する機能を持つため、機能別にソースを分割して編集したりコンパイルするといった使い方はできません。
そこで、複数のソースに分割する事無くある程度のソースプログラムサイズでコーディングを完結させるために、一部の機能をコンパイル済みライブラリとして提供しています。
GCC Developer Liteを標準的な環境のPCへインストールすると、「C:\Program Files\BestTech\GCC Developer Lite\TARGET」フォルダに必要なファイルがコピーされます。必要に応じて本フォルダを参照でき、場合によってはユーザ自身がソースを修正しライブラリを再構築する事も可能です。
結果的にLPC84xは複数のライブラリを組み合わせて使用する事になるため、実体はかなり複雑になります。
以下のリンクにZIP形式の圧縮ファイルにしたファイルが置いてあります。アーカイバ等にて適宜解凍して使用して下さい。
ソースファイル(srcフォルダ)と一緒にコンパイル済みのbinファイル(binフォルダ)、GCC Developer Liteをインストールせずともコンパイル済みのbinファイルが転送できるWindows向け各種ツール等が同梱されています。出荷時に「smpl19(dxclient_imu)_V2.bin」が書き込まれていますが、統合環境なしに簡易的にコンパイル済みのバイナリファイルを転送して試すには以下の手順を踏んで下さい。
サンプルコードに含まれるbinファイルとSIMPLE TERMだけで一通りの動作確認はできますが、GCC Developer Liteを使ってソースファイルからコンパイルする手順は以下の通りです。




なおARMGCCそのものがSJISに対応していないため、コメント等に全角文字を使用するとコンパイルエラーが発生する場合があります。サンプルプログラムは日本語のコメントを使用していますが、全てUTF-8のエンコードにしているためそれに起因するエラーが発生しません。 GCC Developer Liteにて新規で作成したプログラムは必ずSJISで生成されるため、編集中にGCC Developer Liteのステータスバーに表示される「SJIS(CR+LR)」をマウスで右クリックし、ポップアップメニューのリストから「UFT8」を選んでからソースプログラムを保存して下さい。「UFT8」になってさえいれば全角文字のコメントによるコンパイルエラーは発生しません。

なおGCC Developer LiteとARMパックがインストール済みであれば、わざわざGCC Developer Liteを起動せずともsrcフォルダに同梱される「makebin.cmd」を実行する事で全サンプルソースをコンパイルしbinファイルが再構築されます。
お試し下さい。
smpl1~smpl13ではボード上のLEDやTTL/RS-485 I/Fを使ったシリアル通信、CN1を使用した入出力を一通り試食できます。その中で使用しているライブラリ等の概要を紹介します。
LPCOpen[61]はNXP社より提供されるペリフェラル用のライブラリです。しかしLPC84xシリーズは見捨てられたまま開発が止まっているようで、今後はメンテナンスされない可能性が高いと思われます。
とは言えリソースはLPCOpen前提であつらえたリソースが蓄積されているので、LPC82x用のものをモディファイしてLPC84x向けに構成し直したものを同梱しています。
初期状態において大抵のペリフェラルはクロックソースが選択されていないため、そのままペリフェラルの初期化を行っても動作しません。提供するライブラリにおいてもクロックソースは別途行うものとしていますので、ペリフェラルを初期化する前にクロックを選択しています。なおUSART0に限り「e097c_def.h」内のResetExceptionDispatch_Tail関数(main関数へジャンプする直前にスタートアップルーチンから呼ばれる)で予めクロックソースを選択しています。
#include <chip.h> // FRG0のソースとしてsys_pll0_clk(60MHz)を選択 LPC_SYSCON->FRG0MULT = 35; LPC_SYSCON->FRG0DIV = 39; LPC_SYSCON->FRG0CLKSEL = SYSCON_FRGCLKSRC_PLL; // USART0のクロックソースとしてFRG0を選択 LPC_SYSCON->UART0CLKSEL = SYSCON_FLEXCOMMCLKSELSRC_FRG0;
LPC8xxシリーズはペリフェラルの機能を任意の端子に自由に割り当てる事ができます。CN1にはMPUのGPIOのうちADCが割り当てられている端子を配置しています。
DXMIOでは端子番号のマクロと最低限の端子初期化用の構造体が「e097c_def.h」に定義してあり、自身のソースにインクルードしてコンパイルすればResetExceptionDispatch_Tail関数が呼び出されCN1を除くボード内の回路に接続されている端子の初期化が行われます。
#include <piocfg.h>
// 端子機能設定配列
static const TPin E097C_pins[] = {
{ _LED2, PIO_TYPE_OUTPUT_1, 0, PIO_MODE_DEFAULT }, // P0_24 O
{ _TXD0, PIO_TYPE_MOVABLE, SWM_U0_TXD_O, PIO_MODE_DEFAULT }, // USART0 TXD O
{ _RXD0, PIO_TYPE_MOVABLE, SWM_U0_RXD_I, PIO_MODE_PULLUP }, // USART0 RXD I
{ _RTS0, PIO_TYPE_MOVABLE, SWM_U0_RTS_O, PIO_MODE_DEFAULT }, // USART0 RTS O
{ _TERM, PIO_TYPE_OUTPUT_1, 0, PIO_MODE_DEFAULT }, // P0_16 O
{ _SCL0, PIO_TYPE_FIXED, SWM_FIXED_I2C0_SCL, PIO_MODE_DEFAULT }, // I2C0 SCL
{ _SDA0, PIO_TYPE_FIXED, SWM_FIXED_I2C0_SDA, PIO_MODE_DEFAULT }, // I2C0 SDA
{ _BNO085_NRST, PIO_TYPE_OUTPUT_1, 0, PIO_MODE_DEFAULT },
{ _BNO085_PS0, PIO_TYPE_OUTPUT_0, 0, PIO_MODE_DEFAULT },
{ _BNO085_PS1, PIO_TYPE_OUTPUT_0, 0, PIO_MODE_DEFAULT },
{ _BOARD_REV, PIO_TYPE_INPUT, 0, PIO_MODE_PULLUP }, // P0_1 I
};
LED2は「e097c_def.h」に宣言されているSetLEDとToggleLED関数を使用してプログラマブルに明滅できます。
void ToggleLED (void); void SetLED (bool On);
弊社では何をするにもUSART(UART)ありきなため、本MPUにおいてもライブラリとして基本的な送受信ルーチンをポーリング・割り込み・DMAの3パターンで用意しています。
#include <us.h>
用意される関数はUSARTの初期化・1バイトないし複数バイトの送受信・簡易書式文字列送信・送受信バッファ内のデータ数確認といったところで、どのパターンであってもポートであっても同様のフォーマットとなります。
// USART0 ポーリング版 // 初期化 uint32_t usart0_init (uint32_t clk, uint32_t baudrate, uint8_t us_param, uint8_t *txbuf, uint16_t txl, uint8_t *rxbuf, uint16_t rxl); // ボーレート変更 uint32_t usart0_setbaudrate (uint32_t clk, uint32_t baudrate); // 送信バッファ内データ数 uint16_t usart0_tx_buff (void); // 受信バッファ内データ数 uint16_t usart0_rx_buff (void); // 送信データ一掃 void usart0_tx_purge (void); // 送信データ一掃 void usart0_rx_purge (void); // 1文字(1バイト)送信 void usart0_putc (char ch); // 文字列(ヌル終端文字列)送信 void usart0_puts (const char *s); // 複数バイト送信 int usart0_putsb (const uint8_t *c, int len); // 1文字(1バイト)受信 char usart0_getc (void); // 文字列(LF/CR終端)受信 uint16_t usart0_gets (char *s, int len); // 書式文字列送信 int usart0_printf (const char *fmt, ...); // 書式指定文字列受信 int usart0_scanf (const char *fmt, ...);
なおCN3とCN4は電気的には半二重通信ですが、USARTとしては全二重で動作しています。そのためプログラムや運用方法によって半二重である事を意識しないとコンフリクトが発生します。
またRS-485 I/Fのターミネーターは「e097c_def.h」に宣言されているSetTerminator関数を使用してプログラマブルにON/OFFできます。
void SetTerminator (bool On);
BNO085はMPUとI²Cで通信する前提で接続され、スレーブアドレスは0x4Aに固定されています。
SH2 Sensorhub driver[66]を使用してアクセスしますが、それらの詳細な情報が無いと運用は困難です。また「e097c_imu.h」ではSH2が要求するプラットホーム依存の低位ルーチン(主にI2Cバスアクセスルーチン)が納められています。
なおサンプルコードではBNO085の加速度計・ジャイロスコープ・地磁気センサの動的キャリブレーションをsh2_setCalConfig APIにより有効にしています。BNO085のデータにある通りに適切なモーションで動かす事により、キャリブレーションの精度を最大限に引き出す事ができます。
さらにsh2_setDcdAutoSave APIによってキャリブレーションデータが自動保存されるように設定しています。
最低限必要と思われる機能だけを活性化した上でライブラリ化しています。詳細はFreeRTOS[3]のサイトを参照いただくとして、DXMIOではFreeRTOSありきのサンプルコードが提供されます。
以下は最新のサンプルコードを前提に記述されています。
DXMIO自身を他のDynamixelのホストとして使用する場合は、提供されるライブラリを使う事で簡便に通信が行えます(smpl14~smpl16)。DXMIOをホストとするとPC等に比べて物理的なサイズを格段に小さくできますが、メモリや処理能力には限りがありますので過大な期待は禁物です。
PC版と同等のDXLIB[70]やDX2LIB[71]が提供されますが、ライブラリのリンク時の都合により追加APIのプレフィクスが少々異なります。詳細はdxlib.hやdx2lib.hを参照して下さい。
以下に接続例を紹介しますが、クライアントとなるDynamixelと同じI/FにDXMIOが接続されているならばどの位置に配置して構いません。またDXMIOへファームウェアを転送するためにはPC用のI/Fが必要になります。
DXMIOをクライアントとして使用する場合の通信処理はライブラリとして提供され、ユーザは独自のコントロールテーブルや様々な処理の組み込みに専念できます。
以下に接続例を紹介しますが、DXMIOはDXHUBに直接でもDynamixelと数珠つなぎでもどのように接続しても構いません。
smpl18はほぼ最小構成のコントロールテーブルと通信の確認を行うのに最低限必要な機能のみを実装、smpl19は各端子機能の割り当て・GPIOとしての入出力・PWM出力・アナログ電圧測定・IMUのデータ取得といった機能を網羅しています。
なおDynamixelクライアントライブラリでは不揮発メモリの扱いがDynamixelシリーズのそれと異なり、不揮発領域とあるアイテムを書き換えたとしても、電源を再投入すると書き換える前の値に戻ります。これは不用意な書き換えによる不慮の事態を軽減するためです。不揮発領域に書き込んだ値を次回起動時にも反映させるには、コントロールテーブル中のWriteNVMに1を書き込む事で行います。またWriteNVMのコントロールテーブル上のアドレスはライブラリ内で固定されています。
以下はsmpl19によって提供される機能の詳細です。
Dynamixelシリーズには2種類のプロトコルがあります。
プログラム中のマクロを書き換えて再度コンパイルすれば、選択したプロトコルに対応したバイナリファイルが生成されます。
Dynamixelシリーズと共通する情報はコントロールテーブル上の先頭の5バイトのみで、それ以外のアドレスには互換性がありません。
複数バイトにまたがるアイテムはリトルエンディアンでストアされます。
なおIMUの個々のデータが浮動小数点提供される都合から、メモリがかなり逼迫しています。これ以上の領域を確保するとアプリケーションが起動しなくなるでしょう。
| DXL V1版 | ||||
| Address | Item | Access | Default Value | Type/Range |
| 0 (0x0) | Model Number | R | 0x4025 | uint16 |
| 1 (0x1) | ||||
| 2 (0x2) | Version of Firmware | R | 0x41 | uint8 |
| 3 (0x3) | ID | R/W (NVM) | 200 | uint8 0~253 |
| 4 (0x4) | Baudrate | R/W (NVM) | 1 | uint8 0~254 |
| 5 (0x5) | WriteNVM | R/W | 0 | uint8 0~1 |
| 6 (0x6) | LED | R/W | 0 | uint8 0~1 |
| 7 (0x7) | Terminator | R/W (NVM) | 1 | uint8 0~1 |
| 8 (0x8) | Pin Config 0 | R/W (NVM) | 0 | uint8 0~20 |
| 9 (0x9) | Pin Config 1 | R/W (NVM) | 0 | uint8 0~20 |
| 10 (0xA) | Pin Config 2 | R/W (NVM) | 0 | uint8 0~20 |
| 11 (0xB) | Pin Config 3 | R/W (NVM) | 0 | uint8 0~20 |
| 12 (0xC) | Pin Config 4 | R/W (NVM) | 0 | uint8 0~20 |
| 13 (0xD) | Pin Config 5 | R/W (NVM) | 0 | uint8 0~20 |
| 14 (0xE) | Pin Config 6 | R/W (NVM) | 0 | uint8 0~20 |
| 15 (0xF) | Pin Config 7 | R/W (NVM) | 0 | uint8 0~20 |
| 16 (0x10) | Pin Config 8 | R/W (NVM) | 0 | uint8 0~20 |
| 17 (0x11) | Pin Config 9 | R/W (NVM) | 0 | uint8 0~20 |
| 18 (0x12) | Pin Config 10 | R/W (NVM) | 0 | uint8 0~20 |
| 19 (0x13) | Pin Config 11 | R/W (NVM) | 0 | uint8 0~20 |
| 20 (0x14) | PWM Frequency | R/W (NVM) | 0 | uint16 0~50000 |
| 21 (0x15) | ||||
| 22 (0x16) | PWM Duty 0 | R/W (NVM) | 0 | uint16 0~65535 |
| 23 (0x17) | ||||
| 24 (0x1A) | PWM Duty 1 | R/W (NVM) | 0 | uint16 0~65535 |
| 25 (0x1D) | ||||
| 26 (0x1E) | PWM Duty 2 | R/W (NVM) | 0 | uint16 0~65535 |
| 27 (0x1F) | ||||
| 28 (0x22) | PWM Duty 3 | R/W (NVM) | 0 | uint16 0~65535 |
| 29 (0x23) | ||||
| 30 (0x26) | PWM Duty 4 | R/W (NVM) | 0 | uint16 0~65535 |
| 31 (0x27) | ||||
| 32 (0x2A) | PWM Duty 5 | R/W (NVM) | 0 | uint16 0~65535 |
| 33 (0x2B) | ||||
| 34 ~ 43 | (reserve) | R | - | uint8 |
| 44 (0x2C) | Capture 0 | R/W | 0 | uint16 0~65535 |
| 45 (0x2D) | ||||
| 46 (0x2E) | Capture 1 | R/W | 0 | uint16 0~65535 |
| 47 (0x2F) | ||||
| 48 (0x30) | Capture 2 | R/W | 0 | uint16 0~65535 |
| 49 (0x31) | ||||
| 50 (0x32) | Capture 3 | R/W | 0 | uint16 0~65535 |
| 51 (0x33) | ||||
| 52 (0x34) | OUT | R/W | 0 | uint16 0~4095 |
| 53 (0x35) | ||||
| 54 (0x36) | IN | R | - | uint16 0~4095 |
| 55 (0x37) | ||||
| 56 (0x38) | ADV 0 | R | - | uint16 0~4095 |
| 57 (0x39) | ||||
| 58 (0x3A) | ADV 1 | R | - | uint16 0~4095 |
| 59 (0x3B) | ||||
| 60 (0x3C) | ADV 2 | R | - | uint16 0~4095 |
| 61 (0x3D) | ||||
| 62 (0x3E) | ADV 3 | R | - | uint16 0~4095 |
| 63 (0x3F) | ||||
| 64 (0x40) | ADV 4 | R | - | uint16 0~4095 |
| 65 (0x41) | ||||
| 66 (0x42) | ADV 5 | R | - | uint16 0~4095 |
| 67 (0x43) | ||||
| 68 (0x44) | ADV 6 | R | - | uint16 0~4095 |
| 69 (0x45) | ||||
| 70 (0x46) | ADV 7 | R | - | uint16 0~4095 |
| 71 (0x47) | ||||
| 72 (0x48) | ADV 8 | R | - | uint16 0~4095 |
| 73 (0x49) | ||||
| 74 (0x4A) | ADV 9 | R | - | uint16 0~4095 |
| 75 (0x4B) | ||||
| 76 (0x4C) | ADV 10 | R | - | uint16 0~4095 |
| 77 (0x4D) | ||||
| 78 (0x4E) | ADV 11 | R | - | uint16 0~4095 |
| 79 (0x4F) | ||||
| 80 ~ 97 | (reserve) | R | - | uint8 |
| 98 (0x4A) | DAV | R/W | - | uint16 0~1023 |
| 99 (0x4B) | ||||
| 100 ~ 103 | (reserve) | R | - | uint8 |
| 104 (0x6B) | Accelerometer X | R | - | float32 |
| 105 | ||||
| 106 | ||||
| 107 | ||||
| 108 (0x6C) | Accelerometer Y | R | - | float32 |
| 109 | ||||
| 110 | ||||
| 111 | ||||
| 112 (0x70) | Accelerometer Z | R | - | float32 |
| 113 | ||||
| 114 | ||||
| 115 | ||||
| 116 (0x74) | Gyroscope Calibrated X | R | - | float32 |
| 117 | ||||
| 118 | ||||
| 119 | ||||
| 120 (0x78) | Gyroscope Calibrated Y | R | - | float32 |
| 121 | ||||
| 122 | ||||
| 123 | ||||
| 124 (0x7C) | Gyroscope Calibrated Z | R | - | float32 |
| 125 | ||||
| 126 | ||||
| 127 | ||||
| 128 (0x80) | Magnetic Field Calibrated X | R | - | float32 |
| 129 | ||||
| 130 | ||||
| 131 | ||||
| 132 (0x84) | Magnetic Field Calibrated Y | R | - | float32 |
| 133 | ||||
| 134 | ||||
| 135 | ||||
| 136 (0x88) | Magnetic Field Calibrated Z | R | - | float32 |
| 137 | ||||
| 138 | ||||
| 139 | ||||
| 140 (0x8C) | Linear Acceleration X | R | - | float32 |
| 141 | ||||
| 142 | ||||
| 143 | ||||
| 144 (0x90) | Linear Acceleration Y | R | - | float32 |
| 145 | ||||
| 146 | ||||
| 147 | ||||
| 148 (0x94) | Linear Acceleration Z | R | - | float32 |
| 149 | ||||
| 150 | ||||
| 151 | ||||
| 152 (0x98) | Rotation Vector i | R | - | float32 |
| 153 | ||||
| 154 | ||||
| 155 | ||||
| 156 (0x9C) | Rotation Vector j | R | - | float32 |
| 157 | ||||
| 158 | ||||
| 159 | ||||
| 160 (0xA0) | Rotation Vector k | R | - | float32 |
| 161 | ||||
| 162 | ||||
| 163 | ||||
| 164 (0xA4) | Rotation Vector real | R | - | float32 |
| 165 | ||||
| 166 | ||||
| 167 | ||||
| 168 (0xA8) | Rotation Vector Accuracy | R | - | float32 |
| 169 | ||||
| 170 | ||||
| 171 | ||||
| 172 (0xAC) | Gravity X | R | - | float32 |
| 173 | ||||
| 174 | ||||
| 175 | ||||
| 176 (0xB0) | Gravity Y | R | - | float32 |
| 177 | ||||
| 178 | ||||
| 179 | ||||
| 180 (0xB4) | Gravity Z | R | - | float32 |
| 181 | ||||
| 182 | ||||
| 183 | ||||
| 184 (0xB8) | Temperature | R | - | int16_t |
| 185 | ||||
| 186 (0xBA) | USER 0 | R/W | 0 | uint8 0~255 |
| 187 (0xBB) | USER 1 | R/W | 0 | uint8 0~255 |
| 188 (0xBC) | USER 2 | R/W | 0 | uint8 0~255 |
| 189 (0xBD) | USER 3 | R/W | 0 | uint8 0~255 |
| 190 (0xBE) | USER 4 | R/W | 0 | uint8 0~255 |
本製品のモデルナンバーです。ホストはこの値で製品の種類を判別します。
搭載されたマイコンに書き込まれたファームウェアのバージョンです。
ネットワーク上の個体を特定する固有の番号です。同一ネットワークに同じIDを持ったデバイスが存在してはなりません。
デフォルトは200です。
デバイスの通信速度を決める分周値で、デフォルトは1(1M[bps])です。通信速度は次式で導かれます。
Baudrate[bps]=2000000 / (value + 1)
主なBaudrateは以下の通りです。
| Set value | Actual Baudrate[bps] | Specified Baudrate[bps] | Error[%] |
| 0 | 2000000.0 | 2000000 | 0.000 |
| 1 | 1000000.0 | 1000000 | 0.000 |
| 3 | 500000.0 | 500000 | 0.000 |
| 4 | 400000.0 | 400000 | 0.000 |
| 7 | 250000.0 | 250000 | 0.000 |
| 9 | 200000.0 | 200000 | 0.000 |
| 16 | 117647.1 | 115200 | -2.124 |
| 34 | 57142.9 | 57600 | 0.794 |
| 103 | 19230.8 | 19200 | -0.160 |
| 207 | 9615.4 | 9600 | -0.160 |
※ホストとのボーレートの誤差は±2%以下が要求されます。
1を書き込むとコントロールテーブルのNVMとあるアイテムの値を保存します。パワーサイクル毎に保存された値がアイテムの初期値となります。
1を書き込むとLED1が点灯します。
RS-485 I/FのターミネーターをON/OFFします。
RS-485 I/Fには何も接続せずにTTL I/Fのみを使用する場合は、RS-485 I/Fのハイインピーダンス状態を回避するために1を設定して下さい。
GPIO0~11の各端子の機能を設定します。
デフォルトはデジタル入力(0:DIN)です。




GPIOにデジタル出力機能を割り当てた際に、レジスタの該当ビットに設定した値をGPIOから出力します。
| Bit | 15~12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| GPIO | - | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
GPIOにアナログ入力機能を割り当てた際に、GPIOに入力された電圧を12bitの分解能で計測します。
Input [V] = 3.3[V] * Value / 4095
なお入力インピーダンスが低いため、チャンネル間の影響を受けやすくなっています。影響を軽減させるには入力バッファを介して接続するか、プログラムを修正して使用するチャネルそのものを制限する等の処置を講じる必要があります。
BNO085から得られる測定値で、温度を除き32bitの浮動小数点となります。
任意の自作タスクとコントロールテーブル間のI/Fです。使い道は自由です。
V1に対して冒頭のアイテムが若干異なっている程度です。
複数バイトにまたがるアイテムはリトルエンディアンでストアされます。
| DXL V2版 | ||||
| Address | Item | Access | Default Value | Type/Range |
| 0 (0x0) | Model Number | R | 0x4025 | uint16 |
| 1 (0x1) | ||||
| 2 (0x2) | Model Information | R | 0 | uint32 |
| 3 (0x3) | ||||
| 4 (0x4) | ||||
| 5 (0x5) | ||||
| 6 (0x6) | Version of Firmware | R | 0x41 | uint8 |
| 7 (0x7) | ID | R/W (NVM) | 200 | uint8 0~253 |
| 8 (0x8) | Baudrate | R/W (NVM) | 3 | uint8 0~4,6 |
| 9 (0x9) | WriteNVM | R/W | 0 | uint8 0~1 |
| 10 (0xA) | LED | R/W | 0 | uint8 0~1 |
| 11 (0xB) | Terminator | R/W (NVM) | 1 | uint8 0~1 |
| 12 (0xC) | Pin Config 0 | R/W (NVM) | 0 | uint8 0~20 |
| 13 (0xD) | Pin Config 1 | R/W (NVM) | 0 | uint8 0~20 |
| 14 (0xE) | Pin Config 2 | R/W (NVM) | 0 | uint8 0~20 |
| 15 (0xF) | Pin Config 3 | R/W (NVM) | 0 | uint8 0~20 |
| 16 (0x10) | Pin Config 4 | R/W (NVM) | 0 | uint8 0~20 |
| 17 (0x11) | Pin Config 5 | R/W (NVM) | 0 | uint8 0~20 |
| 18 (0x12) | Pin Config 6 | R/W (NVM) | 0 | uint8 0~20 |
| 19 (0x13) | Pin Config 7 | R/W (NVM) | 0 | uint8 0~20 |
| 20 (0x14) | Pin Config 8 | R/W (NVM) | 0 | uint8 0~20 |
| 21 (0x15) | Pin Config 9 | R/W (NVM) | 0 | uint8 0~20 |
| 22 (0x16) | Pin Config 10 | R/W (NVM) | 0 | uint8 0~20 |
| 23 (0x17) | Pin Config 11 | R/W (NVM) | 0 | uint8 0~20 |
| 24 (0x18) | PWM Frequency | R/W (NVM) | 0 | uint16 0~50000 |
| 25 (0x19) | ||||
| 26 (0x1A) | PWM Duty 0 | R/W (NVM) | 0 | uint16 0~65535 |
| 27 (0x1B) | ||||
| 28 (0x1C) | PWM Duty 1 | R/W (NVM) | 0 | uint16 0~65535 |
| 29 (0x1D) | ||||
| 30 (0x1E) | PWM Duty 2 | R/W (NVM) | 0 | uint16 0~65535 |
| 31 (0x1F) | ||||
| 32 (0x20) | PWM Duty 3 | R/W (NVM) | 0 | uint16 0~65535 |
| 33 (0x21) | ||||
| 34 (0x22) | PWM Duty 4 | R/W (NVM) | 0 | uint16 0~65535 |
| 35 (0x23) | ||||
| 36 (0x24) | PWM Duty 5 | R/W (NVM) | 0 | uint16 0~65535 |
| 37 (0x25) | ||||
| 38 ~ 47 | (reserve) | R | - | uint8 |
| 48 (0x30) | Capture 0 | R/W | 0 | uint16 0~65535 |
| 49 (0x31) | ||||
| 50 (0x32) | Capture 1 | R/W | 0 | uint16 0~65535 |
| 51 (0x33) | ||||
| 52 (0x34) | Capture 2 | R/W | 0 | uint16 0~65535 |
| 53 (0x35) | ||||
| 54 (0x36) | Capture 3 | R/W | 0 | uint16 0~65535 |
| 55 (0x37) | ||||
| 56 (0x38) | OUT | R/W | 0 | uint16 0~4095 |
| 57 (0x39) | ||||
| 58 (0x3A) | IN | R | - | uint16 0~4095 |
| 59 (0x3B) | ||||
| 60 (0x3C) | ADV 0 | R | - | uint16 0~4095 |
| 61 (0x3D) | ||||
| 62 (0x3E) | ADV 1 | R | - | uint16 0~4095 |
| 63 (0x3F) | ||||
| 64 (0x40) | ADV 2 | R | - | uint16 0~4095 |
| 65 (0x41) | ||||
| 66 (0x42) | ADV 3 | R | - | uint16 0~4095 |
| 67 (0x43) | ||||
| 68 (0x44) | ADV 4 | R | - | uint16 0~4095 |
| 69 (0x45) | ||||
| 70 (0x46) | ADV 5 | R | - | uint16 0~4095 |
| 71 (0x47) | ||||
| 72 (0x48) | ADV 6 | R | - | uint16 0~4095 |
| 73 (0x49) | ||||
| 74 (0x4A) | ADV 7 | R | - | uint16 0~4095 |
| 75 (0x4B) | ||||
| 76 (0x4C) | ADV 8 | R | - | uint16 0~4095 |
| 77 (0x4D) | ||||
| 78 (0x4E) | ADV 9 | R | - | uint16 0~4095 |
| 79 (0x4F) | ||||
| 80 (0x50) | ADV 10 | R | - | uint16 0~4095 |
| 81 (0x51) | ||||
| 82 (0x52) | ADV 11 | R | - | uint16 0~4095 |
| 83 (0x53) | ||||
| 84 ~ 101 | (reserve) | R | - | uint8 |
| 102 (0x66) | DAV | R/W | - | uint16 0~1023 |
| 103 (0x66) | ||||
| 104 ~ 107 | (reserve) | R | - | uint8 |
| 108 (0x6C) | Accelerometer X | R | - | float32 |
| 109 | ||||
| 110 | ||||
| 111 | ||||
| 112(0x70) | Accelerometer Y | R | - | float32 |
| 113 | ||||
| 114 | ||||
| 115 | ||||
| 116(0x74) | Accelerometer Z | R | - | float32 |
| 117 | ||||
| 118 | ||||
| 119 | ||||
| 120(0x78) | Gyroscope Calibrated X | R | - | float32 |
| 121 | ||||
| 122 | ||||
| 123 | ||||
| 124(0x7C) | Gyroscope Calibrated Y | R | - | float32 |
| 125 | ||||
| 126 | ||||
| 127 | ||||
| 128(0x80) | Gyroscope Calibrated Z | R | - | float32 |
| 129 | ||||
| 130 | ||||
| 131 | ||||
| 132(0x84) | Magnetic Field Calibrated X | R | - | float32 |
| 133 | ||||
| 134 | ||||
| 135 | ||||
| 136(0x88) | Magnetic Field Calibrated Y | R | - | float32 |
| 137 | ||||
| 138 | ||||
| 139 | ||||
| 140(0x8C) | Magnetic Field Calibrated Z | R | - | float32 |
| 141 | ||||
| 142 | ||||
| 143 | ||||
| 144(0x90) | Linear Acceleration X | R | - | float32 |
| 145 | ||||
| 146 | ||||
| 147 | ||||
| 148(0x94) | Linear Acceleration Y | R | - | float32 |
| 149 | ||||
| 150 | ||||
| 151 | ||||
| 152(0x98) | Linear Acceleration Z | R | - | float32 |
| 153 | ||||
| 154 | ||||
| 155 | ||||
| 156(0x9C) | Rotation Vector i | R | - | float32 |
| 157 | ||||
| 158 | ||||
| 159 | ||||
| 160(0xA0) | Rotation Vector j | R | - | float32 |
| 161 | ||||
| 162 | ||||
| 163 | ||||
| 164(0xA4) | Rotation Vector k | R | - | float32 |
| 165 | ||||
| 166 | ||||
| 167 | ||||
| 168(0xA8) | Rotation Vector real | R | - | float32 |
| 169 | ||||
| 170 | ||||
| 171 | ||||
| 172(0xAC) | Rotation Vector Accuracy | R | - | float32 |
| 173 | ||||
| 174 | ||||
| 175 | ||||
| 176(0xB0) | Gravity X | R | - | float32 |
| 177 | ||||
| 178 | ||||
| 179 | ||||
| 180(0xB4) | Gravity Y | R | - | float32 |
| 181 | ||||
| 182 | ||||
| 183 | ||||
| 184(0xB8) | Gravity Z | R | - | float32 |
| 185 | ||||
| 186 | ||||
| 187 | ||||
| 188(0xBC) | Temerature | R | - | int16_t |
| 189 | ||||
| 190 (0xBE) | USER 0 | R/W | 0 | uint8 0~255 |
| 191 (0xBF) | USER 1 | R/W | 0 | uint8 0~255 |
| 192 (0xC0) | USER 2 | R/W | 0 | uint8 0~255 |
| 193 (0xC1) | USER 3 | R/W | 0 | uint8 0~255 |
| 194 (0xC2) | USER 4 | R/W | 0 | uint8 0~255 |
デバイスの通信速度で、デフォルトは1(1M[bps])です。
設定可能なBaudrateは以下の通りです。
| Set value | Baudrate[bps] |
| 0 | 9600 |
| 1 | 57600 |
| 2 | 115200 |
| 3 | 1000000 |
| 4 | 2000000 |
※ホストとのボーレートの誤差は±2%以下が要求されます。
.\tools\dxl\guiと.\tools\dxl\cuiフォルダにはDXMIOにsmpl19(プロトコルV2)のファームウェアが書き込まれている前提で動作確認するためのホスト用プログラムが含まれています。
まずguiフォルダにはDXMIOのコントロールテーブルをセル上で確認しながら設定したりモニタするWindows用ツールDXCONFが同梱されています。DXCONFを起動したらポートやボーレートを適宜選択し、画面左側でマウスを右クリックしProtocolにV2を選択し使ってください。

cuiフォルダにはC/C++/pythonによるデモコードが同梱されています。GCC Developer LiteとWIN64パックがインストールされている前提でコンパイルや実行するための*.cmdファイルが用意されています。基本的に必要な情報はソース(*.c/*.cpp/*.py)に記述されていますので、適当なテキストエディタで編集した上で*.cmdを実行してコンパイルないし動かしてみて下さい。
![]() | 下記に記載された事項以外にも、経験を踏まえた危険回避方策を講じる事。 安全に配慮しない場合は人命や財産を失う恐れがある。 また従わない場合は保証対象外となる。 |
(This host) = https://www.besttechnology.co.jp