![]() | 本ページの注意事項は各製品のナレッジベースやマニュアルに準拠します。 各製品のナレッジベースやマニュアルをお読み頂き、ご理解頂いた上で本ページを参考にしてください。 |
PSD距離センサは、物体との距離を測定するセンサです。距離に応じた電圧(0.35~3.2V)を出力します。
それに対しFDIII-HCは、Dynamixelプロトコルに則ったシリアル通信を行うことでDynamixelと通信を行っています。故に反射型フォトインタラプタをFDIII-HCに直接接続して運用することはできません。
そこで必要になるのがMultifunction I/O moduleです。Multifunction I/O moduleは、センサからのアナログ・デジタル信号を取り込み、FDIII-HCへDynamixelプロトコルに則ってその情報を渡す、云わば中継役です。
ここではMultifunction I/O moduleを使って、PSD距離センサのアナログ信号をFDIII-HCへ取り込む方法を紹介します。
ハンダが苦手という方はブレッドボードを使用しても良いでしょう。
FDIII-HCの変わりにDynamixelコンフィギュレータを使用してパソコンと通信することも可能です。
下図の様に配線を行います。
PSD距離センサのVCCにMultifunction I/O moduleのCN2のPin1:VOUT(5V)を接続し、電源を供給します。
PSD距離センサのGNDとMultifunction I/O moduleのCN2のPin10:GNDを接続します。
PSD距離センサのOUTとMultifunction I/O moduleのCN2のPin2:PIO0を接続します。PIO1~PIO7でも構いません。
Multifunction I/O moduleのCN2には、VCCとGND端子が1つずつしかありません。複数台のセンサを接続したり、後でセンサを取り外したりする場合は、ユニバーサル基板とピンヘッダで変換基板を作り、ケーブルと3ピンコネクタでセンサを接続するか、ブレッドボードで配線するなどの工夫が必要です。
変換基板作成例
複数のPSD距離センサを接続する場合には注意するべき点があります。
Multifunction I/O moduleのCN2のVOUTから供給できる電流は限られています。
VOUTに接続する機器の消費電流が許容量をオーバーすると、Multifunction I/O module自体も同じ電源を使用しているため正常に動作しなくなります。
Multifunction I/O moduleが度々リセットするような場合は、別途電源を用意しPSD距離センサに供給する必要があります。
DynamixelケーブルでFDIII-HCとMultifunction I/O moduleを接続します。
コントロールテーブルのPSD距離センサを接続した端子に対するPIO Configを3に設定します。
PIO Configの設定は、運用時のプログラム内では設定しないことをお勧めします。 PIO Configを含む電源を切っても保存されるEEPROMエリア(アドレス0~24)の書き換え回数には制限があるためです。
制限といっても普通に使用していれば制限を越えることはまずありません。 しかし誤ってプログラムのループの中で高速に書き換えを行ってしまった場合、あっと言う間に制限を越えてしまう危険性があります。
PIO0 Configを3にするプログラムを以下に示します。
#include <fd.h> void main (void) { fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); fdWait(2000); fd_DXWriteByteData (200, 6, 3); fd_printf ("Complete"); fd_SoftReset(); while (1); }
一度だけ実行しましょう。
書き換えが終わるとブートローダへ戻ります。
fd_DXWriteByteData (200, 6, 3);
ここでIDが200のMultifunction I/O moduleのアドレス6を3に書き換えています。アドレス6はPIO0 Configです。
IDとアドレスは適宜変更してください。
ここではFDIII-HCのプログラムを作成するための準備や書き込み方法は省略します。
Multifunction I/O moduleのPIO0に接続したPSD距離センサの値を取得し、それを表示するプログラムは以下のようになります。
#include <fd.h> #define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();} void main (void) { uint16_t ReadData; fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4); while (1) { fd_DXReadWordData (200, 26, &ReadData); fd_printf ("%d\r", ReadData); KEY_QUIT; } }
fd_DXReadWordData (200, 26, &ReadData);
Multifunction I/O module(ID=200)のAD0(アドレス26,27)のデータをReadDataに代入しています。IDを変更した場合は適宜書き換えてください。