USBデバイスの作り方
今回いろいろ調べものをしていて、USBデバイスの作り方のまとまった情報が無くて不便に感じたので、紹介します。
□なぜUSBデバイスなのか
PCとマイコンを通信させて何かしたいってことありますよね。
PCからサーボを動かしたり、文字を送ってLCDに表示したりしている方は良くみかけます。
そういうときに便利なのがUSARTと呼ばれる通信方法で、大半の人がUSARTを使っています。
プロトコルが非常にシンプルで多くのマイコンがサポートしているので、まず通信したいときはこれを使うのが良いです。
でもこれ、PCにD-subポートが必要なんです。
最近のPCにはD-subポートが無いかわりにUSBポートがあるので、USART-USB変換機(USB-D-sub変換ケーブル)が必要になります。
USBとUSARTはプロトコルも端子数も違うのでケーブルは必須です。
USBケーブルでPCと自作デバイスをダイレクトにつなげたいですよね。
まあwケーブルはそんなにこだわる部分ではないのですが、USARTのもう一つの欠点は通信速度なのです。
PICを使うとしたら大体1.5Mbps190kbps(一秒間に190,000ビット)= 23.75[kbyte] が限界です。
文字や数字データを送りたい場合には全然問題のない速度ですが、画像データの場合はどうでしょうか。
サイズ640*480[pixel]で1[pixel]が2[byte]の画像を送るとしたら640*480*2=614.4[kbyte]
一枚送るのに約25秒かかります。
2年ほど前からアマチュアの間で液晶制御が流行りはじめましたが、マイコンのメモリが少なくて画像一枚表示するのが精いっぱい。
動画も再生したいけど、マイコンの外に記憶媒体をつけて制御するのは面倒で諦めた人も多いと思います。
デジタル回路を勉強し始めたときってドットマトリクスLED制御で心おどりますよね。
あれがカラーでできたらどれだけ凄いかと思った時期が私にもありました。
私はそのためにSTM32マイコンやFATファイルシステム、SDカードの制御等を勉強して半年がかりで動画再生にこぎつけました。
まあ、これはスタンドアローンで動いてなんぼのものなので、これでいいのですが、今後も大量のデータをやりとりするのにわざわざデータをSDカードに保存して、マイコンで読み込んで、というのでは色々禿ます髪が無くなります。
そこでマイコンをPCにダイレクトに繋いで大量のデータを高速にやりとりしようぜ!USARTじゃ遅いからUSBでやろうぜ!というのが今回思い立った理由です。
□USBとは
USBとはUSBの通信プロトコルとか何なのか。
通信自体は今回選ぶICが勝手にやってくれるので、自分たちが抑えるべきは始めに書いてあるスピードの種類くらいです。難しく考える必要はありません。
スピードにはハイスピード、フルスピード、ロースピードの3種類があります。
それぞれ最大480、12、1.5[Mbps]で通信できます。
USBの規格にはUSB1.1、USB2.0があり、USB2.0のみがハイスピードに対応しています。
先ほどの画像を毎秒30枚送って動画を再生したければ、最低147[Mbps]必要なのでハイスピードが必須です。
USBをサポートするICにはフルスピード以下しかサポートしていないものが多いので注意が必要です。
□デバイス
USARTの場合、Windowsが専用の通信ソフトやAPIを提供してくれているので、PC側では簡単なプログラムやソフトを使えば通信できます。
しかしUSBの場合そのようなものはないので、最悪自分でドライバを書く必要があります。
今回はドライバを書かなくても使えるもの、具体的には仮想COMポート(USART)として扱えたり、専用のAPI(メーカが用意した通信のための命令や関数)が提供されているものを紹介します。
○Arduino(マイコン)
こいつはゲテ物です。
マイコン-PC間はUSBのケーブルだけですが、マイコン内部に先述の’USART-USB変換機 ’が内蔵されているので、USBの皮をかぶったUSARTです。
もちろんPC側でもUSARTとして認識されるので、USARTとまったく同じ方法で使えます。
通信速度もUSARTと同等、とりあえずUSB接続ならいいという人はこれが簡単なのでおすすめ。
Arduino自体も非常に使い易いので、手軽にマイコンを使いたい人には一押しです。
USBマウス程度の通信量ならこれで十分ですが、私的にはUSBデバイスを作ったことにはなりません。
USBデバイスなんだよ!って言えば大概の人は騙せますがw
○USB内蔵マイコン
H8とかAVR、dsPICを使ったことないのでその辺は知りませんが、USBを内蔵したPICマイコンがあります。
170円と非常に安価なのが特徴です。
こいつは先述のゲテ物と本物の顔両方を持ちます。
USART、USBどちらとしても使えるということです。
しかし、USBとして使う場合はPICのライブラリやPC側のドライバを用意しなければなりません。
あとリンクにはUSB2.0対応と書いてありますが、フルスピード以下しか対応していません。
もうゲンナリしますね。苦労して環境を準備してハイスピードで通信できると思ったら、フルスピード以下。
そういう意味でこいつもゲテ物w
○FT232H
ガチでハイスピードを使って手軽にUSB機器を開発したい!という人はこれ。
今一番熱いUSBデバイスです。
USB2.0、ハイスピードに対応しています。
FTDI社のデバイスドライバやAPIが使えるので、PCに接続するだけでUSBデバイスとして認識され、PC側の通信プログラムもAPIを使って容易に記述できます。
ただ、FT232H自体は先述のArduinoやUSBマイコンのようにプログラマブルではないので、例えばセンサからのデータが欲しい、モータを制御したい等の場合は、別途マイコン等が必要です。
FT232HはマイコンとPCの間を仲介する形になります。
それじゃマイコンとFT232Hの間の通信はどうなるの?って話になるのですが、大丈夫。
マイコン-FT232H間はSPI、I2C、FIFO、JTAG、Bit-Bang、FSI等をサポートしています。
特にFIFO、Bit-Bangあたりを使えば非常に高速に通信が可能です。
各通信方法についてはデータシートを参照願います。(多すぎて紹介できないw)
データシート
□FT232Hの使い方
PCに接続します。
Ver2.08.14最新FTDIドライバからドライバをダウンロード、デバイスマネージャ等からインストールしてください。
FT_Prog_v2.4.zipをダウンロード、展開して”FT_PROG.exe”を実行
FT232HのEEPROMを書き換えるアプリケーションです。通信方法等を設定できます。
EEPROMなので一度設定したらリセットしない限り保持されます。
使い方はFT_Prog モードの変更方法を参照。
PC側の通信ソフトはC#で作れます。WindowsならVisualStudioで作れば良いと思います。
APIのインストールや使い方はFT245RL用DLLの使い方(中野氏)を参考にしてください。
APIの使い方D2XX Programmer's Guideを上手く噛み砕いて説明されています。
(電子工作したいだけなのに、PC側のソフトを作るのはちょっと・・・って人のためにAcknowrich系のソフトを作ろうかなと思っていまが、先述の通り通信の種類が多いので、一部に限定、もしくは公開しないかもです・・・)
マイコン-FT232H間の通信方法はデータシートをみてください。
こういう説明書は図が多いので、英語だからぱっと見て諦めなくても案外なんとなくでいきます!w
ピンアサインはデータシートと説明書を参考にしてください。
ページ数は多いですがピンアサインとタイミングチャートあたり4ページ程度をみればオッケーです。
あと、大まかな通信方法は先述の”FT_PROG.exe”でEEPROMをいじることで設定できますが、細かい部分はソフトウェア的(通信時にPCからコマンドを送る)に設定する必要があります。
その辺に注意して進めればいいと思います。
私自身今日FT232Hと同期式FIFOで通信が確立できたところなので、とりあえず提供できる情報はこの辺までです。
ちなみに実測の平均通信速度は約294[Mbps]≒36[Mbyte/s]、PCの状態に左右されるのでハイスピードの最大速度480[Mbps]には及びませんが、640*480[pixel]、30[fps]のカメラからリアルタイムでPCにデータ保存したい私にとっては十分でした。