Edited at

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

More than 3 years have passed since last update.


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

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 (まったくバカっぽい)