dfu-programmer で Arduino UNO の ATmega16U2 に Windows から書き込む

Windows 版の dfu-programmer で Arduino UNO の ATmega16U2 に書き込む方法をいつも忘れて調べてしまうので、メモです。

Arduino UNO などについている ATmega16U2 にカスタムファームを書き込んであげることで、Arduino を USB-MIDI や HID デバイスにすることができます。

Windows から書き込むには、dfu-programer の Windows 版ダウンロードしてを使うと簡単です。

dfu-programmer
dfu-programmer is a multi-platform command-line programmer for Atmel (8051, AVR, XMEGA & AVR32) chips with a USB bootloader supporting ISP. Most Atmel devices having a USB port come pre-programmed with the bootloader, and this is a lightweight alternative to Atmel’s own FLIP/BatchISP program. This is a mostly Device Firmware Update (DFU) 1.0 compliant user-space application.

You can download the source distribution from the project files page. Windows users can download a pre-compiled executable, a set of USB drivers and the HTML help file in a separate zip file from the same page.

project files にコンパイル済みの dfu-programer.exe と USB デバイスドライバが同梱されたアーカイブファイルがあるので展開しておきます。

次に Arduino の次のジャンパーをショートさせたまま USB で PC に接続し、Arduino の電源ランプが点灯したらショートを解除します。(本来はドライバーなどでなくジャンパピンを使いましょう。。

ショートを解除すると Windows がデバイスドライバを検索しにいきますので、先ほど展開したアーカイブに同梱されている atmel_usb_dfu.inf を指定してあげると次のように ATmega16U2 がデバイスとして認識されます。

認識後、dfu-programmer.exe でデバイスを指定して erase 後、ファイルを指定して flash してあげると書き込みできます。(自分の環境では erase でエラーがでましたが書き込みは大丈夫のようです)

> dfu-programmer.exe ATmega16U2 erase
Checking memory from 0x0 to 0x2FFF...  Not blank at 0x1.
Erasing flash...  Success
Checking memory from 0x0 to 0x2FFF...  ERROR.

> dfu-programmer.exe ATmega16U2 flash hogehoge.hex
Checking memory from 0x0 to 0xFFF...  Empty.
0%                            100%  Programming 0x1000 bytes...
Success
0%                            100%  Reading 0x3000 bytes...
Success
Validating...  Success
0x1000 bytes written into 0x3000 bytes memory (33.33%).

デバイス名の指定は USB の認識名と同じ名称にするようにしてください。大文字小文字も区別するようで、正しく指定しないとデバイスが見つけられません。

なお、オリジナルのファームウェアは次からダウンロードできます。(Arduino SDK にも含まれているはずです)

https://github.com/arduino/ArduinoCore-avr/tree/master/firmwares/atmegaxxu2

Arduino MEGA の ATmega16u2 側のファームを Midi Firmware for Arduino Uno (Moco) で書き換え MIDI USB デバイスにした様子です。 🙂

Arduino で MIDI や HID デバイスがつくれるといろいろ活用範囲が広がりますです!  😀

関連

Arduino + MAX7219 + 1088AS 8×8 matrix LED + MIDI でパターン表示

手持ちしていました 1088AS 8×8 matrix LED とコントローラー MAX7219 の DIG/SEG 配線にちょっと手こずりましたので備忘録です。最終的に出来上がったシールドは MIDI と接続してみました。:)

MAX7219 データーシート

MAX7219/MAX7221は、コンパクトなシリアル入力/出力コモンカソードディスプレイドライバで、マイクロプロセッサ(μP)と、最大8桁の7セグメント数字LEDディスプレイ、バーグラフディスプレイ、または64の個別LEDをインタフェースします。

Arduino の LedControl ライブラリサンプルで MAX7219 をふたつ接続した場合は次のようになると思います。

