AVR USB接続の周辺機器をPCから操作する〜仮想COMポート〜
2009年8月 「LCD応用例 カレンダー付き時計〜外字登録を活用しよう〜」で紹介した LCD時計をPCから制御できるようにしました。(写真拡大はここをクリック) LCD時計の制御云々よりも、マイコンで作った周辺機器をPCとどうやって接続して どうやって制御するのか、その方法を説明した記事だと思って読んでもらえればと 思います。 このページでは全体構成を説明し、回路図とプログラム、 LCD時計を制御するWindowsアプリ(ソースも)を公開しています。 |
全体構成の説明
全体構成と制御アプリについて説明します。 全体の構成 (写真クリックで拡大) PCと仮想COMポート間はUSB接続。PCからはCOMポートが増設されたように見えます。 仮想COMポートとLCD時計間はシリアル通信で接続。コマンドを受け取り、時刻設定やバックライトの明るさなどを調節します。現在の設定値をPCへ送信することもできます。 仮想COMポート 今時のほとんどのPCにはCOMポートが付いていません[*1]。USBに代わりました。しかしPCに周辺機器を接続して制御するにはCOM(シリアル通信/RS-232C)の方が扱いやすいので、USBからCOMに変換する(仮想的なCOMポートを増設する)モジュールがよく使われます。これにはFT-232RLなど専用ICや、そもそもUSB機能を内部に取り込んだマイコンがあります。 一方で、安価なAVRにUSB-シリアル変換機能を持たせてみようというアイデアに挑戦する人もいて、それを実現しています。ネットで検索してみると回路もファームもV-USBをベースとしたものが多いようです。 またこのモジュールは、単にCOMポート(シリアルポート)を増設するだけでなく、I/Oポート(パラレルポート)として使うこともできます。先のFT-232RLにもビットバンモード(BitBangモード)という同様の機能があります。PCにこのモジュールを接続したい理由は、どちらかというとこのI/Oポートとしての使い方をしたいから、という人もいるでしょう。 さて今回、AVRを使ったUSB-シリアル変換モジュールにAVR-CDCを使いました。AVRへの実装はある程度プログラム領域の容量が必要ですが(ATtiny45[4KB]、ATmega8[8KB]など)、容量が少ないATtiny2313[2KB]にも一部機能を制限して実装できます。 このモジュールの魅力は、I/Oポートが多めに取れる他、レジスタを操作できることです。つまりUSB-シリアル変換モジュールでありながら、AVRが持つタイマ・カウンタやPWM制御の機能が使えます。パラレルポートとしての使い方と同時に、シリアル通信の機能も使えます。 2009/11 追記: [*1]…と言われてるようですが実はそんなことありません。メーカー製PCやノートPC、今流行のネットブックには確かにCOMポートは付いていません。しかし自作PCの世界では、最新マザーボードでも未だにCOMポート(シリアルポート)が付いていることが多いです。それは背面端子の形ではなく、マザーボード上に2x5のピンヘッダとして付いています。本来D-SUB 9ピンの形で出ている信号がそのままピンヘッダに出ています。自分のPCにはCOMポートがないと思っている自作PC派の人は、マザーボードの説明書やメーカーサイトのスペック一覧で確認してみてください。 自作PCに詳しい人ならCPUにAtomを搭載したMini-ITXのマザーボードが最近増えていることもよく知っているでしょう。これはむしろ背面にCOMポートが付いているのが当たり前、といった代物です。安価なMini-ITXマザーでAVR工作専用PCを1台組んでしまうのも良いと思います。5Vや12Vの電源も楽に取れますし。 LCD時計 「LCD応用例 カレンダー付き時計〜外字登録を活用しよう〜」で紹介したLCD時計に、コントラストとバックライトを調節するPWM制御と、コマンドを送受信するシリアル通信の機能を追加したものです。時計機能の各種設定はシリアル通信で外部から操作しますが、シリアル通信と切り離して単独でも設定できるようにしてあります。 ↓単独で(外付けスイッチで)コントラストを調節している様子。
LCD時計を制御するアプリ 動作環境:USBコネクタが付いていて .NET Framework 3.5がインストールされているPC 開発環境:WindowsXP / Visual Studio 2008 Express Edition - C# AVR-CDCの制御はサンプルコードのcdcio.csを参考にしています。同じくサンプルコード内、C用のATtiny2313レジスタ定義ファイルをC#用に作り替え、それにレジスタのビット名の定義を加えて使っています。ビット名の定義はWinAVRの定義ファイルから持ってきました。 Windowsのレジストリは使いません。インストール/アンインストール作業もありません。 LcdClockControler.exe実行で上記ダイアログ画面が起動します。 1.COMポート選択 AVR-CDCを接続して出現したCOMポートを選択して[接続]ボタンを押します。 接続すると[解除]表示に変わります。 2.日付と時刻 「現在の日時」のチェックで、PCのシステム時刻が表示されます。[日時をセットする]ボタンで、LCD時計がこの日時に設定されます。 「任意の日時」をチェックすると、PCのシステム時刻と関係なく自由な日時をLCD時計にセットすることができます。 いずれにしても曜日は年月日によって一意に決まるものなので、単独では変更できません。 3.表示モード 西暦/元号、24時間制/12時間制の組み合わせで4通りの表示ができます。 リストボックスから選択決定すると、自動的にLCD時計の表示が変わります。 4.バックライト バックライトの明るさを0〜16で変更します。0でバックライト・オフ、16で最大輝度です。 バーをスライドさせるとリアルタイムでLCD時計のバックライトの明るさが変化します。 5.コントラスト 文字のコントラストを0〜8で変更します。0で最も濃く、8で消える寸前の薄さです。 バーをスライドさせるとリアルタイムでLCD時計のコントラストが変化します。 6.アプリ終了 設定が完了したらアプリを終了してOKです。ずっと起動しておく必要はありません。 アプリを終了するときは[×]ボタンでいきなり終了せず、先に[解除]ボタンでCOMポートの接続を解除してください。 7.その他 バージョン表示をクリックしてみてください。特に意味はありませんが。 1.で「COMnのオープン失敗.」と表示される場合(WindowsXPの例) Windowsのデバイスマネージャを開き、「ポート(COMとLPT)」から対象とする「通信ポート(COMn)」を選択して右クリック。無効をクリック→有効をクリック。そして手順1.からやり直してください。 これでもまだCOMnに接続できない場合、PCを再起動して手順1.からやり直してください。 動作の様子
|
ダウンロード
プログラムの説明 AVR-CDC(USB-シリアル変換モジュール) AVR-CDCのサイトから「CDC-IO」のファイルをダウンロードして、ATtiny2313用の.hexファイルを(AVR-CDCの)ATtiny2313に書き込みます。 LCD時計のファームウェア LCDClockP 解凍して出てくるLCDClockPフォルダはAVR Studioのプロジェクトフォルダです。defaultフォルダ内の LCDClockP.hex, font5x8.eep を(LCD時計の)ATtiny2313に書き込みます。 font5x8.binはfont5x8.eep(Intel HEX形式)の元であるバイナリファイルです。LCDClockP.hexのビルドには必要ありませんが、もしfont5x8.eepを削除してしまったときは、このファイルから復元してください。 なお、バージョンが0.03ですが未完成というわけではなく、LCDClock v1.00からプラスして0.03 (=1.03)、くらいのつもりでこのようなバージョンにしています。 LCD時計を制御するWindowsアプリ LcdClockControler インストール作業はありません。LcdClockControler.exe実行でアプリが起動します。操作方法はmanual.htmlを読んでください(先述の説明文を抜粋したもの)。 解凍して出てくるLcdClockControler_VS2008proj.zipはVisual Studio 2008 Exp.EditionのC#のプロジェクトフォルダを圧縮したものです。 |
回路と部品について
回路図(画像クリックで拡大)
2009/08/25 追記: AVR-CDCを基板に実装しました。(写真クリックで拡大) AVR-CDC ほぼ、AVR-CDCとV-USBのサイトで公開している回路図の通りに組んでいます。AVR-CDCサイトではUSBからの5Vをダイオードで3.6V程度に降圧してAVRやその先の接続機器に供給する形ですが、自分は5V系のまま使いたかったので、V-USBサイトで説明しているツェナーダイオードを使った回路を組みました。 USBのD+線からプルダウンしている1MΩの抵抗は、V-USBサイトの回路図にあったので付けましたが、バスパワー駆動で使うなら省略してよいと説明されています。
USBの5Vライン付近の電解コンデンサは電源安定用です。4.7uFがなければ数十uFでもよいでしょう。AVR付近の0.1uFのコンデンサはパスコンなのでVCCピンの近くに配置してください。 水晶発振用のコンデンサは、12MHzなら自分は22pFを好んで使いますが、18pFでもよいでしょう。AVRのデータシートの説明を読んでください。 LCD時計 LCDモジュール(SD-1602)は4bitモードで使います。 LCDから読み込みをしないことにするのでR/W線はGNDに接地します(書き込み固定)。 Vo(コントラスト)とA(バックライトのアノード)はAVRからPWM制御します。16bitタイマー・カウンターは計時に使っているので、8bitタイマー・カウンターでPWM制御することになり、PB2, PD5ピンをこの目的で使います。 バックライトの電流制限抵抗は20〜100Ωで決めます。秋月電子でSD-1602を購入したらオマケで100Ωが4個入っていたので、全部並列にして25Ωで使っています。 LCD時計はAVR-CDCモジュールとシリアル通信します。互いのRXDとTXDを接続することに注意してください。RXD同士、TXD同士を接続しても動作しません。 またシリアル通信をせずとも、スイッチ2個で日時設定など出来るようにしてあります。 時計はAVRの内蔵発振器で動作しています。ひどく時間がずれるので、実用的に使うならクリスタルで動かした方がよいです。そのためXTAL0, XTAL1ピンを空けてあります。 大抵のデスクトップPCでは電源を切ってもUSBからの5Vは出力されています。LCD時計の電源をUSB給電にすれば、PCの電源を切っても時計は動き続けます。バックライトもコントラストもそのままです。すなわちAVR-CDCからLCD時計まで一続きでUSB給電にする使い方(バスパワー駆動)がお勧めです。 |
AVR-CDC | ||||
部品名 | 部品番号 | 値 | 個数 | 参考価格/備考 |
AVR(マイコン) | U | ATtiny2313 | 1 | 100円(秋月電子) |
クリスタル | XTAL | 12MHz | 1 | 50円(秋月電子) |
電解コンデンサ | C1 | 4.7uF | 1 | 10円 |
積層セラミックコンデンサ | C2 | 0.1uF [104] | 1 | 10個100円 |
(積層)セラミックコンデンサ | C3,C4 | 22pF [22] | 2 | 1個10〜20円 |
抵抗 | R1 | 1.5kΩ [茶緑赤金] | 1 | 1個5円/100個100円 |
抵抗 | R2,R3 | 68Ω [青灰黒金] | 2 | 1個5円/100個100円 |
抵抗 | R4 | 1MΩ [茶黒緑金] | 1 | 1個5円/100個100円 |
ツェナーダイオード | D1,D2 | 3.6V | 2 | 1個20円(千石電商) |
LCD時計 | ||||
部品名 | 部品番号 | 値 | 個数 | 参考価格/備考 |
AVR(マイコン) | U | ATtiny2313 | 1 | 100円(秋月電子) |
LCDモジュール キャラクタ液晶 |
LCD | SD1602HUOB (-XA-G-R) |
1 | 900円(秋月電子) バックライト:オレンジ |
抵抗 | R1 | 20〜100Ω | 1 | 上記LCDに100Ωが4個 オマケで入っています |
積層セラミックコンデンサ | C1 | 0.1uF [104] | 1 | 10個100円 |
タクトスイッチ | SW1,SW2 | 2 | 10個180円 (千石電商 店頭価格) |
仮想COMポートを使ってLCD時計をPCから制御しました。 これだけでなくもっと多目的にLCDモジュールを使うことを考えています。 例えばCPU負荷やメモリ使用状況やネットワークのトラフィック状況など表示し、 PCの電源オフ時は時計表示にしておく、といった使い方をしたいです。 AVR-CDCのI/Oポートがごっそり未使用なので、 ここから直接LCDモジュールを制御してみようということです。 上手くできたらまた記事に書きます。 |