[Arduino復旧術] サラのATmega328Pにブートローダーでプログラムを書き込む


2021/02/26

そこで少し今更感のあるネタになりますが、新品未使用のATmega328Pマイコンを買って最初にやるべきことにブートローダーを準備することが挙げられます。

またArduinoも一枚あたりの単価はそれほど安価ではないので、誤ってマイコンをショートさせて焼いたときの復旧方法としてブートローダーの書き込み方は覚えておきたいものです。

ウェブ検索で
Arduino ブートローダー 書き込みなどで検索してもかなりの方が詳しく解説しているので、新規性のある内容では無いのですが、次のステップで行う話にも絡むため、一度このブログでも手順を取り上げておきます。


ブートローダー?

そもそもArduinoのブートローダーというのは、Arduino IDEのスケッチプログラムからターゲットのマイコンにプログラムを書き込んでくれるArduino開発では必須のユーティリティツールです。

デフォルトのArduino製品には既にブートローダーがプリインストールしてあるために、パソコンにUSBを繋ぐだけでシリアル通信からプログラムが書き込みできるのも、全てはブートローダーのおかげというわけです。

そして、新品未使用のディスクリートなマイコンを購入して使う場合には、当然ブートローダーは入っていないのですので、そのままUSB-シリアル変換でパソコンに繋いだとしても、Arduino IDEからプログラムを書き込みすることができません。

ではこのブートローダーをどうやって初期状態のマイコンに書き込むのか、というお話を以下で進めていきます。

なお、
公式リファレンス: From Arduino to a Microcontroller on a Breadboard - Arduinoに載っている内容でおおよその流れが進みます。


ブートローダー書き込み専用機の準備

今回の話ではATmega328Pに限ったブートローダー書き込み手順を説明しますが、市場に出回っているArduinoに搭載されてるマイコンも色々と種類が異なりますので、本記事でArduinoというともっともベーシックなArduino Uno Rev3ということにさせて頂いております。

Uno以外でもブートローダーの書き込みが行いたい方は
こちらのサイトに色々なArduinoモデルの書き込み装置用設定のバリエーションが記載されているのでご参照ください。

さて、まっさらなマイコンにブートローダーを初期書き込みするためには、ブートローダー専用の書込用デバイスを準備することになります。

これは市販されて製品化されている物もありますが、Arduino1台あればこの書込用デバイスは自作することが可能なのです😍。

ということで、ひとまず手持ちのArduino1台をブートローダー書き込み専用機として利用してみたいと思います。

'Arduino ISP'を書き込む

ブートローダー書き込み専用機を作るためには、Arduino ISPというプログラムをArduinoに書き込む必要があります。

パソコンとArduinoを接続し、Arduino IDEを起動します。以下の図のように
[スケッチ例] > [Arduino ISP]を開くと、Arduino ISPのスケッチが表示されるのでArduino側に書き込みます。

合同会社タコスキングダム|蛸壺の中の工作室

これでブートローダー書き込み専用機になりましたので、一旦パソコンとの接続を切っておきます。


サラのATmega328Pをブートローダーで初期化

ここから主題のお話です。

外部の水晶振動子を使って書き込む方式でやってみますので、最低限以下の部品が必要になるようです。

            + 16MHz水晶振動子...1石
+ 10kΩ抵抗...1石
+ 18~22pFセラミック積層コンデンサ...2石
        

ブートローダー書き込み用に配線

まずブートローダー - ATmega328Pを正しく接続する必要があります。

ここでは以下のように
公式のチュートリアルで説明されているように結線してみます。

合同会社タコスキングダム|蛸壺の中の工作室

なお公式のチュートリアル内では触れられていなかったようですが、書き込みに失敗することもあるらしいので念の為に
自動リセット回路の無効化をするために、RESET-GND間に10~22[μF]のコンデンサを入れておくとより安心のようです。

合同会社タコスキングダム|蛸壺の中の工作室

ちなみに16MHzの振動素子は手元に
コンデンサー内蔵タイプが残っていたのでこちらを使いました。この場合22pFの積層コンデンサが不要になります。

