【1】まずは使い方から (2025年1月 by Tokio Yamada)
私自身、動作しない Uno や Nano に出会ったのがこの「Arduino as ISP」を基板として製作した理由です。今後も同様なことが起こりそうなので、この際、ブレッドボードで毎回、構築するのが大変なので基板化しました。
以前、動いていたのに動かなくなったとか、購入した最初から、コンパイルしたスケッチが書き込めないなどの基板を動かせるようにしました。ブートローダーの不良によって動作しない基板って、結構ありますよね。動かない基板でも、たとえば、高い電圧をかけてしまったと言うような壊滅的な事をしない限り、ブートローダーの書き込みで復活する事が意外に多いです。 こりゃダメだと捨てる(私も過去ありました)前に挑戦してみましょう。

左図の「ISP実装基板 & コネクタ付きダウンロードケーブル」はここで入手できます。ブレッドボードやジャンパー・ケーブルを使わず、また Arduino as ISP の書き込みもしないで、直ぐに始められるので、安全で楽です。(回路図)
現在、市場に出回っている多くの Uno や Nano は、本来の物とは違ってきています(互換品)。本来の物は、すぐにブートローダーの書き込みは問題なくできます。ただし、互換品には工夫がいります。ですが、それを修復することは可能です。正規品(【2】)の後の互換の章(【3】)で説明いたします。古い初期の Nano(【4】)についても書き込めます。
左図のISP基板で、Uno は、6Pin のダウンローダーケーブルを使って接続します。 Nano は Target と記入しているソケットを取り付けていますので、そこに挿入して書き込みます。接続はミスなく簡単にできます。(動作図)
「Arduino as ISP」には、Nano を使っており、書き込んでいるスケッチは、Arduino IDE 2.3.3 のメニューの [ファイル]
- [スケッチ例] - [11.ArduinoISP] - [ArduinoISP] です。LED は、そのスケッチの中に解説してある LED
をそのままのアドレスに取り付けています。したがって LED 動作は、このスケッチで描かれている動作のままになっています。USB が接続されて電源が入ると、Programming(緑)、Error(赤)、Hartbeat(青)と順次、点灯・消灯し、その後 Hartbeat の LED は、徐々に明るくなり徐々に暗くなるを繰り返してまさに心臓の鼓動のように発光し、動作・待機していることを示しています。
これを USBでパソコンに接続して、Arduino IDE のメニューの[ツール]から、ブートローダーの書き込みを行うわけですが、このツールの使い方になじむのに、初心者の 私は、少々とまどった事があるので、基本的操作法を、まず知っておきたいと思います。私自身、 Uno と Nano しか使わないので、難しい事は申しませんので気楽に行きましょう。(図はクリックで拡大します)
まず左の図の Arduino IDE の画面を見てください。皆さまがいつも使っておられる画面ですが、図の中の①は、現在USBに接続している Arduino に、コンパイルしたスケッチを書き込む時に使用しますが、この時の➁は そのUSBに接続している Arduino の設定になります。当然、この設定を合わせないと書き込みエラーになりますよね。これはいつもやっている事です。
図の中の③の中の「ブートローダーを書き込む」を実行する時は、USB はターゲットの Aruduino ではなく ISP(この基板のNano) に挿します。その上の欄の「書き込み装置」としての欄には「Arduino as ISP」を指定します。この選択をするときに、ドロップダウンリストには、他に ArduinoISP などまぎわらしい名称の物もありますので、注意してください。そこで大切なのがこの時の➁の設定は、USB に接続している 「Arduino as ISP」(Nano)ではなく、この ISP に接続しているターゲットのArduino のブートローダー対応の設定になります。
つまり、①を操作してスケッチのダウンロードを行う時も、③を操作してブートローダーを書き込む時も、設定エリアとしては同じ➁を使います。この➁の部分は、共用の設定エリアになっていることをご承知ください。
①を操作している時と、③を操作する時は、➁の設定は対象が変わることをに注意してください。正直に申し上げて、私も最初、これが良くのみ込めていませんでした。
ここで気を付けてほしいことは、③の「ブートローダーを書き込む」を実行するつもりで、誤って、①を操作すると「Arduino as ISP」に、今、Editorに入っているスケッチを書き込みことになり、ISPシステムを壊してしまう事になりかねません。それで、ISP
のソフトの破壊を防止するために、現在は、「Arduino as ISP」にハード的なライトプロテクトをかけています。基板の裏に106 のコンデンサ(RST-GND)を付けていますので書き込むとエラーになります。どうしても 「Arduino as
ISP」の内容を書き換えたい時は、一旦、このコンデンサを取り外してください。そして、ボードを Nano に設定し、さらに Processor
にATmega328P(Old Bootloader) を設定(互換機) して書き込んでください。テスト後にもう一度、コンデンサを取り付けられることをお勧めします。
再度、申し上げますが、③の「ブートローダーを書き込む」を実行する時の➁の設定は、あくまで、「Arduino as ISP」に接続している「ブートローダー書き込み対象の Arduino の事」を言っていることに御注意ください。
【2】正規のUno,Nano(ATmega328P)へのブートローダーの書き込み
本来の Uno, Nano の CPU は ATmega328P です。しかし、互換機として ATmega328PB を搭載した Uno, Nano
が、大量に出廻わっています。ATmega328PB は機能的には上位互換なのですが、価格は下がっています(2024年でPBはPの2/3程度)。したがって今後は
Uno, Nano互換機として更に多く市場に出てくるでしょう。
実際、ATmega328P を搭載したものと ATmega328PB を搭載した物の基板を、普通に見比べても見分けがつきません(見かけは全く同じ)。スケッチの書き込みも正規の物とほぼ同等にできます。ただし、互換機へのブートローダーの書き込みは別の工夫が必要で、それは次の章で詳しく説明いたします。
正規と互換を区別するには、とても小さくて薄い文字なのですが、CPU チップに書かれている文字をルーペなどを使って読み取らなければなりません。しかし、これはキッチリ実行してください。 私は、これをやらなかったため、大きな無駄な時間の浪費をした経験がありますから・・・
以下は、その正規の ATmega328P を搭載した物に対するブートローダーの書き込みについてです。さすが正規の物に対してのブートローダーの書き込みは手間いらずで、とてもシンプルです。これが本来の操作法でしょう。
Unoへのブートローダーの書き込み
Unoのブートローダーの書き込みには、付属のコネクタ付きダウンロードケーブルを使用します。これは 6Pin です。ISP基板では ISCPコネクタの
1Pinに、▼マークを付けています。このマークとコネクタの 1Pin マークを合わせて、基板のICSPコネクタに挿してください。接続するときは、USB を抜いた状態、つまり電源の入っていない状態で行ってください。
ターゲットの Uno にも同様の 6Pin-ICSP コネクタがあります。これも 1Pin を合わせなければなりません。ケーブルのコネクタを見ていただければ、▼マークが入っていますから、それが1Pinマークです。写真を参考(クリックで拡大)に接続して下さい。写真の下に、その
ICSPコネクタ部を拡大した図に Pin番号を記入していますからこれも参考にしてください。
メニュー [ツール] の設定は、ボードを[Arduino Uno]。ポートは、この ISP の COM番号。書き込み装置は[Arduino as
ISP] を設定してください。
最後に、メニュー[ツール]の[ブートローダーを書き込む]を実行すると、ISP の緑の LED が点滅を繰り返すのが分かります。Programming している事を示しています。下の出力の欄に、「ブートローダーの書き込みが完了しました」とのポップアップのメッセージが出れば(すぐに消えますが)、OKです。コネクタ付きダウンロードケーブルを使わず、基板に表示している
Unoの番号と挿しピンケーブルで6本接続しても同様にできます。
Nanoへのブートローダーの書き込み