LedControl lc = LedControl(12, 11, 10, 2);
1088AS MAX7219 Arduino 備考
1 3  DIG 4
2 5  DIG 6
3 14  SEG A
4 16  SEG B
5 8  DIG 7
6 23  SEG D
7 10  DIG 5
8 6  DIG 2
9 2  DIG 0
10 20  SEG C
11 21  SEG E
12 7  DIG 3
13 22  SEG DP
14 11  DIG 1
15 15  SEG F
16 17  SEG G
1 12  DIN
4 GND
9 GND
12 10 MAX7219#2 の LOAD(CS) も
13 11 MAX7219#2 の CLK も
18 ISET (LED 電流制限 10KΩ)
19 Vcc 0.1μF(+10μF)のパスコン入れる
24 MAX7219#2 の DIN(1) へ

1088AS は型番が書いてある真ん中にとんがりがある方が下で、左下が 1pin となり、あとは IC といっしょで反時計回りに 1, 2, 3pin となります。(右上が 9pin、左上が 16pin)

Arduino MEGA のシールドにマトリクス LED と MAX7219 をそれぞれ 2つ実装してみました。(狭いので半田付けが結構厳しかったです…)

出来上がったシールドの活用として、Arduino の ATmega16u2 側のファームを Midi Firmware for Arduino Uno (Moco) で書き換え MIDI USB デバイスにし、プログラムをかいて MIDI IN をひろって 8×8 LED でパターン表示できるようにしています。 🙂

反応も良くてなかなか良い感じです!ヒョー

Visual Studio Code extension for Arduino で電子工作

Visual Studio Code Advent Calendar 2017 の 13日目の記事です。 🙂

昨日の「Visual Studio Code の PHP 言語サポート vscode-php-intellisense 2017年版」に続きまして今日は VS Code と Arduino による電子工作です。

なんだか今年は趣味の電子工作をよくしていた年だったように思いますが、そんな中でも我らが VS Code が活躍してくれました。

Microsoft 謹製 “Visual Studio Code extension for Arduino” という思わぬ伏兵のリリースにびっくりしてしまいましたが、IntelliSense が使える快適なマイコンプログラミングができるようになりました。 🙂

この記事は Windows と Linux で動作することを確認しています。(シリアルポートドライバーの関係で電子工作では  macOS を使う機会がなかったのでした…)

準備

vscode-arduino は、VS Code 上で Arduino のマイコンプログラミングを可能にする拡張です。vscode-cpptools と依存関係があり、C++ の IntelliSense と Arduino 操作が協調して動作します。

Arduino のコンパイラや転送ソフトウェア自体は Arduino IDE に含まれるものが使われますので Arduino IDE の導入が必要です。導入された Adruino IDE は vscode-arduino により自動的に認識されます。

Arduino IDE と vscode-arduino 拡張の導入後、vscode-arduino の次の基本設定を “Default” から “Tag Parser” に変更してください。

{
    "C_Cpp.intelliSenseEngine": "Tag Parser"
}

Arduino の C like なソースコードは include することなく標準ライブラリが使えるようになっていますが、Default パーサーの場合は厳密にソースコードで #include <Arduino.h> などとしないとパースできず IntelliSense が効きません。

このことから “Fuzzy” な検索が出来る “Tag Parser” を使うことでこれを解決してあげます。

ここまでの準備ができたら、空のフォルダを vscode で開き、Arduino のソースファイルとなる空の hogehoge.ino ファイルを作成し開くと vscode-arduino が活動を開始します。(ステータスバーに Arudino の情報がでれば OK です)

Visual Studio Code extension for Arduino

空の hogehoge.ino ファイルができたらまずはターゲットとなる Arduino ボードの設定をします。

F1 キー押下後 “Arduino Board Config” を選択してください。

設定画面がでますので、ターゲットとなるボードを選択します。

選択後、プロジェクトフォルダに .vscode と 2つのファイルが作成されます。

  • arduino.json – Arduino の設定情報が入ります。
  • c_cpp_properties.json – C/C++ パーサーの設定情報が入ります。

