窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

Arduino Pro Micro互換のボードをDFUモードに入れるようにDFUローダーを焼いていく話

最近ポケットモンスターソード・シールドを適当なキャプチャデバイスにつないで、VR機器で表示して、そのコントローラーで操作して遊ぶアプリケーションを公開した。

GitHub - yamachu/SwitchSerialController

VR機器で見るってだけであれば、キャプチャデバイスをつないで、画面を転送し、Switchのコントローラーを取り外して遊ぶだけで実現するけれども、そのままVR機器のコントローラーでやってみたいなってことで今回は頑張ってみた。

これをしたいわけじゃなくても、Switchの自作コントローラーを作ってみたり、マイコンで制御したい、みたいな人が出てきたときのために備忘録としてまずはDFUモードで書き込めるようになるまでのことを書き残す。

なお今回はmacOSを使ったやり方を載せている。

必要なもの

  • ATmega32U4(の乗ったボード)
    • 今回試したのは32U4だけど、ATmega16U2とかみたいに、とりあえずUSB機能がついてるやつであれば良さそう
  • USBケーブル(ボードによってminiBだったりmicroBだったりがあるのでその辺はよしなに)
  • ファーム書き込むためのPC

あると便利なもの

  • ブレッドボード
  • ハンダゴテとか半田とか
  • ジャンパワイヤ
  • ポチポチ出来るスイッチ

作成までの流れ

ちゃんとしたArduinoとかArduino(ほぼ完全)互換であればやり方はググれば出てくるのでその辺参照。

最近TLで見かけたのは

macOSでArduino UNO R3にDFUモードでプログラムを書き込む - 酢ろぐ!

なのでここからは私みたいにケチってPro Micro(やPro Micro互換)(

とか みたいなやつ)を買った人を対象に書いていきます。

(1) . そもそも焼かれてるブートローダは何かを確認

買ったマイコンをUSB接続してみて接続デバイスのところになんて表示されるかを確かめる。

macOSなら

$ system_profiler SPUSBDataType

みたいのをターミナルで叩いたり、linuxならlsusb、Windowsならデバイスマネージャーを開くといいだろう。

Arduino〜とか表示されていたらArduinoブートローダーが書かれている。 しかし本物のPro Microを手に入れていた場合はリセットボタンを素早く2回押すとDFUモードに入ることが出来る。

Pro Micro & Fio V3 Hookup Guide - learn.sparkfun.com

接続デバイスの表示が変わっていたりしたらおそらくDFUモードに入れているだろう。 8秒間待ってみて元の表示に戻ったらビンゴである。 これによりPro Microのブートローダーが書かれていることが分かる。 その人は同じ手順を書き込む前に行ってDFUモードに入って書き込みを行えば良い。 low, high, extend fusesを書き換える必要もあるかと思うが、実際Pro Micro買ってないのでfusesの状態がどうなっているのか確認が出来ない。 この辺りは自己責任で行って欲しい。 お疲れさまでした。

それ以外の場合はATm32U4DFUみたいに表示されるはずである。 この場合は特に頑張らずとももうDFUモードに入っているので、hexを書き放題である。 お疲れさまでした。

(2). 追加で必要なものを揃える

不運にも(?)Arduino Leonardoとかのブートローダーが焼かれた石を手に入れてしまった人々はこれから元のブートローダーに戻すために頑張る必要が出てくる。

更に必要なものが増えてくる。

  1. Arduino or Pro Micro互換のやつもう一つ
  2. ジャンパワイヤ
  3. ブレッドボード

この3つである。

AVRISPがあればそれを使えば良いのだが、これを読んでいる層にそれを持っている人間はいないと思っているので(持ってるんなら読まなくても出来るはず)、上記のものを買い揃えて欲しい。 こうやって買い揃えて行くと、

を始めっから買っておいたほうが楽だということに気づくだろう……(複数作りたい場合は私のようなやり方になるはずだけど)

(3). Arduinoの一つをArduino ISPに書き換える

