カテゴリ
リンク

当サイトは、玄箱PRO (KURO-BOX/Pro)を中心とした組み込み、Linuxと電子工作を扱っています。
会社案内

情報セキュリティおよび個人情報の取り扱いについて


コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。コメントはそれぞれ投稿した人のものです。

■シリアル・ポートの信号を転用してディジタル入出力
 ここでは、シリアル・ポートのフロー制御、モデム制御信号(以下、モデム制御信号)を転用して、ディジタル入出力に使ってみることにします。プログラムの動作確認のために、シリアル・チェッカと、電池を D-sub 9ピン・コネクタにつけたものを用意しました。

デジタル入出力テスト全景

■プログラムの流れ
 プログラムは、以下のような流れになっています。
   (1) デバイス・ファイルのオープン
   (2) モデム制御信号を読む
   (3) 入力ピン DCD, DSR, CTS の OFF (マイナス電圧), ON (プラス電圧) の表示
   (4) 出力ピンの制御 (DTR, RTS 共に OFF, DTR のみ ON, RTS のみ ON, DTR, RTS 共に ON を繰り返す)
   (5) 1秒待ち
   (6) (2) へ戻る としています。 

■1.デバイス・ファイルのオープン
 デバイス・ファイルのオープンは、通常のファイルと同様に行います。O_NDLEAY をつけることで、DCD信号に関わらずオープンします。
  if((asy = open(DEVICE, O_RDWR | O_NDELAY))<0) {   

    fprintf(stderr, "Colud not open serial port.n");   

    exit(2);   

  }

■2. モデム制御信号を読む
 モデム制御信号を読むには ioctl() 関数を使って、 TIOCMGET で読みます。ioctl()関数は、一つ目の引数で指定されたデバイスを制御します。制御する内容は二つ目の引数で指定します。三つ目の引数は、制御する内容や結果が入ります。ここでは TIOCMGET により、モデム制御信号を読むことを指示し、結果を modemline に入れています。二つ目の引数に依存して、三つ目の引数の型は決まります。
ioctl(asy, TIOCMGET, &modemline);

■3. 入力ピンのチェック
 入力ピンの状態は、 ioctl() の結果をビット演算することでチェックします。DCDについてのビットは TIOCM_CAR (TIOCM_CD), DSR は TIOCM_DSR, CTS は TIOCM_CTS, RI は TIOCM_RNG (TIOCM_RI) で定義されています。
  プログラム中では以下のようにビットをチェックし, printf() 関数で状態を表示しています。
    if (modemline & TIOCM_CAR) /* TIOCM_CD でもよい */   

        printf("1:DCD is ON,  ");   

    else   

        printf("1:DCD is OFF, ");   

    if (modemline & TIOCM_DSR)   

        printf("6:DSR is ON,  ");   

    else   

        printf("6:DSR is OFF, ");    if (modemline & TIOCM_CTS)   

        printf("8:CTS is ON,  ");   

    else   

        printf("8:CTS is OFF, ");   

if (modemline & TIOCM_RNG) /* TIOCM_RI でもよい */   

        printf("9:RI is ONn");   

    else   

        printf("9:RI is OFFn");

■4. 出力ピンの制御
 
 出力ピンの制御は ioctl() で、TIOCMSET を指定することで行います。該当するビットを'1'にすると、出力はプラス、'0'にするとマイナスになります。DTR は TIOCM_DTR で, RTS は TIOCM_RTS で定義されています。
  ほかのビットを'0'にするなら代入を使います。次の例は DTR のビットのみ '1' にします。
modemline = TIOCM_DTR;
 ほかのビットの値を変えずに、該当ビットを'1'にするなら論理和を使います。次の例は、ほかのビットに影響を与えずに DTR のビットのみ'1' にします。
modemline |= TIOCM_DTR;
 ほかのビットの値を変えずに、該当ビットを'0'にするなら反転と論理積を使います。次の例は、ほかのビットに影響を与えずに DTR のビットのみ'0' にします。
modemline &= ~TIOCM_DTR;
 プログラム中では、変数 i の値に応じて、ON にするビットを変えて、ioctl() で出力しています。
        switch (i) {   

        case 0:   

            modemline = 0;   

            break;   

        case 1:            /* Pin 4: DTR ON */   

            modemline = TIOCM_DTR;   

            break;   

        case 2:         /* Pin 7: RTS ON */   

            modemline = TIOCM_RTS;   

            break;   

        case 3:            /* Pin 4 & 7 ON */   

            modemline = TIOCM_RTS | TIOCM_DTR;   

            break;   

        default:   

            break;   

        }   

        ioctl(asy, TIOCMSET, &modemline);

■5. 1秒待ち
1秒待ちは、 sleep()関数を使って済ませています。引数の単位は秒です。
sleep(1);

■プログラムを実行してみる(出力ピン)
 作成したプログラムは modem.c です。ダウンロード後コンパイルしてください。
cc -o modem modem.c
または、
make modem
です。
./modem
として、実行するとビデオのように、LEDが点滅するはずです。open()時に一瞬 DTR, RTS がONになっているのがわかるかと思います。信号を流用するときは、この現象に注意してください。

シリアルポートでデジタル入出力(ビデオ)

ディジタル出力テストの様子(クリックすると動画が表示される)


■プログラムを実行してみる(入力ピン)
 入力ピンの動作をテストするために、簡単な回路を用意しました。必要な部品は、電池ボックス(電池スナップ)、抵抗(1kΩ程度、ショートさせない自信があれば省いてよい)、D-sub 9ピンのメス・コネクタ、各一つです。電池ボックスは、単3×4本のものを用意するか、006P電池を利用します。

デジタル入出力テスト使用部品一覧

使用する部品一覧

 工作は簡単です。電池のマイナス側の線をコネクタの5ピンにはんだ付けし、プラス側の線を抵抗にはんだ付けするだけです。

デジタル入出力テスト製作例デジタル入出力テスト全景

準備したテスト用回路とシリアル・チェッカにつないだところ

./modem
を実行し、抵抗の足を、1, 6, 8, 9ピンと順に当てていくと、表示が変わることが確認できます。次の例では 1, 8 ピンに当てています。
kurobox@kurobox:~/src/serial$ ./modem   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF   

1:DCD is ON,  6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF    ← 1 ピン ON   

1:DCD is ON,  6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF        ← 1 ピン ON   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is ON,  9:RI is OFF        ← 8 ピン ON   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is ON,  9:RI is OFF        ← 8 ピン ON   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is ON,  9:RI is OFF        ← 8 ピン ON   

1:DCD is OFF, 6:DSR is OFF, 8:CTS is OFF, 9:RI is OFF   

                                   :

 カテゴリ 

 

トラックバック(0)

このブログ記事を参照しているブログ一覧: シリアル・ポートを使ってディジタル入出力

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/1088

コメントする

おすすめ書籍
Powered by
Movable Type 4.1