念押しで
ATmega328Pのピン配置図を載せておきますが、配線が間違っていないか書き込みを行う前にしっかり確認してください。

合同会社タコスキングダム|蛸壺の中の工作室

余談 ~ ICSP

Arduinoシリーズには、ボードのに6ピンのオスヘッダの島があるものがあります。

これは
ICSP(In-Circuit Serial Programming)と呼ばれるもので、マイコンなどプログラム可能なデバイスを基板に実装した状態で、プログラムを書き込むことを意味しています。

より一般には
ISP(In-System Programming)とも呼ばれ、Arduino ISPというプログラムはArduino IDEからマイコンにプログラムを描き込ませるための役割を持っています。

AVRマイコンのICSPヘッダアサインメントは以下のように取り決められるのが通例です。

合同会社タコスキングダム|蛸壺の中の工作室

図中の5ピンのRESET端子だけは取扱注意で、Lowレベルの際にICSPモードがアクティブになります。Highの場合にICSPモードをアクティブにしたい場合にはこことは別のポートを使うことになります。

よってArduino Uno R3では、以下の2つのパターンで配線をした場合はICSPとしては等価になります。

合同会社タコスキングダム|蛸壺の中の工作室

図の参照先:
https://ht-deko.com/arduino/bootloader.html

今回は正攻法の公式チュートリアルでの接続方法を試しましたが、ICSPヘッダをボード上に持っているモデルの場合ICSPを使った方がピンの指し間違いが少なくなるので、ICSPヘッダがあるのならこちらを積極的に使うことを推奨します。

なお、今回の書き込み装置からターゲットのマイコンへの供給電圧は5Vです。

場合によっては書込装置側が5Vだけれど、ターゲット側マイコンの公称電圧が3.3Vだった、どうしよう...というケースもあるかもしれませんが、この時に何も考えずに書き込んでしまうと、マイコンの内部トレラント電流以上が流れてこんがり焼けて壊れる恐れがあり危険です。

ブートローダーを書き込む前には必ず書き込み装置とターゲット電圧が合っているかを確認してください。

ATmega328Pにブートローダーを書き込む

上記まででブートローダー書き込み装置側(Arduino)とブレッドボード側(ATmega328P)の接続の準備が整いましたので、いよいよブートローダーの書き込みです。

ここでArduinoとPCをUSB接続します。なお書き込みターゲットのATmega328PにもArduino側から5V電源が供給されます。

まずは
[ツール] > [ボード]で、ターゲットマイコンへ焼き込みたいボードタイプを指定します。ここではUnoの複製を行いたいので、Unoを指定します。

合同会社タコスキングダム|蛸壺の中の工作室

次に
[ツール] > [シリアルポート]で書込装置のシリアルポートを指定します。

合同会社タコスキングダム|蛸壺の中の工作室

[ツール] > [書込装置]のタイプをArduino as ISPに指定します。

合同会社タコスキングダム|蛸壺の中の工作室

見ての通りで市販の書き込み装置の種類が色々とあるようですので、適切な項目を選択できるようになっています。

最後に
[ブートローダーを書き込む]でブートローダーを書き込みます。

合同会社タコスキングダム|蛸壺の中の工作室

書き込みが終わったら、Arduino側のUSBを抜いて、電源供給を止めて一丁上がりです。

では本題だったなんだか壊れたっぽい挙動のArduinoUnoからマイコンを剥ぎ取ります。

合同会社タコスキングダム|蛸壺の中の工作室

なんだか固着して固く動かないときがありますが、ピンセットを使ってマイコンの底を押し上げる感じで慎重にソケットから引き抜きます。

合同会社タコスキングダム|蛸壺の中の工作室

ブートローダーを書き込んだマイコンを向きに注意してソケットに入れ替えます。

あとは、ArduinoIDEの
[スケッチ例] > [1. Basic] > [Blink]のスケッチを書き込めるかやってみてビルドインLEDがチカチカしていたら完了です。


まとめ

今回はArduinoIDEを用いたスタンダードなやり方でサラのATmega328P(-PU)にブートローダーを書き込むまでの手順をおさらいしました。


参考サイト

ブートローダーを書き込む方法

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。