ジャンル不定の日記です。

AVRでソフトウェアUSB

電子回路の工作をやろうとしているが、
まずは勉強も兼ねて、電圧と電流の制御だけでできて難易度は高く無さそうな気がして、そこそこ実用的と思うので、USB->NiMH充電制御とNiMH->USB電源をやってみようと考えているが、
電子工作を続けるのに、その先に作るものを考えないといけないよね。

他のものの制作を考えると、
  • PC用デバイスの作成。
  • PCから制御する工作機械等の特殊機器の作成。
といった感じで、思いつくのはPCと連携して使うものがほとんど。
工作機械は、フライス盤とか3Dプリンタが安く作れないかなーとか・・・
PC用デバイスの作成は、マウスやキーボードなどは市販品使えばいいが、それらとディスプレイの制御を自分で作れるような技術があれば、
応用して、ノートPCとかの古いゴミを活用してモバイルPC的なのができれば面白いかなと。

PCと接続するデバイスを作る場合はAVRマイコンを使って処理を行うつもりだが、
古いノートの再利用とかならマウスやキーボード的なのはPS/2とかでつなぐという手もあると思うが、どっちにしろ、USBの技術を避けて通るのは不適切で、USB機器を開発できるようにするべきだよね。

というわけで、AVRマイコンでUSB通信をすることについての情報を調べた。


以前ちょっとAVRをやった時に、AVRでソフトウェアUSBを作ってキーボードを作成してる人の情報を見た記憶があるので、
USBコントローラー的な外部チップは無しでソフトで実装することを考えていたが、
調査序盤で、AVRと外部のUSB-シリアル変換チップを使ってUSBデバイスを作ってる人の情報ばっか出てきた。

なので、eBayでAVRと合わせて使えそうなUSB-シリアル変換チップを探してみた。
20円前後からある安いUSB-シリアル変換ボードを見ると、FT232RL,CP2102,CH340G,PL2303HXのいずれかのチップが使われている模様。
自分で作る機器に搭載しようとすると2.54mmピッチのDIPパッケージが良いが見つからず、ピン数も結構あるので難しそう・・・
チップ単体でも100円以上しちゃう感じだし、USB-シリアル変換チップを使うなら、200円の完成品ボードを使っちゃったほうが良いかも。
だが、機器作るたびに200円コスト増は厳しいね・・・
あと、LinuxにはこれらのUSB-シリアル変換チップ用のドライバは標準で入っているのでドライバは不要だが、マウスやキーボードといったデバイスをUSB-シリアル変換を介して作るとなると独自ドライバが必要になっちゃうよね・・・


さらに調べていたのだが、AVR-CDC日本語)というものを発見した。
外部チップ無しでUSB-シリアル変換を行うもので、当初考えていたソフトウェアでのUSB実装だね。

AVR-CDCはV-USBというソフトウェアUSB通信を実装して、シリアルに変換するものぽい。
V-USBのサイトに他のプロジェクトが多数紹介されていて、i2c-tiny-usbというものを発見した。

i2c-tiny-usbはUSBをI2Cという規格のシリアル通信に変換するもののようだが、
I2Cというのは使ったことがなかったが、シリアルコンソールを使って対話するだけのものではなく、デバイス接続用のバス規格で、Linux標準でもデバイスドライバが多数存在する模様。
さらに、i2c-devというデバイスファイルを作成するだけの汎用ドライバが存在して、デバイスファイルを読み書きするだけで対話ができる模様。
これ使えれば、シリアルコンソールで対話するのが基本のAVR-CDCより良さそうかも・・・

V-USBのサイトには他のソフトウェアUSB実装として、IgorPlug-USB,USBtinyの2つが紹介されていた。
i2c-tiny-usbはV-USBの派生というよりもUSBtinyの派生ぽい。
とりあえず、それらのいずれかを使って実験してみたい。


V-USBの回路


USBtinyの回路

SPI変換の回路のようで、右側はSPI部分。
SPIもI2Cの様なデバイス接続用のバス規格で、4本の信号線で接続できるらしい。

IgorPlug-USBの回路



いずれの回路も12MHzのクリスタルを使ってマイコンの周波数を決めて、低速USBの速度を作ってる。
IgorPlug-USBはクリスタルのところにコンデンサが入ってないが、良いのか?
V-USBとUSBtinyは27pFのコンデンサが2個ついてる。

3つともATTiny2313を使っているが、別のものでもできると思われる。
クリスタル内蔵マイコンなら別途クリスタルが不要らしい。
まあ、ATTiny2313の手持ちがあるんで、それ使うつもり。

USB電源は5Vだが、信号は3.3V(?)らしく、V-USBは順方向ダイオードで落としてマイコン自体が3.3V駆動ぽい。
USBtinyは信号部分だけ3.6Vのツェナーダイオードで落としてる。
IgorPlug-USBは信号も5Vになっているように見えるが、良いのかこれは?

信号はD-には1.5kΩの抵抗入れて電源が繋がってる。
D+もD-も両方共68Ωの抵抗を入れてマイコンのpinにつながってる。
D+とD-はどっち向きの信号なのかよくわからないのだが、コード見ればわかるかな?

他に電源部分にコンデンサがいくつか入ってる。


知識もないのでよくわからんが、IgorPlug-USBはちょっと怪しい感じがする。
V-USBとUSBtinyの大きな違いはマイコンの電圧の差が違うように見えるところかね。
V-USB式の方が部品が一個少なくて済むのかな?
5V駆動の方がファーム更新の時にやりやすいかとも思ったが、AVRプログラマで給電できれば問題ないのかな?

実験するには、12MHzのクリスタルの調達が必要そう。
68Ωと1.5kΩは無いけど、合成抵抗で近くの値にすれば平気かな?
手持ちのダイオードやLEDでちょうどいい電圧が作れるかな?手持ち部品を電源に繋いでテスターで電圧測る必要がありそう。
コンデンサは要らない機器バラして入手できないかな?クリスタルも不要品から調達できたりすれば追加調達要らないかも・・・

これ使いこなせればいろいろ作れそうな気がする・・・