Nano への書き込みのためには、基板についている Target のソケットに対象の Nanoを挿して行います(左図:クリックで拡大)。これもUSBコネクタを抜いた(電源OFF)状態で挿してください。PINズレが無いように注意!
メニュー [ツール] の設定は、ボードを[Arduino Nano]。ポートは、この ISP の COM番号。Processor は、ATmega328P、書き込み装置は[Arduino
as ISP] を設定してください。
最後に、メニュー[ツール] の[ブートローダーを書き込む] を実行すると、ISP の緑の LED が点滅を繰り返し、「ブートローダーの書き込みが完了しました」とのポップアップのメッセージが出れば、OKです。これも、ISP基板の Targetソケットを使わず、Uno
と同じようにケーブルで接続(6Pinコネクタを取り付けて) したり、また基板に表示している Nanoの番号に6本接続しても同様にできます。
【3】互換のUno, Nano(ATmega328PB)へのブートローダーの書き込み
まず、上記の正規の Uno(ATmega328P) の設定のまま、互換の Uno(ATmega328PB)にブートローダーの書き込みを実行してみました。その結果は・・・
avrdude: Expected signature for ATmega328P is 1E 95 0F
Double check chip, or use -F to override this check.
Failed chip erase: uploading error: exit status 1
・・・というエラーがでました。これは AVRDUDE(IDEと協働する基本アプリ) が、『ATmega328P に書き込むつもりだが、対象基板から読み込んだシグネチャーは、これとは違っているよ』
という事を言っているのだと思います。つまりこのままでは、ブートローダーは、シグネチャのミスマッチのため書き込めません。そのシグネチャとは、マイコン別にどうなっているのかをArduinoのマイコン別の一覧表を下図に示します。(クリックで拡大可)
つまり、今書き込もうとしているのはATmega328PBです。シグネチャは、最後の末尾が 0x16 です。ブートローダーのATmega328P
の末尾は 0x0F ですから違っているわけです。
上のメッセージを報告しているのは AVRDUDE.exe という Arduino IDE の下で、ISP とやり取りをして、ターゲットのマイコンからデータの読み出しや書き込みなどの基本的な作業をしているアプリからのものです。このことから、通常のやり方では、互換器にはブートローダーは書き込めないことになります。
WEB上で検索したところ色んな解決法を見ることができました。そして、多くの方が「ブートローダーの書き込み」に関しての記事を上げている事と、その関心の高さに驚きました。その中で、主に2つの解決法を見つけることができました。それを順番に記述してまいります。
(1) ボードの指定にMiniCoreを使う
さきほどのブートローダーの書き込みの時に、メニュー [ツール]のボードに Arduino Uno と指定しました。それを [MiniCore - ATmega328] に変えて指定します。MiniCore を選択すると選べるマイコンの種類が出ます。その指定後、再度 [ツール] に入ると設定項目が増えています。その中の [variant] をクリックすると 328P/328PA, 328/328A, 328PB の3つの選択ができますので、その中から [328PB] を選びます。そして、書き込み装置に [Arduino as ISP] を選択して、[ブートローダーを書き込む] を実行すると、ISPの緑の LEDが点滅を繰り返して(Programming) 、問題なく書き込みは完了します。
これでブートローダーの書き込みは出来たので、ISP を外して Uno を USB に接続して、Lチカなどをコンパイルして書き込むと問題なく動作します。しかし、このコンパイル・書き込みの時の、ツールの設定は、先ほどブートローダーの書き込みの時と同じ設定でなければ書き込めません。つまり、Arduino Uno の設定では使えないのです。見かけは全く Unoなのに、そのスケッチを書き込むときに MiniCore の設定をしなければならない。このやり方は、とても有用なのですが、私としては、あまり採用したくありませんでした。しかし、このやり方は、ATmega168P などの様々なマイコンにも利用できるので、最後の手段として覚えておきたいと思います。
(2) 「avrdude.conf」ファイルを編集して強制的に書き込む
「avrdude.conf」というファイルを編集して、互換機の Uno, Nano をそれぞれ正規品と同じようにスケッチを書き込(→)める様に、ブートローダーを書き込むことができます。この「avrdude.conf」は、AVRDUDE が使う大切なファイルです。壊すと Arduino IDE が動作しなくなるので慎重にやらなければなりません。別途、コピーして、BackUp を取っておいた方が良いです。
さて、その「avrdude.conf」 はどこにあるのか?これはそれぞれのArduino IDE のインストールの状況によって異なります。以下の通りです。
・通常の場所: Windows (64-bit):
C:\Program Files (x86)\Arduino\hardware\tools\avr\etc
・Windows (Microsoft Store版):
C:\Users\<ユーザー名>\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17\etc
・・・私の場合は後者でした。そのホルダ内にある avrdude.conf をエディタで編集する訳ですが、面倒なことに、このファイルの改行(行の終わり)は LF です。改行には CR, LF, CRLFの3 種類があります。Windows付属のメモ帳の改行は CRLF です。ですから、メモ帳で編集した物を保存すると改行コードが変化し Arduino IDE が、ボードの設定を読み込めなくなる可能性があります。
それで sakura Editor の使用をお勧めします。リンク先からインストールできます、無償です。メモ帳では表示されませんが、この「さくらエディタ」では CRLF( ↲ ) と LF(↓)を区別して表示し、かつ保存する時に、改行コードが混在していたら左の様な画面がポップアップして注意を促します。
私は、正直に言って、随分とこの機能に救われたと思っています。ありがたかったです。もし、このポップアップが出たら LF に統一する「はい(Y)」をクリックしてください。
avrdude.conf をエディタ(この後のエディタは全て'さくら'とします)で読み込み「ATmega328P」を検索してください。このような所が出ると思います。
part parent "m328"
id = "m328p";
desc = "ATmega328P";
signature = 0x1e 0x95 0x0F;
ocdrev = 1;
ここに ATmega328P のシグネチャが書かれています。
このシグネチャの最後の 0x0F を ATmega328PB のシグネチャの最後の 0x16 に書き換えます。そして保存(内容はだまし)してください。いずれすぐに、ここは元に戻さないと、後で ATmega328P をアクセスする時に Arduino IDE でエラーを起こすことになるので、忘れない為にエディタはそのままにして良いです。
Uno(互換)にブートローダーの書き込みを行う
それでは、上の編集をして、正規の Uno(ATmega328P) のツールの設定のまま、USBを抜いた状態で、互換の Uno(ATmega328PB)と ISPをケーブルで接続し、ISP を USB でパソコンに接続します(上図と同じ)。ツール:ボードを Arduino Uno とし、書き込み装置に「Arduino as ISP」を設定し、ブートローダーの書き込みを実行して見ましょう。ツール[ブートローダーを書き込む]をクリックしてください。緑の LED が点滅を繰り返して、書き込みが実行されているのが分かります。
出力に・・・
***failed;
avrdude: WARNING: invalid value for unused bits in fuse "efuse", should be set to 1 according to datasheet
This behaviour is deprecated and will result in an error in future version
You probably want to use 0xf5 instead of 0xfd (double check with your datasheet first).
・・・と表示されますが、「ブートローダーの書き込みが完了しました」とのポップアップのメッセージが出て、書き込みはできたことは分かります。
警告の内容は、ATmega328PB(0x16)を実際には挿しているのに、Uno:ATmega328P(0x0F)のブートローダーを書き込もうとしているので、今回、だましとして 『Unoのシグネチャ末尾は0x16よ』と伝えました。AVRDUDEとしては、Target を読んだ値が 0x16 なので、『 Fuseは違うけどシグネチャは合っているから、ま~良いか』
ということで書き込まれたと思われます。その代わり、色々な警告文が並んでいますが、そういうことですのでこれらは無視して問題ありません。ブートローダーの書き込みができたのでありがたいです。
他にブートローダーの書き込みをするものがあれば、一旦 USBを抜いて基板を取り換え、再接続して続けて行ってください。最後に、待機しているエディタで、0x16
を元の 0x0F に戻して保存すれば完了になります。このターゲットだった Uno(互換) を Lチカなどで動かして見てください。普通に Uno として使えることが分かります。
繰り返し申し上げますが、avrdude.conf ファイルの編集した内容を元にもどして保存するを決して忘れないようにしてください。
Nano(互換)にブートローダーの書き込みを行う
次に、やはり「avrdude.conf」ファイルに対して、上と同じ編集をしたまま、互換の Nano(ATmega328PB)にブートローダーの書き込みを実行しましょう。電源を切って(USBを抜いて)互換の Nano を、ISP基板にある
Target のソケットに挿してください(上図と同じ)。USBを挿します。
ボードを「Arduino Nano」とし、Processor を 「ATmega328P (Old Bootloader)」とします。また、書き込み装置を「Arduino as
ISP」とするのは上と同じです。これで、ブートローダーの書き込みを実行してください。緑のLEDが点滅を繰り返して書き込みが実行されています。こちらの場合は、警告も出ませんでした。「ブートローダーの書き込みが完了しました」とのポップアップのメッセージが出て書き込みが終了しました。これもソケットから抜いて、Lチカなどのスケッチを書き込んで動作確認して見てください。これも普通に Nano として使えることが分かります。
しつこく申し上げますが、avrdude.conf ファイルの編集した内容を元にもどして保存するを決して忘れないようにしてください。
【4】古い初期 Nano(ATmega168PA)へのブートローダーの書き込み
以前、チャイナから「ブートローダー書き込み済み」と銘打った格安の Nano を購入しました。見た目は、確かに Nanoです。しかし、Arduino IDE のメニュー[ツール]で、ボードを[Arduino Nano]とし、Processorを[ATmega328P]
または [ATmega328P (Old Bootloader)] を指定しても、スケッチを書き込めません。Nano ならば、これで普通は動かないわけはないと思うのですが、訳が分かりません。
困ったなと思いながらルーペで CPUの文字を読み取ると、何と MEGA168PA と書いているではありませんか。
WEBで調べると、確かに初期の Nanoには ATmega168シリーズ を使ったものがあったようです。しかし、現在の Arduino IDE
のツールでは、Nano と設定し、Processor を [ATmega168] を設定しても動かせません。
う~ん、何とか今の Nanoと同じような設定で動かすことはできないだろうか考えました。
それで、【 3 】の2のように、avrdude.conf を編集して強制的にブートローダーの書き込みを行うことを試してみました。
まずはじめに、 avrdude.conf の編集無しで、ツール:ボードを Nanoに、Processor:を ATmega168 にしてのブートローダーの書き込みをしてみます。これは・・・
avrdude: Expected signature for ATmega168 is 1E 94 06
Double check chip, or use -F to override this check.
Failed chip erase: uploading error: exit status 1
・・・とシグネチャのミスマッチのためエラーになります。「読んだシグネチャは、期待しているものと違うよ」と。'1E 94 06'、これはATmega168のシグネチャ です(追加のシグネチャ)。
エディタで avedude.conf を開き編集をしますが、エディタの注意点については、上記をご覧ください。
開かれた画面内で 'ATmega168' を検索すると・・・
part
id = "m168";
desc = "ATmega168";
has_debugwire = yes;
flash_instr = 0xB6, 0x01, 0x11;
eeprom_instr = 0xBD, 0xF2, 0xBD, 0xE1, 0xBB, 0xCF, 0xB4, 0x00,
0xBE, 0x01, 0xB6, 0x01, 0xBC, 0x00, 0xBB, 0xBF,
0x99, 0xF9, 0xBB, 0xAF;
stk500_devcode = 0x86;
# avr910_devcode = 0x;
signature = 0x1e 0x94 0x06;
・
以下、省略
・・・と見つかり表示されます。
ターゲットの 旧Nano の ATmega168PA のシグネチャは '0x1E 0x94 0x0B' ですので、avrdude.conf ファイルの
ATmega168 のシグネチャ末尾を、0x06 から 0x0B に変更して保存(内容はだまし)します。後で直ぐに元に戻さないと、Atmega168 をアクセスできなくなるので、エディタは開いたままの方が忘れなくて良いと思います。
「ブートローダーを書き込む」を実行すると緑の LEDが点滅を繰り返して問題なくブートローダーの書き込みが完了しました。次に、ブートローダーの動作テスト、つまり、スケッチの書き込みテストです。
旧 Nano を ISPから取り外してUSBを挿し、Lチカのスケッチをコンパイル・書き込み(→)を実行すると問題なく動作いたしました。これで、やっと Nano として使えることになりました。
ただし、メニューのツールのボードに Nanoを、そして Processorに ATmega168 を指定しなければなりません。また。スケッチをコンパイルした書き込み先の容量は、本来の
Nano(ATmega328P)の半分以下になっていますが、容量を超えなければ、問題なく使えます。最後に必ず、編集した avrdude.conf は、元に戻して保存しなければなりません、これを忘れないようにしてください。
だれでも分かるArduinoのブートローダーの書き込み、ていねいな説明のブートローダーの書き込み
前述した以外の互換CPUについて
同じシリーズ(ATmega328・ATmega168・その他)で Program Memory構成が同一のものは、ブートローダーのメモリ上の位置も同一となるので、前述のように、avrdude.conf を編集することによってこれからも新たな互換CPUが出現しても、同様のやり方で対応していけると思います。
【5】まとめ
正規の Uno, Nano(ATmega328P)よりも、現在の流通は、互換機(ATmega328PB) が主流になっていると思います(価格が安い・品質もGoo・スケッチの書き込みも問題なし)。ただ、シグネチャの一覧表で、 ATmega328PB は、主な使用例として「一部のカスタムボード」となっています。資料が古いのかも知れません。しかし、価格差には抗えません、今、入手できる比較的安価な
Uno, Nano は、ほぼ互換機(上位互換)です。しかし、これまでに記述したように、互換機のブートローダーの書き込みには、特殊なことをしなければなりません。
現在使っている Arduino IDE のバージョンは、2.3.3です。このような状況は、Arduino IDE の開発者の方々は、充分に分かっていると思われますので、将来は、上記のような特殊な事をする必要がなくなるように改良されるかもしれません。それまでは、ここに記述したやり方で互換機のブートローダーの書き込みを実行するしかないと思います。
ブートローダーの書き込みの決定版の解説互換機はavrdude.confを編集する必要がります!
|