Arduino Leonardo/Micro風に、LUFAでUSBデバイスを作ってみる


貧乏人はマイコンだけ使いたいのだ!。。。が!??

micro

Arduino LeonardoやMicroを使えばUSBキーボードなどのデバイスを簡単に作ることができます。
でも、USBデバイス1つ作るたびに、Arduinoを1台買うなんて、貧乏くさい私には到底できることではありません。
というわけで、少しインターネットで調べてみると、どうやらUSB機能を搭載したAVRに、Dean Cameraさんが作成したLUFAというライブラリを使ってファームを書き込めば、様々なUSBデバイスが作れるみたいです。

LUFA (Lightweight USB Framework for AVRs)

というわけで、やってみました。

どのAVRで作る?

LUFAは、非常に多くのAVRマイコンをサポートしています。

とりあえず、今回試したいのは、Arduino LeonardoみたいなUSBデバイスなので、Arduino Leonardoに使われてるのと同じATmegaを使おうと思います。

と思って、ATmega32U4のスペックをみてみました。ところが。

ATMega32U4のスペック
32u4.png

44PIN!

。。。。普段8PINとか、多くても14PINとかのATTinyしか使ってないヘタレはピンの数だけで挫折気味です。配線する気になれない。。。w (だから最初っから皆ボード使うんですよ。という声が聞こえてきそう。)

というわけで、32U4は早速あきらめ、できるだけPINが少ないAVRを探してみることに。

LUFAが対応しているAVR8のピン数は下記の通りでした。

AVR ピンの数
AT90USB82 32
ATmega8U2 32
AT90USB162 32
ATmega16U2 32
ATmega16U4 44
ATmega32U2 32
ATmega32U4 44
AT90USB646 64
AT90USB647 64
AT90USB1286 64
AT90USB1287 64

どうやら、後ろが2で終わるAVRが32PINで、この中ではピンが少ないようです。それでも多いんですけど。。。
いろいろ探してみると、秋月で下記2つが見つかりました。(海外でも探したのですが、USB対応のAVRはそれほど安くありません。秋月の現在の価格は海外と比べても安い方です)

データシートを見比べても、容量以外あんまり変わらないですね。
ADCやI2Cが無いですが、今回はとりあえず簡単にLUFAを使うことが目的で、かつROM 16Kbyteもあれば十分なので、安いAT90USB162を使って回路を作ることにしました。

90usb162.png

32ピンとはいえLQFPパッケージなので、変換基板が無いとブレッドボードやユニバーサル基板で回路作れません。
一緒に変換基板も買って帰ってさっそく回路を作ります。

回路

下記サイトを参考にさせていただいて、回路を組んでみました。

回路

基板はこんな感じに。

基板

Arduino Leonardoのニセモノ!です。例によってカッチョ悪いですが!w

MacでLUFAをビルドするための準備

これまでArduinoしかやったことが無かったので、これまたインターネットに教えてもらいながら環境構築からです。
下記手順でできました。

1. LUFAのダウンロードと解凍

  • LUFAから、LUFA 140928をダウンロード
  • ダウンロードしたzipを解凍したフォルダを適当なパスに置きます

2. CrossPack AVRのインストール

  • CrossPack AVRをインストール。(最新版で良いはずだが、私は同時に進めているATTiny841の環境との兼ね合いもあり、CrossPack-AVR-20131205.dmgを入れた)

3. dfu-programmerのインストール

これは、Arduino UNOとの兼ね合いもあるので、Arduino UNO R3 + dfu-programmerって、みんなどうしてるの?を参考に、dfu-programmer v0.6.1をインストールします。ビルド済みbinと、libusb(macportsで入れれば良い)を入れます。

4. Mac再起動 (pathを有効にする?)

まぁ、いろいろ入れたので一度Macを再起動しましょうw
これで、ビルドの準備が整いました。

とりあえずビルドしてみる

LUFAを解凍したディレクトリを~/lufaに置いたとして、下記のようにコマンドを入力すればビルドできます。

cd ~/lufa
make

しかし!

これだと、ものすごい数のいろいろなものがビルドされます!
というか正直何がなんだかわからないw

何がなんだかわからないので、とりあえず1つだけビルドしてみる

とりあえず、個人的な趣味で、USB-MIDIをビルドしてみることにします。
せっかくボードを作ったので、ボードにあわせて少し修正します。

~/lufa/Demos/Device/ClassDriver/MIDIに、USB-MIDIのサンプルがありますので、これをベースに修正します。

最初、こんな感じになっていますが、

MCU          = at90usb1287
ARCH         = AVR8
BOARD        = USBKEY
F_CPU        = 8000000

これを、下記のように修正します。

MCU          = at90usb162
ARCH         = AVR8
# BOARD        = USBKEY
F_CPU        = 16000000

あと、LEDやらJoyStickやらのコード例が入っているのですが、正直そんなモノは付いてませんw
サンプルからまずははずしたいところですので、いろいろとコメントアウトします。

~/lufa/Demos/Device/ClassDriver/MIDIをもとに、下記機能だけにしたものをgithubに置いておきました。

  • ボタンを押したらLチカ
  • MIDI受信してもLチカ

謎のボード用の超シンプルにしたUSB-MIDIのサンプル

まとめ。確かに手を動かして何かを作った気になった。。。。。が?

LUFAを使うと確かに簡単にUSB機器が作れそうです。
ただ、いままでArduinoになれた身としては、様々なライブラリをどこから探してどう組み込めばよいか、正直まだよくわかっていません。
おそらく、AT90USB162にはUSB-MIDIの機能だけ実装してSPIかUSARTで別のATmegaなどと通信させ、そちらで様々な機能を実装するのでしょう。

。。。。それって。。。。

  • Arduino UNOとおんなじ!!!!!!!!!!!!!!
  • Arduino UNOを使ったUSB-MIDIシリアルは Moco for LUFA

はい!

どうやら、車輪の再発明すらできてない、というオチでしたw

↓ココに見事に戻りました!

超簡単!Arduino UNOをMIDIコントローラーにしよう!

いろいろやってみたが、振り出しに戻った!という感じ。LUFA実験終了!!w (まったくバカっぽい)