ProMicroをArduinoのISPにする

概要

  • Pro MicroをPro Micro用のISPに仕立てた(+3.3V/8MHz版)。
  • Arduino IDEに付属の ArduinoISPスケッチを使うときは、プログラマとして、Arduino as ISP (ATmega32U4) を選択する。
  • avrdude.exe で指定するprogrammerのid (-cオプション) には、avrispではなく arduino を指定する。
Pro Micro as Arduino ISP

秋になったある日、Pro Micro +3.3V/8MHz版のUSBケーブルをPCに接続しても仮想シリアルポートが出てこなくなった。そのためArduino IDEからスケッチの書込みができなくなった。ブートローダーを開始させるためにRSTピンをGNDに落としたりするが、うまくいかない。いつの間にか別のマイコンのブートローダーでも書いてしまったのかもしれない。

しょうがないので、ISPを使ってブートローダーを書き直すことにした。以前は+5V動作のPro MiniにUSB-シリアルデバイス(FT231X)を接続してやっていたが、今回のターゲットは+3.3V動作のPro  Microなので、同じく+3.3VのPro MicroをISP装置に仕立てることにした。電圧の高い方から低い方に接続するラインにレベルシフタを入れることも考えられるが、同じ動作電圧のマイコンが使えるならその方が話は簡単だろう。

ISPやブートローダーについては、Arduino.cc が公開している Arduino as ISP and Arduino Bootloaders を参照のこと。

接続回路

2つのPro Microの接続は以下のようにした。

Pro Micro as Arduino ISP

図面左側のPro Microがターゲット(書き込まれる側)で、右側がISPになる。ISP側のUSBコネクタにケーブルを差してPCまたはハブに接続する。2つのPro Microの電源としては、ISP側のLDOレギュレータの出力(+3.3V)が供給される。オンボードのLDOには300mAくらいの出力能力があるはずなので、電源は問題ない。

ISP側が+5V動作ならば

ISPとターゲットを接続するSPI用ラインのうち、ISP側が駆動するのはSCLKとMOSIの2本だけなので、+5V動作のArduinoをISPにするならばこれら2本を+3.3Vにレベルシフトする。そして、D10とターゲットのRSTを接続するリセット用の接続もレベルシフトが必要になる。また、ターゲット側の電源としてISPのRAW(USBのVBUS相当)またはVCCから、ターゲット側のRAWに接続する。

Arduino IDE (1.8.15)

ツールメニューの書込装置に、Arduino as ISP (ATmega32U4) という項目が増えていた。以前使ったときはなかったと思うのだが、しばらく「書込装置」は開いていなかったので、いつ追加になったのかはわからない。

書き込み装置の選択

当然これを選ぶ。ツール/ブートローダを書き込む を選ぶと、なんの問題もなく、書込みが終了した。

Arduino as ISP Arduino as ISP(ATmega32U4)の相違については後述する。

avrdudeのパラメータ

フラッシュ内容の消去やヒューズの書き換えを行うときなど、avrdude.exe を直接使うことになる。avrdudeをコマンドラインから実行する場合、オプション -c に続けてISP装置名を指定する。 前にやったときは -c avrisp とか書いて通ったのだけど今回はだめだった。

c:\Program Files (x86)\Arduino\hardware\tools\avr\bin>avrdude -C ..\etc\avrdude.conf -p m32u4 -P COM6 -b 19200 -c avrisp2
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer

Arduino IDEを使ったブートローダー書込みは成功するので、参考のために出力エリアを見てみると、以下のようになっていた。

Arduino IDEによるavrdudeの実行

-carduino とあるので、書込み装置名は arduinoとするようである。書き込み時のコマンドラインを表示するときには、以下のように環境設定で より詳細な情報を表示する:書き込み をチェックしておく必要がある。

環境設定

avrdudeに対して -c arduino を与えて実行したところ以下のように正常に動作した。

c:\Program Files (x86)\Arduino\hardware\tools\avr\bin>avrdude -v -C ..\etc\avrdude.conf -p m32u4 -P COM6 -b 19200 -c arduino

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"

         Using Port                    : COM6
         Using Programmer              : arduino
         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 : Arduino
         Description     : Arduino
         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.02s

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

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

avrdude done.  Thank you.

“-v” を指定しないと以下のようにヒューズのもつ値があっさりと出力される。

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin>avrdude -C ..\etc\avrdude.conf -p m32u4 -P COM6 -b 19200 -c arduino

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9587 (probably m32u4)

avrdude: safemode: Fuses OK (E:CE, H:D8, L:FF)

avrdude done.  Thank you.

arduino プロトコルについて

ArduinoIDE の ツール/書込装置 で選択される内容は、…\Arduino\hardware\arduino\avr\programmers.txt に書かれている。その内容の一部を抜粋すると以下のようになっていた。

#通常のArduino用の項目
arduinoasisp.name=Arduino as ISP
arduinoasisp.protocol=stk500v1
arduinoasisp.program.protocol=stk500v1
...
#ATmega32U4 (Leonardo, Pro Micro)用の項目
arduinoasispatmega32u4.name=Arduino as ISP (ATmega32U4)
arduinoasispatmega32u4.protocol=arduino
arduinoasispatmega32u4.program.protocol=arduino
...

stk500 というのはATmel社が出していた AVR用の書込み装置で、ここでは制御側(PC)とのコマンドやデータのやり取りの規則(プロトコル)の名称として登場している。avrdudeのソースファイルを見ると、”stk500v1″プロトコルと”arduino”プロトコルはほとんど同じで、PC側からシリアルポートをオープンする際にちょっとした工夫が入っているだけのようだった。

最後に、ブートローダー書込みをしているときの様子です。一瞬ですが。