最近ポケットモンスターソード・シールドを適当なキャプチャデバイスにつないで、VR機器で表示して、そのコントローラーで操作して遊ぶアプリケーションを公開した。
GitHub - yamachu/SwitchSerialController
おじさんがOculus LinkとOculus Questを使って、マホイップちゃんと戯れるシーンです pic.twitter.com/PD7HnsFqoF
— ちゅうこ (@y_chu5) 2019年12月12日
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互換)(
Pro Micro開発ボード ATmega32U4 5V/16MHzモジュール ナノボード ピンヘッダー付
- メディア: エレクトロニクス
(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とかのブートローダーが焼かれた石を手に入れてしまった人々はこれから元のブートローダーに戻すために頑張る必要が出てくる。
更に必要なものが増えてくる。
- Arduino or Pro Micro互換のやつもう一つ
- ジャンパワイヤ
- ブレッドボード
この3つである。
AVRISPがあればそれを使えば良いのだが、これを読んでいる層にそれを持っている人間はいないと思っているので(持ってるんなら読まなくても出来るはず)、上記のものを買い揃えて欲しい。 こうやって買い揃えて行くと、
を始めっから買っておいたほうが楽だということに気づくだろう……(複数作りたい場合は私のようなやり方になるはずだけど)
(3). Arduinoの一つをArduino ISPに書き換える
手持ちのArduinoをArduino ISPに書き換えていく。 簡単に言うとAVR(乗ってるマイコン)の書き換え器である。
Arduino ISPに書き換えるにはArduino IDEを使うと便利なのでまずはIDEをダウンロードする。
適当な場所に展開したら起動し、Arduino ISPに書き換える対象のArduinoをUSBで接続する。
今回使用するスケッチは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 |
となるようにブレッドボードやジャンパワイヤを使って配線していく。
こんな感じ
流石にみんながみんなavrisp持ってるわけじゃないので、2つPro Micro互換の持っていたら、1つをDFUで書き込めるようにの説明は入れておくかーって試したら出来た pic.twitter.com/NoZ6qfB5h2
— ちゅうこ (@y_chu5) 2019年12月14日
(5). 接続の確認
上記配線が正しく行えているか、ターゲットのマイコンの中身を読む作業で確認してみる。
これにはavr関係のバイナリが必要になるが、これは先程ダウンロードしたArduino IDEに同梱されているのでこれを使わせてもらう。 PATHとしては
${ArduinoIDEが展開されているディレクトリ}/Arduino.app/Contents/Java/hardware/tools/avr/bin
以下を見ると良い。
$ ./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を操作したプログラムのビルドなどを書いていければと思う。