Back to page

− Links

 Print 

FDIII-HCに反射型フォトインタラプタの信号を取り込む :: Besttechnology

knowledge:FDIII-HCに反射型フォトインタラプタの信号を取り込む

Table of contents
    • 概要
    • 用意するもの
    • 接続
    • PIO Configを変更する
    • プログラミング
  :idea:本ページの注意事項は各製品のナレッジベースやマニュアルに準拠します。
各製品のナレッジベースやマニュアルをお読み頂き、ご理解頂いた上で本ページを参考にしてください。

概要 anchor.png[1]

反射型フォトインタラプタは、赤外線を反射しやすい対象物を検出するセンサで、黒地上の白線検出、ペーパエッジの検出などに利用されます。

反射型フォトインタラプタの出力は、白色検出時にLow(0V)、その他はHigh(入力電圧)という単純なものです。
それに対しFDIII-HCは、Dynamixelプロトコルに則ったシリアル通信を行うことでDynamxielと通信を行っています。故に反射型フォトインタラプタをFDIII-HCに直接接続して運用することはできません。

そこで必要になるのがMultifunction I/O moduleです。Multifunction I/O moduleは、センサからのアナログ・デジタル信号を取り込み、FDIII-HCへDynamixelプロトコルに則ってその情報を渡す、云わば中継役です。

ここではMultifunction I/O moduleを使って、反射型フォトインタラプタの信号をFDIII-HCへ取り込む方法を紹介します。

Page Top

用意するもの anchor.png[2]

ハンダが苦手という方はブレッドボードを使用しても良いでしょう。

FDIII-HCの変わりにDynamixelコンフィギュレータ[7]を使用してパソコンと通信することも可能です。

Page Top

接続 anchor.png[8]

下図の様に配線を行います。

DxIO_11.png

反射型フォトインタラプタのVCCにMultifunction I/O moduleのCN2のPin1:VOUT(5V)を接続し、電源を供給します。これにより反射型フォトインタラプタのOUTから出力されるHigh時の電圧は5Vとなります。

反射型フォトインタラプタのGNDとMultifunction I/O moduleのCN2のPin10:GNDを接続します。

反射型フォトインタラプタのOUTとMultifunction I/O moduleのCN2のPin2:PIO0を接続します。勿論PIO1~PIO7でも構いません。

Multifunction I/O moduleのCN2には、VOUTとGND端子が1つずつしかありません。複数台のセンサを接続したり、後でセンサを取り外したりする場合は、ユニバーサル基板とピンヘッダで変換基板を作り、ケーブルと3ピンコネクタでセンサを接続するか、ブレッドボードで配線するなどの工夫が必要です。

DxIO_2.png
DxIOsamplecon.png

複数のセンサを接続する場合には注意するべき点があります。
Multifunction I/O moduleのCN2のVOUTから供給できる電流は限られています。
VCCに接続する機器の消費電流が許容量をオーバーすると、Multifunction I/O module自体も同じ電源を使用しているため正常に動作しなくなります。 Multifunction I/O moduleが度々リセットするような場合は、別途電源を用意しセンサに供給する必要があります。

別途電源を用意する場合、反射型フォトインタラプタに供給する電源の電圧は5Vでなければならないということに注意してください。 反射型フォトインタラプタのOUT端子から出力される電圧はHighのとき電源電圧と等しい値になります。 Multifunction I/O moduleのデジタル入力Highレベル電圧範囲は3~5.5Vです。反射型フォトインタラプタの電源電圧範囲が5~12Vだからといって12Vを入力すると、反射型フォトインタラプタのOUT端子から12Vが出力され、Multifunction I/O moduleが破損してしまいます。

DxIO_3.png

DynamixelケーブルでFDIII-HCとMultifunction I/O moduleを接続します。

Page Top

PIO Configを変更する anchor.png[9]

コントロールテーブルの反射型フォトインタラプタを接続した端子に対するPIO Configを0に設定します。

PIO Configの設定は、運用時のプログラム内では書き変えないことをお勧めします。 PIO Configを含む電源を切っても保存されるEEPROMエリア(アドレス0~24)の書き換え回数には制限があるためです。
制限といっても普通に使用していれば制限を越えることはまずありません。 しかし誤ってプログラムのループの中で高速に書き換えを行ってしまった場合、あっと言う間に制限を越えてしまう危険性があります。

PIO0 Configを0にするプログラムを以下に示します。

#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, 0);
  fd_printf ("Complete");
  fd_SoftReset();
  while (1);
}

一度だけ実行しましょう。
書き換えが終わるとブートローダへ戻ります。

fd_DXWriteByteData (200, 6, 0);

ここでIDが200のMultifunction I/O moduleのアドレス6を0に書き換えています。アドレス6はPIO0 Configです。
IDとアドレスは適宜変更してください。

Page Top

プログラミング anchor.png[10]

ここではFDIII-HCのプログラムを作成するための準備や書き込み方法は省略します。

Multifunction I/O moduleのPIO0に接続した反射型フォトインタラプタの状態を取得し、それを表示するプログラムは以下のようになります。

#include <fd.h>
#define KEY_QUIT { if(fd_rx_buff()) fd_SoftReset();}

void main (void) {
  uint8_t ReadData;  // アドレス42の値
  bool PIO0;           // アドレス42のビット0の値

  fd_Init (0, BT_CONSOLE, FD_BEEP_MMI | FD_BEEP_PACKETERR | FD_BEEP_LOWVOLTAGE | FD_BEEP_BOOTUP, 7.4);

  while (1) {
    fd_DXReadByteData (200, 42, &ReadData);
    PIO0 = (ReadData & (1 << 0) ) >> 0;
    fd_printf ("%d : %d\r", ReadData, PIO0);
    KEY_QUIT;
 }
}

fd_DXReadByteData (200, 42, &ReadData);

Multifunction I/O module(ID=200)のDigital In(アドレス42)のデータをReadDataに代入しています。IDを変更した場合は適宜書き換えてください。


PIO0 = (ReadData & (1 << 0) ) >> 0;

Digital In(アドレス42)のデータからビット0の値だけを取り出しています。本来は

PIO0 = ReadData & 1;

だけで良いのですが、PIO1~PIO7の値を取得する場合を想定しこのように表記しています。

それではPIO2に反射型フォトインタラプタを接続した場合を考えてみます。

PIO2 = (ReadData & (1 << 2) ) >> 2;

PIO2の値はReadDataのビット2です。ReadDataからビット2の値だけを取り出すには論理積(&)とビットシフト(<<又は>>)を使います。

(1 << 2)は1を左に2ビットシフトさせた値です。2進数で書くと

ビットシフト前00000001
2ビット左へシフト00000100

となります。 論理積(&)の真理値表は以下になります。

aba & b
000
010
100
111

つまりa,b両方1の時だけ1になります。

この「1を2ビット左へシフトさせた値」とReadDataの論理積(&)を取ることで、ビット2だけを取り出します。

適当なReadData10110101
1を2ビット左へシフトした値00000100
ビット2だけを取り出した値00000100

あるいは

適当なReadData11001001
1を2ビット左へシフトした値00000100
ビット2だけを取り出した値00000000

となります。

「ビット2だけを取り出した値」を右へ2ビットシフトすることで、ビット2だけの値を取り出すことができます。

ビット2だけを取り出した値00000100
右へ2ビットシフトした値00000001

あるいは

ビット2だけを取り出した値00000000
右へ2ビットシフトした値00000000

となります。


Last-modified: 2010-11-05 (Fri) 19:39:06 (JST) (3299d) by eid7gud