c_cpp_properties.json を開き、Arduino IDE の位置を正しく自動認識して brows.path に設定されていることを確認してください。

"browse": {
    "limitSymbolsToIncludedHeaders": false,
    "path": [
        "C:\\Users\\hirom\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.19\\cores\\arduino"
    ]
}

先に設定した “C_Cpp.intelliSenseEngine”: “Tag Parser” では、解析の設定に brows.path が用いられます。外部ライブラリなどで IntelliSense が正しく働かない場合は、この部分にパスを追加してみてください。(なお Default パーサーでは “includePath” が使われるようです)

では早速ソースコードを書いてみましょう。

IntelliSense やコードレンズが効いて良い感じです。標準の Arduino IDE は補完がサポートされておらず、また Java / Swing でできていることもありフォントなども綺麗にでませんでしたが、vscode-arduino なら全て解決で嬉しくなってしまいます 🙂

最後に Arduino へのプログラムの転送ですが、 “Arduino Board Config” と同様に F1 キーから “Arduino Select Serial Port” で接続先の COM (/dev/ttyUSB) を指定した後、”Arduino Upload” をすれば OK です。

シリアルモニターも同じ操作から “Arduino Open Serial Monitor” で起動可能です。

hexdump for VS Code

vscode-arduino とは直接関係ありませんが、hexdump for VS Code 拡張が便利でしたので合わせて紹介します。

マイコンプログラミングをしているとバイナリデーターと格闘しなくてはいけないことがありますが、hexdump for VS Code は VS Code 内でバイナリ表示・編集を可能にする拡張です。

VS Code エクスプローラーのファイル右クリックコンテキストメニューが拡張され、”Show Hexdump” できるようになります。表示されたバイナリではカーソル選択による “Hex Inspector” が使え、選択値の各種長さの 10進数表現を見たり、右クリックメニューから 1byte 単位の編集が行えます。(便利!)

VS Code で電子工作

今年は実際に Visual Studio Code extension for Arduino を活用して、数台の電子工作を行ってみましたが、トラブルもなく非常に快適でした。

では最後にそんな中の 1台の “未来ガジェット” の紹介をして今年の VS Code Advent Calendar 2017 の担当分を終わろうと思います。 3日間に渡りすいませんでした。

また来年。

# 動画中 vscode-arduino のコンソールが文字化けしているのは半年ほど前の古いバージョンの不具合で、現在は修正されています。:)

未来ガジェット 3号 “古の電子オルゴール”

何十年前ものPC ゲーム少年達を魅了したYAMAHA のシンセサイザー LSI YM2151 で、今再び楽曲を奏でるという、未来ガジェットと呼ぶにふさわしい趣味の一品。

YM2151 は YAMAHA 自身が iOS でエミュレーターをつくるなど、今なお多くの人を魅了する FM 音源と呼ばれるシンセサイザーで、暖かみのあるエレピやゲーム向きのエッジの効いた音が発声できることを特徴としています。

発売から数十年経過し、当然生産終了しているこの LSI を海外ルートから取り寄せ、先人が残した情報を元に回路を再現。オルゴールの盤面ともいえる ROM に格納した楽曲データーをマイコンから LSI に送信することで発声させています。

特にマイコン側の制御ソフトウェアが難しかったですが、小中学校時代に毎夜毎晩打ち込んでいた MML を思い出しながら、ついに楽曲が奏でられた時は泣きそうになったのでした。

この作品は基板が小さく、自分の腕前ではデジタル側とアナログ側の GND をうまく分離できず、よく聴くとチリチリと裏でデジタルノイズが鳴ってしまっているのですが、小学生の頃 PC から奏でられていた楽曲にも同じノイズが乗っていたことがフラッシュバックしタイムリープ寸前に。

いつか僕らが未来振り返る時には。骨董品を極めた作品となりました。

関連