工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

タグ:仮想シリアル通信

要旨

 PIC18F14K50でA/D変換モジュールを使用する実験の記録である。A/D変換結果をUSBによる仮想シリアル通信でPCへ送信することができた。


背景と目的

 USB対応マイコンPIC18F14K50にはA/D変換モジュールがあるためA/D変換結果をPCにUSBで送信することができれば、応用の幅が広がる。そこで、今回はPIC18F14K50を用いて、A/D変換を行いその結果をUSBでPCに送信できるようにしてみる。


詳細
1.構想

 使用する実験装置は、おなじみの『PICで動かすUSB』評価基板とする。そして今回の目標は何らかのA/D変換結果がUSBでPCに送信できればよいので、図1のようにスイッチが押されたらアナログ電圧をA/D変換し結果をPCに送る。プログラムの大まかな流れとしては以下のとおり。このうち、Ⅰ、Ⅲ、Ⅳは以前の記事ですでに方法を確立している。そこで、今回主にプログラムを考えるのはⅡである。

  • 基板上のスイッチが押されたことを検出する
  • A/D変換を行う
  • 変換結果をUSBによる仮想シリアル通信でPCに送る
  • PCにてシリアルを受信し画面に表示する
2.製作
2.1 ハードウェア構成

 図2.1に今回実験に使用するハードウェアの構成を示す。変換対象のアナログ電圧は、直流電源が出力するDC電圧としRC6/AN8で読み込むように配線を施した。その他の回路構成は『PICで動かすUSB』の評価基板から変更していない。スイッチが押されたことはRA3の値を読み検出する。

ハード構成
図2.1 ハードウェア構成

2.2 A/D変換プログラム

 PIC18F14K50でA/D変換をするためには、以下の手順が必要である。

  • 使用するポートの設定
  • A/D変換モジュールの設定
  • A/D変換の開始
  • A/D変換の終了検出
  • 変換結果の取得

以下、順を追ってプログラムを記述する。

Ⅰ 使用するポートの設定はポートを入力にする、アナログ入力にするという2つが必要である。今回はポートCのRC6すなわちAN8を使用することにしたので、以下の記述が必要。

TRISCbits.RC6 = 1; //RC6を入力にする
ANSELHbits.AN8 = 1; //RC6をアナログ入力にする

Ⅱ A/D変換モジュールの設定では、モジュールの有効化、入力ch選択、変換クロックの選択、電圧リファレンス、フォーマット(右寄せか左寄せか)の5つが必要である。今回は電圧リファレンスはVssとVddを用いる。またフォーマットは右寄せとする。したがって、

ADCON0 = 0x21; //AN6を選択、モジュールを有効にする
ADCON1 = 0x00; //電圧リファレンスはVssとVddを用いる
ADCON2 = 0x22; //アクイジションタイムは8TAD、クロックはFosc/32
ADCON2bits.ADFM = 1; //右寄せ

Ⅲ A/D変換の開始は、以下の1行でよい。

ADCON0bits.GO = 1;

Ⅳ A/D変換の終了は、ADCON0bits.NOT_DONE = 0をポーリングで検出するかA/D変換終了割り込みフラグを検出するかのどちらかだが、今回はポーリングとした。すなわち、以下の1行である。

while(ADCON0bits.NOT_DONE);

Ⅴ A/D変換結果の取得は、ADRESLとADRESHから取得すればよい。今回は『PICで動かすUSB』第4章-5を参考にしGenericTypeDef.hというヘッダファイルに定義されているWORD_VALという共用体を使って格納することにした。すなわち以下のような記述となる。

 WORD_VAL w; //WORD_VAL型のwを使う
 w.v[0] = ADRESL; //下位8ビットを格納
 w.v[1] = ADRESH; //上位2ビットを格納

3.動作確認

 動作確認は、変換対象のアナログ電圧を変化させてその変換結果を調べることにした。その結果が、図3である。与えた電圧に対してほぼ直線的に変換結果も対応しているので概ね正しく変換されていると思われる。

変換結果
図3 入力電圧とA/D変換結果

まとめと今後の課題

 PIC18F14K50のA/D変換モジュールを用いてA/D変換を行い、正しく動作させることができた。これで、A/D変換を行った結果をUSB経由でPCに送信するためのテクニックが揃ったので今後このテクニックを生かしてまた何かを作ってみたい。

要旨

  PICマイコンを用いたUSBデバイスの自作に関する記事である。本記事は第4回として実験用基板に仮想シリアル通信デバイスのサンプルプログラムを書き込み動作テストを行った。


背景と目的

  本ブログのPICマイコン関連実験でよく参考書として使用している『PICで動かすUSB』の中には、USB-シリアル変換デバイスのサンプルがある。これは、仮想シリアルポートを構築し、USBでPCと接続してシリアル通信(RS-232C)ができるものであり、今後のUSBデバイス製作において有用と考えられるため、ぜひテクニックとして習得しておきたい。そこで、今回はサンプルを用いてUSBによる仮想シリアルポートを構築し通信させてみる。


活動の詳細
1.サンプルプログラムの概要

  サンプルプログラムは、毎度おなじみのApplication Librariesに用意されており、USB Device - CDC - Serial Emulatorというフォルダの中にUSB Device - CDC - Serial Emulator - C18 - Low Pin Count USB Development Kit.mcpを用いる。このサンプルであれば手持ちのPIC18F14K50が載ったテキスト付属の評価ボードがそのまま使用できる。このサンプルの動作は、PICとシリアルで接続されたデバイスからシリアルデータを受信し、USBによる仮想シリアルポートを経由してPCへデータを送信する、あるいはその逆を行えるようになっている。PCへ接続すると、仮想シリアルポートとして認識されることになる。サンプルプログラムをそのまま動作させた場合のイメージ図は図1のとおりである。


PICの役割
図1

2.プログラムの準備と変更

  サンプルプログラムでは、評価ボードとシリアルで接続されたデバイスからデータを受信してPCに送信するためそのようなデバイスが必要であり、参考書の中では温湿度計を用意して実験していた。しかし、筆者の周りには手ごろなものが無かったので、プログラム中でシリアルを受信したことにして、それを仮想シリアルポートを通してPCに送るように改造した。
変更前のプログラムでは、図2.1に示すとおりデバイスからシリアルでデータを受信するとmDataRdyUSART()(実体はシリアル受信完了割り込みフラグPIRbits.RCIF)が1になり、PCへの送信データバッファがいっぱいでなければ送信データバッファにデバイスからの受信データを書き込み送信できるようになっている。
そこで、今回はボタンを押すと特定文字列が贈られるように変更する。まずシリアル受信完了割り込みフラグを無視し、評価ボードのボタンが押されたことを判断基準に変更した。また、文字は1文字ではなくわかりやすくHello!の6文字を送信するよう6つのバッファに一気に書き込むことにする。それと、ボタンのチャタリング対策などを盛り込んだ。この結果が図2.2である。


変更前
図2.1 プログラム変更前

変更後
図2.2 プログラム変更後

3.動作確認

  動作確認には、Tera Termを使用した。通信速度はプログラム上はどうにでもなるらしいがとりあえず19200bpsとしてある。結果は図3のとおりであり、ボタンおしたところ、ボタンを押すたびにHello!が表示された。これより、USBによる仮想シリアルポートとして正常に動作していることが確認できた。


動作確認
図3 動作確認

まとめと今後の課題

  USBによる仮想シリアルポートを構築し、正常に動作させることができた。今後は、このテクニックを実際の機器に応用してみたい。

このページのトップヘ