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

# 貧乏人はマイコンだけ使いたいのだ！。。。が！？？

![micro](http://img.dfm.lrv.jp/lufa/micro.png)

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

[LUFA (Lightweight USB Framework for AVRs)](http://www.fourwalledcubicle.com/LUFA.php)

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

# どのAVRで作る?

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

- [Atmel 8-Bit AVR (AVR8) Support](http://www.fourwalledcubicle.com/files/LUFA/Doc/140928/html/_page__a_v_r8_support.html)
- [Atmel 32-Bit UC3 AVR (UC3)](http://www.fourwalledcubicle.com/files/LUFA/Doc/140928/html/_page__u_c3_support.html)
- [Atmel USB XMEGA AVR (XMEGA)](http://www.fourwalledcubicle.com/files/LUFA/Doc/140928/html/_page__x_m_e_g_a_support.html)

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

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

[ATMega32U4のスペック](http://www.atmel.com/ja/jp/Images/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Summary.pdf)
![32u4.png](http://img.dfm.lrv.jp/lufa/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はそれほど安くありません。秋月の現在の価格は海外と比べても安い方です）

- [AT90USB162 (300円)](http://akizukidenshi.com/catalog/g/gI-06995/) [データシート](http://www.atmel.com/ja/jp/Images/7707S.pdf)
- [ATmega32U2 (400円)](http://akizukidenshi.com/catalog/g/gI-06994/) [データシート](http://www.atmel.com/ja/jp/Images/7799S.pdf)

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

![90usb162.png](http://img.dfm.lrv.jp/lufa/90usb162.png)

32ピンとはいえLQFPパッケージなので、変換基板が無いとブレッドボードやユニバーサル基板で回路作れません。
一緒に[変換基板](http://akizukidenshi.com/catalog/g/gP-03781/)も買って帰ってさっそく回路を作ります。

# 回路

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

- [ATmega32U2でArduinoモドキを作る by kosakalabさん](http://make.kosakalab.com/make/electronic-work/atmega32u2-arduino/)
- [AVR PROGRAMMER MODELLED AFTER THE MKII – USES LUFA](http://hackaday.com/2011/07/30/avr-programmer-modelled-after-the-mkii-uses-lufa/)
- [Teensy(1.0)互換ボード (すｚのAVR研究) by すzさん ](http://suz-avr.sblo.jp/article/41835535.html)

![回路](http://img.dfm.lrv.jp/lufa/AT90usb162-LUFA-test.png)

基板はこんな感じに。

![基板](http://img.dfm.lrv.jp/lufa/board.jpg)

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

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

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

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

- [LUFA](http://www.fourwalledcubicle.com/LUFA.php)から、`LUFA 140928`をダウンロード
- ダウンロードしたzipを解凍したフォルダを適当なパスに置きます

## 2. CrossPack AVRのインストール

- [CrossPack AVR](http://www.obdev.at/products/crosspack/download.html)をインストール。（最新版で良いはずだが、私は同時に進めているATTiny841の環境との兼ね合いもあり、`CrossPack-AVR-20131205.dmg`を入れた）

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

これは、Arduino UNOとの兼ね合いもあるので、[Arduino UNO R3 + dfu-programmerって、みんなどうしてるの?](http://qiita.com/tadfmac/items/b941f7d4858386e2d1b0)を参考に、dfu-programmer v0.6.1をインストールします。[ビルド済みbin](http://temp.dfm.lrv.jp/dfuprogrammer/dfu-programmer-061bin.zip)と、libusb（macportsで入れれば良い）を入れます。

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

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

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

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

> cd ~/lufa
> make

しかし！

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

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

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

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

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

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

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

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

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

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

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

[謎のボード用の超シンプルにしたUSB-MIDIのサンプル](https://github.com/tadfmac/lufatest)

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

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

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

- Arduino UNOとおんなじ！！！！！！！！！！！！！！
- Arduino UNOを使ったUSB-MIDIシリアルは [Moco for LUFA](http://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/)

はい！

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

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

[超簡単！Arduino UNOをMIDIコントローラーにしよう！](http://qiita.com/tadfmac/items/9136f47ae1eea99a4ef7)

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