= ATmega32U4ブレークアウトボード = [[Image(http://www.switch-science.com/upload/save_image/02101157_4f348790b95f0.jpg)]] * [http://www.switch-science.com/products/detail.php?product_id=865 完成品を販売しています。] * [wiki:HomeReflowKit ご自宅リフローお試しキット]で作ったのと同じボードです。 * [http://doc.switch-science.com/schematic/32u4-bb.pdf 回路図PDF] == 概要 == ATmega32U4の乗った単純なボードです。 ATmega32U4には、工場出荷時からブートローダが書きこまれていて、DFU機能を実現しています。 DFUというのは、USB経由でファームウェアを書き込むことを可能にする機能です。 AVR ISP mkIIのような書き込み装置が要らないのが魅力的です。 ただし、'''DFUではブートローダ自体を書き換えることはできません。''' Arduino Leonardo互換にしたい場合は、LeonardoのブートローダをAVR ISP mkIIなどで書き込んでください。 == 特徴 == * QFPパッケージを使っている割には、ボードの幅が小さめ。ピン間700mil。ブレッドボードに最適です。 * USBコネクタは、マイクロUSBです。省スペースです。丈夫なHirose製(ハンダ付け面積が広いため丈夫です)。 * リセットスイッチを搭載しています。 * HWB('''H'''ard'''w'''are '''B'''ootloader)の有効無効を、ソルダジャンパで選べます(出荷時は有効です)。 * バスパワーを使うかどうかを、ソルダジャンパで選べます(出荷時はバスパワーを使用します)。 * オープンソースハードウェアです。[http://creativecommons.org/licenses/by-sa/2.1/jp/ CC BY-SA 2.1ライセンス]に基づき、[http://doc.switch-science.com/schematic/32u4-bb.pdf 回路図]の再利用を認めます。 * クロックは16MHzです。電源は5Vです。 * RX/TX/LのLEDは、Arduino Leonardo準拠です。 == 問題 == * クロックはセラロックであるため、水晶より誤差が大きいです。USBの規格からは外れてしまいます。 * クロック16MHzなので、マイコンの電気的特性により、3.3Vでは動作しません。3.3Vで動作させたい場合は、ソルダジャンパの切替の他、クロックの変更が必要でしょう。 == Errata == * シルク間違い * マイクロUSBコネクタを右にした時の下部 * 誤 B4,B5,B6,B7,'''D7''',C7,GND * 正 B4,B5,B6,B7,'''D6''',C7,GND * 裏面のソルダジャンパに「HWB」の表記が無い。 == DFUの動作サイクル == ボード裏面にHWBというソルダジャンパが有り、出荷時はショートしてあります。 現在出荷中の商品では、「HWB」のシルクがありません。シルクが無いソルダジャンパがHWBです。 ショートしてある場合は、以下のような挙動を示します。 何もファームウェアが書き込まれていない時 1. USBに接続する 1. DFUが有効になる [http://code.google.com/p/arduino-i18n/downloads/list ここからArduino IDEの最新ベータ版をダウンロード]してインストールします。 何らかのファームウェアが書き込み済みの時 1. USBに接続する 1. 書きこまれているファームウェアが動く 1. リセットボタンを押す 1. DFUが有効になる == ウィンドウズ == [http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3886 Atmelが提供しているFLIP]というソフトウェアを使います。 これをインストールしてから、このボードをパソコンに接続してください。 ドライバファイルが自動的に見つからない問題が発生しているようです。 その場合には、ドライバファイルを手動で指定してください。 ドライバファイルは、「`C:\Program Files\Atmel\Flip`''バージョン番号''」以下に有るようです。 [wiki:32u4bb_Win7inst こちら]もご参照下さい。 [[Image(flip.png)]] ファームウェアを書き込むには、以下のように操作します。 1. 一番左のアイコンをクリックして、チップを選択します(ATmega32U4を選んでください)。 1. 右から3番目のアイコンをクリックして、HEXファイルを読み込みます。 1. 左から2番目のアイコンをクリックして出てくるメニューからUSBを選択します。 * 「USB Port Connection」というダイアログが現れるので、「Open」ボタンをクリックします。 1. 「Operation Flow」の項のチェックボックスが全てチェックされている事を確認し、「Run」ボタンをクリックします。 ファームウェアを書き込んだら、USBから一度抜き差しすると、ファームウェアが動きます。 Flipの「Start Application」ボタンをクリックするのでもいいはずなんですが、うまくいかない事があります。 書き込むファームウェアによるように感じます。 == Linux == `dfu-programmer`を使います。 インストール方法は、Linuxのディストリビューションごとに違うので、適切な方法でインストールしてください。 たいてい、コンパイル済みのパッケージが用意されているでしょう。 UbuntuやDebianなどのapt系ディストリビューションでは sudo apt-get install dfu-programmer でインストールできます。 1. `dfu-programmer atmega32u4 erase` 1. `dfu-programmer atmega32u4 flash `''HEXファイルのファイル名'' 1. `dfu-programmer atmega32u4 reset` これでファームウェアが動き出します。 もしも動かなかったら、USBから一度抜いて挿しなおしてください。 == Mac OSX == Linuxと同じく、`dfu-programmer`を使います。 インストールするには、「`sudo port install dfu-programmer`」コマンドを使います。 いや、その前に`port`コマンドをまだインストールしていない人はインストールしてください。 [http://www.macports.org/install.php インストール方法はここにあります]が、英語です。 == お試しファームウェア == とりあえず、キーボードのふりをするファームウェアを載せておきます。 [attachment:HelloArduino.hex HelloArduino.hex]をダウンロードして、書きこんでみてください。 定期的に勝手にキーボードを叩いたふりをします。 さて、これをどうやって作ったか。 一番簡単な方法をお教えします。 1. Arduino1.0以降をダウンロードします。 1. Arduino IDEを起動し、Tools/Boardから、Arduino Leonardoを選択します。もし選択肢にない場合、Arduinoのインストールディレクトリ(ex:/usr/share/arduino/hardware/arduino/boards.txt)から、Leonardoに関するコメントアウトを解除します。次に、以下のコードのスケッチを作ります。 {{{ #!C void setup() { } void loop() { Keyboard.print("Hello Arduino"); delay(1000); } }}} 1. 「スケッチ」メニューの「検証・コンパイル」を実行します。 1. TempディレクトリのどこかからHEXファイルを探します。 Arduinoのメニューから、File>Preferencesを開き、"Show verbose output during:"の、compilationを選択します。 そしてコンパイルすると下の通知欄から、どこのディレクトリで作業しているかわかることでしょう。 * ウィンドウズなら、「`C:\Users\`''ユーザ名''`\AppData\Local\Temp`」フォルダを開いて、検索窓で「hex」を検索します。 * Linuxならば、/tmp/build-''randnum''.tmp/''ファイル名のプレフィクス''.cpp.hexが該当します。 * ~~Mac OSXなら、「`/tmp`」のどっかですかねえ。~~ [http://ytsuboi.hatenablog.jp/entry/2011/11/26/031418 Mac OSXについては、こちらを参考にしてください。] == もうひとつお試し == [attachment:MouseText.hex MouseTest.hex] {{{ #!C int phase = 0; int full = 100; int radius = 100; int delay_msec = 2; int x = radius; int y = 0; void setup() { } void loop() { ++phase; phase %= full; double th = 3.141592 * 2 * phase / full; int xx = radius * cos(th); int yy = radius * sin(th); Mouse.move(xx - x, yy - y, 0); x = xx; y = yy; delay(delay_msec); } }}} 勝手にぐるぐる回る迷惑なマウスです。 ''(2011/11/26)''