2011年5月21日土曜日

Arduino Uno DFU プログラミング

***(9/28)追記:Arduino Uno R2 というバージョンが出たので、こちらも参考にしてください。
***


Arduino Uno とそれ以前のArduino シリーズでは、USB シリアル変換部が異なります。以前は FT232RL という専用IC でしたが、Uno は atmega8u2 という、AVR マイコンを使用しています。

これまで、特に意識せずに使って来ましたが、このマイコン自体もプログラミング可能です。USB HID (キーボード、マウス、ジョイスティック)やUSB-MIDI などのデバイスも作成可能とされています。

もともと、そこに興味があってUno を購入したのですが、Arduino IDE とは別にAVR の開発環境が必要だったり、書き込みのためのプログラムが必要だったりと、不明な点が多々有り、手を出せずにいました。
最近、制作例やドキュメントがWeb 上にあがってきたので、挑戦してみます。

参考にしたのは以下のサイトです。

Arduino.cc - Updating the Atmega8U2 on an Uno or Mega2560 using DFU

darran さんのArduino Hacking

Arduino.cc - MIDI Note Player using the MIDI firmware for the 8U2 (Uno and Mega2560 only)


言葉の整理
通常のArduino 開発で使わない用語が出てくるので、解説します。

DFU (Device Firmware Upgrade) モード:atmega8u2 のプログラムを書き込むモード。
Arduino Uno の atmega8u2 には「DFU ブートローダ」が書き込み済みで、AVR ライタなどがなくても、通常のUSB 接続でプログラムを転送することができます。

LUFA (Lightweight USB Framework for AVRs) :AVR 用の様々なUSB デバイスクラスのライブラリを公開しているプロジェクト。

dfu-programmer:Mac でDFU モードのAVR デバイスにプログラムを転送するためのソフト(コマンド)。
MacPorts のdfu-programmer は0.5.2 で、このバージョンではNG かと思ったのですが、このバージョンでの実行例がArduino.cc にありました。

HEX ファイル:コンパイル後のプログラム、AVR に転送する。

atmega8u2 を書き換えてしまうと、メインのatmega328p にプログラムの転送ができなくなります。
ICSP などの手段が無い場合は、メインプログラムの更新時に再度 DFU モードでUSB シリアル変換のプログラムを書き込みます。

・Arduino-Uno オリジナルの USB-Serial 変換用HEX (Arduino-usbserial-uno.hex)
 Arduino IDE のバンドル(Arduino.app)の中にもあります。

・darran さんのキーボード用 HEX Arduino UNO Keyboard HID version 0.3 (Arduino-keyboard-0.3.hex)

・morecat_lab さんの MocoLUFA (MIDI.hex)

書き込み手順
1) Arduino のメインプログラムをatmega 328p に書き込む
2) atmega8u2 をDFU モードにする (→参考:http://arduino.cc/en/Hacking/DFUProgramming8U2
3) atmega8u2 にプログラムを転送する

Arduino プログラム更新手順
1) atmega8u2 をDFU モードにする
2) atmega8u2 にUSBシリアル変換のプログラムを転送する
3) Arduino のメインプログラムをatmega 328p に書き込む
4) atmega8u2 をDFU モードにする
5) atmega8u2 にプログラムを転送する


非常に面倒なので、本格的にデバッグすることを考えると、別の書き込み手段が欲しくなりますね。


iPad Camera Connection Kitで iPad に、USB Keyboard やUSB MIDI として認識させることができました。

残念ながら、このアダプタはiPhone/iPod Touch では使用できません。また、あまり大きな電流を取ることができません。

0 件のコメント:

コメントを投稿