手持ちのArduinoArduino ISPに書き換えていく。 簡単に言うとAVR(乗ってるマイコン)の書き換え器である。

Arduino ISPに書き換えるにはArduino IDEを使うと便利なのでまずはIDEをダウンロードする。

Arduino - Software

適当な場所に展開したら起動し、Arduino ISPに書き換える対象のArduinoをUSBで接続する。

Arduino IDEの使い方は各自調べて欲しい。

今回使用するスケッチはArduino ISPである。 これを開き対象のArduinoに書き込む。

(4). 配線する

ボードによって違いが出たり、32U4以外のものでは違ってくるのでこの辺りは各自調べながら行って欲しい。 今回はPro Micro互換の32U4が乗ったボードを例に行う。

ISP ターゲット
VCC VCC
GND GND
D10(SSだっけ?) RST
D15(SCK) D15
D14(MISO) D14
D16(MOSI) D16

となるようにブレッドボードやジャンパワイヤを使って配線していく。

こんな感じ

(5). 接続の確認

上記配線が正しく行えているか、ターゲットのマイコンの中身を読む作業で確認してみる。

これにはavr関係のバイナリが必要になるが、これは先程ダウンロードしたArduino IDEに同梱されているのでこれを使わせてもらう。 PATHとしては

${ArduinoIDEが展開されているディレクトリ}/Arduino.app/Contents/Java/hardware/tools/avr/bin 以下を見ると良い。

PWDをそのディレクトリに移した状態で、

$ ./avrdude -p atmega32u4 -c avrisp -P /dev/tty.usbmodem142101 -C ../etc/avrdude.conf -b 19200 -v

を入力する。 -p atmega32u4-P /dev/tty.usbmodem142101 の部分は各自自分の環境に合わせて書き換えること。

出力として

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "../etc/avrdude.conf"
         User configuration file is "/Users/yamachu/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/tty.usbmodem142101
         Using Programmer              : avrisp
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega32U4
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  9000  9000 0x00 0x00
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel AVR ISP
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9587 (probably m32u4)
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D8
avrdude: safemode: efuse reads as CB

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D8
avrdude: safemode: efuse reads as CB
avrdude: safemode: Fuses OK (E:CB, H:D8, L:FF)

avrdude done.  Thank you.

こんな感じのものが現れれば成功である。

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x000000 (retrying)

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x000000 (retrying)

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.


avrdude done.  Thank you.

こんな感じになったらどこか配線が間違えているので確認すること。

(6). DFUモードに入れるDFUローダーを書き込む

工場出荷時のものがないと書き込みが出来ないが、ググると詰め合わせなどが見つかる。 今回は

https://make.kosakalab.com/make/electronic-work/aitendo-pm32u4/

こちらで公開されているDFUローダー詰め合わせを使わせてもらった。 上記のDFUローダーを展開し、32U4の場合は上記サイトに書かれている手順で行う。

$ ./avrdude -p atmega32u4 -c avrisp -P "/dev/tty.usbmodem142101" -C ../etc/avrdude.conf -b 19200 -e # erase
$ ./avrdude -p atmega32u4 -c avrisp -P "/dev/tty.usbmodem142101" -C ../etc/avrdude.conf -b 19200 -U lfuse:w:0xff:m -U hfuse:w:0xd9:m -U efuse:w:0xc3:m # set fuses
$ ./avrdude -p atmega32u4 -c avrisp -P "/dev/tty.usbmodem142101" -C ../etc/avrdude.conf -b 19200 -U flash:w:/Users/yamachu/Downloads/megaUSB_DFU_Bootloaders/ATMega32U4-usbdevice_dfu-1_0_0.hex # write dfu loader

どうせ後ですぐに何か書き込むだろうしロックビットは設定しなかった。

おわりに

これでリセットピンをGNDに落とせばDFUモードに入れる状態を作れるようになった。

次回は本記事の最初で紹介した他のコントローラーを使ってSwitchを操作したプログラムのビルドなどを書いていければと思う。