ブートローダを使わずにArduinoのスケッチをATmega328Pに書き込む

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
2014年02月19日 公開。
2015年10月11日 ヒューズビットを書き込む手順を追加。

目次

1. はじめに … 1ページ
2. ICSPとは … 1ページ
3. ArduinoISPについて … 1ページ
4. ブートローダライタシールドについて … 1ページ
5. ブートローダライタシールドを使ってスケッチを書き込む … 1ページ
6. ブートローダ/スケッチライタを使ってスケッチを書き込む … 1ページ

1.はじめに

Arduinoのブートローダって何?の記事で説明したとおり、Arduinoは、ブートローダを使うことで、高価なICSP書き込み用のライタを使うことなく、安価なUSBシリアル変換器でスケッチを書き込めるように工夫してあります。これは初心者が扱い易いように、Arduino本体にスケッチ書き込み回路を内蔵しているため、なるべく安価なスケッチ書き込み回路を使う必要があったからです。

一方で、Arduinoを使って何かを試作した後、それを量産しようと思ったら、量産機に組み込むArduino互換機には、必ずしもスケッチ書き込み用の回路を内蔵する必要はありません。量産機では、組み立て後にスケッチを書き換える事はないので、あらじめマイコンにICSP対応のライタ(プログラムを書き込む装置)でスケッチを書き込んでおき、それを量産機の基板に実装すれば事が足ります。ICSPライタが1台必要になるデメリットはあるものの、量産機からスケッチ書き込み回路を取り除けるので、価格、実装面積、消費電力などの面で多くのメリットがあります。

図1、試作機と量産機機の違い
図1、試作機と量産機機の違い
広告

この記事では、ArduinoISPを使ったICSPライタを用いて、ブートローダを使わずにArduinoのスケッチをマイコン(ATmega328P)に書き込む方法を説明します。

2.ICSPとは

ICSPとは、In-Circuit Serial Programmingの略で、基板に実装済みのマイコンに、シリアル信号線(つまり、本数の少ない信号線)でライタをつなぎ、プログラムを書き込むことを指します。ISP(In System Programming)と呼ばれることもあります。

詳細な説明は省略しますが、AVRマイコンの場合、次の図の様な2X3ピンの2.54mmピッチのヘッダ(ICSP端子)をターゲット基板(プログラムを書き込みたいマイコンが載った基板)に設けることになっています。ICSP端子にICSPライタからの6本の線を接続することで、プログラムが書き込めます。

図2、AVRマイコンのICSP端子
図2、AVRマイコンのICSP端子

昔のマイコンは、プログラムの書き込みに必要な信号線が多かったり、あるいはプログラム書き込み時に高い電圧を扱ったりしたために、マイコンをICソケットから抜き、プログラムライタのICソケットに挿入してプログラムを書き込んでいました。それが、今では電源を含めてもたった6本の線でプログラムの書き込みができ、また、普段の動作電圧と同じ電圧でプログラムが書き込めるようになったので、プログラムの書き換え時にいちいちマイコンをソケットから抜く必要がなくなった訳です。

3.ArduinoISPについて

Atmel(AVRマイコンのメーカー)純正のICSPライタとして安価に入手できるものに、AVRISPmkIIがあります。これなら、秋月電子通商で3千円ちょっとで買えるのですが、これを買うのもお金がもったいないと思うなら、ArduinoISPを使う方法があります。これは、Arduinoにスケッチを書き込むことで、ICSPライタとして使おうというものです。(ここでは詳しく説明しませんが、AVRISPmkIIには、Arduino IDE上から使うために若干の工夫が必要であるという問題もあります)

ArduinoISPのスケッチは、Arduino IDE 1.0.1~1.0.5なら、Arduino IDEに付属してきます。下の図に示すように、ファイル→スケッチの例→ArduinoISPメニューを選ぶと、ArduinoISPスケッチが開きます。

図3、ArduinoISPのスケッチを開く
図3、ArduinoISPのスケッチを開く

このスケッチを、ATmega168やATmega328Pをマイコンとして採用した16MHzクロックのArduino(Arduino Unoなど)に書き込むと、ArduinoがICSPライタになります。この際、RESET端子がArduinoのD10端子、MOSI端子がArduinoのD11端子、MISO端子がArduinoのD12端子、SCK端子がArduinoのD13端子になります。電源とD10~D13端子をターゲット基板のICSP端子につなげば、ターゲット基板上のマイコンにブートローダやスケッチを書きこむことができるようになります。

4.ブートローダライタシールドについて

このArduinoISPを使って、ATmega328PにArduino Unoのブートローダを書き込む方法は、Arduino Uno用ブートローダライタシールドの製作の記事で説明しました。この記事で製作したブートローダライタシールドは、簡単に言うとZIFソケット(ゼロプレッシャーソケットともいい、DIP ICのリードを傷めることなく抜き差しできるICソケット)を電源とD10~D13端子に接続したものです。ZIFソケットにATmega328Pを挿入すると、ブートローダが書き込めます。

写真1、ブートローダライターシールド
写真1、ブートローダライターシールド

なお、Arduino Uno用ブートローダライタシールドには、キットがあります。

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1440円
販売店 スイッチサイエンス
サポートページ

ICSP本来の考え方は、ターゲット基板にICSP端子を設けることで、マイコンの抜き差しなしにプログラムを書き込むことができるというものですから、ZIFソケットにICSPの信号線をつなぐというのは、本末転倒な考え方です。しかし、実際にはICSP端子を使うより、ZIFソケットを使って書き込むほうが便利な場面も多いものです。

例えば、小型化を要求される装置では、プログラム書き込み時にしか使わないICSP端子を付けたくありません。また、ブレッドボードでプロトタイピングする場合は、ICSP端子用のヘッダをブレッドボードに挿せないという問題が生じます。(ブレッドボードは同じ列の端子はショートしてしまうため、2X6ピンのヘッダを使えない)

5.ブートローダライタシールドを使ってスケッチを書き込む

ブートローダライタシールドは、本質的に(ArduinoISPのスケッチを書き込んだ)ArduinoをZIFソケットにつないだだけのものですから、汎用のICSPライタであり、ブートローダ専用のライタではありません。ここでは、ブートローダライタシールドを使ってスケッチを書き込む方法を説明します。(ブートローダライタシールドの代わりにブレッドボードで済ます方法もありますが、その時の結線についてはArduino Uno用ブートローダライタシールドの製作(1)の記事をご覧ください)

Arduino Uno、ブートローダライタシールド、ATmega328P(新品でも、過去にブートローダやスケッチを書きこんだものでも良い)、Arduino IDE(1.0.1~1.0.5)をインストールしたWindowsパソコンを用意して、以下の手順でスケッチを書き込んでください。

【手順1】 ブートローダライタシールドをArduino Unoに装着し、SW1をAUTO RESET側に設定する
写真2、SW1をAUTO RESET側に切り替える
↑ 画像をクリックすると拡大
写真2、SW1をAUTO RESET側に切り替える
【手順2】 Arduino UnoとパソコンをUSBケーブルで接続する。
【手順3】 Arduino IDEを起動し、ファイル→スケッチの例メニューからArduioISPのファームウェア(スケッチ)を開く
図3(再掲)、ArduinoISPのスケッチを開く
図3(再掲)、ArduinoISPのスケッチを開く
【手順4】 ツール→マイコンボードメニューでArduino Unoを選択する
図4、Arduino Unoを選択する
図4、Arduino Unoを選択する
【手順5】 ツール→シリアルポートメニューでArduino Unoのポート番号(COM番号)を指定する
図5、シリアルポートを選択する
図5、シリアルポートを選択する

注:上の図ではCOM15を選んでいますが、皆さんの環境に合わせて、COM番号を選んでください

【手順6】 Arduino UnoにArduinoISPのスケッチを書き込む
図6、ArduinoISPのスケッチの書き込み
図6、ArduinoISPのスケッチの書き込み

ArduinoISPのスケッチが正常に書き込めると、HeartbeatのLEDが明るくなったり暗くなったりを繰り返します。

写真3、Heartbeat LEDの点滅
写真3、Heartbeat LEDの点滅

この時点で、ArduinoがICSPライタとして機能し始めています。

【手順7】 ブートローダライタシールドのSW1をKILL RESET側に切り替える
【手順8】 ツール→書き込み装置メニューでArduino as ISPを選ぶ
図7、Arduino as ISPの選択
図7、Arduino as ISPの選択
【手順9】 Arduino IDE上で、ATmega328Pに書き込みたいスケッチを開く

下の図では例としてArduino IDEに標準で付いているBlink(D13に接続されているLEDを点滅させるスケッチ)を読み込んでいますが、実際には皆さんがマイコンに書き込みたいスケッチのファイルを開いてください。

図8、Blinkスケッチを開く
図8、Blinkスケッチを開く
図9、開いたBlinkスケッチ
図9、開いたBlinkスケッチ
【手順10】 ZIFソケットにATmega328Pを装着する

下の写真のように、ATmega328PをZIFソケットに挿入してから、レバーを倒して固定します。

写真4、ZIFソケットにATmega328Pを挿入
↑ 画像をクリックすると拡大
写真4、ZIFソケットにATmega328Pを挿入
写真5、レバーを倒してATmega328Pを固定
↑ 画像をクリックすると拡大
写真5、レバーを倒してATmega328Pを固定
【手順11】ATmega328Pにフューズビットを書き込む

スケッチを書き込むに先立って、ヒューズビット(マイコンの動作モードを設定する情報)をATmega328Pに書き込んでおく必要があります。ツール→ブートローダを書き込むメニューを選択して、ヒューズビットを書き込んでください。

図10、ATmega328Pにヒューズビットを書き込む
図10、ATmega328Pにヒューズビットを書き込む

注1:この時、ヒューズビットと同時に、ブートローダも書き込まれますが、手順12でスケッチを書き込むのに、ブートローダは使いません。またスケッチを書き込む際に、ブートローダは消去されてしまいます。

注2:以前にヒューズビットを書き込んだ事のあるATmegae328Pの場合は、この手順をスキップする事ができます。

【手順12】ATmega328Pにスケッチを書き込む

ファイル→書き込み装置を使って書き込むメニューを選ぶと、ATmega328Pにスケッチを書き込み始めます。

図11、スケッチの書き込み
図11、スケッチの書き込み

スケッチの書き込み中は、ProgrammingのLEDが点灯します。

写真6、Programming LEDの点灯
写真6、Programming LEDの点灯

しばらくすると、スケッチの書き込みが終わります。

図12、スケッチ書き込み終了時のメッセージ
図12、スケッチ書き込み終了時のメッセージ

スケッチの書き込みが終わったら、ProgrammingのLEDは消えます。

写真7、Programming LEDの消灯
写真7、Programming LEDの消灯

もし、スケッチの書き込みに失敗すると、Errorのランプが点灯して書き込みが中断します。(エラーの種類によってはErrorのランプが点灯しない事もあります) その場合は、正しい手順で書き込んでいるか再確認の上、もう一度スケッチを書き込んでください。

写真8、Error LEDの点灯
写真8、Error LEDの点灯

注:ブートローダを書き込んであったATmega328Pに、このページの方法でスケッチを書き込むと、ブートローダは消去されます。ブートローダを消さずに(ブートローダを利用して)スケッチを書き込むには、ブートローダ/スケッチライタが必要になります。詳しい話は、Arduino用ブートローダ/スケッチライタの製作(6)の記事をご覧ください。

【手順13】 ATmega328P-をZIFソケットから外す

以上の方法で、ATmega328PにArduinoのスケッチを書き込めます。複数のATmega328Pに同じスケッチを書き込む場合は、手順10~13を繰り返してください。

手順9の次に、ツール→マイコンボードメニューでArduino Uno以外のマイコンボードを選ぶと、Arduino Uno以外の互換機も作れます。ただし、使うマイコンの種類(ATmega168かATmega328P)やクロック周波数(8MHzか16MHz)に注意する必要があります。詳しい話は、Arduino用ブートローダ/スケッチライタの製作(5)Arduino用ブートローダ/スケッチライタの製作(6)の記事に載っていますので、そちらを参照してください。

スケッチを書き込んだATmega328Pの動作テストの方法については、こちらに詳しく載っています。

6.ブートローダ/スケッチライタを使ってスケッチを書き込む

ブートローダライタシールドはArduino Unoと組み合わせて使うシールドでしたが、安価にATmaga328Pにブートローダが書き込める環境を得られる半面、ブートローダの書き込み前にArduino UnoにArduinoISPのファームウェアを書き込まなければならないため、Arduino Unoを他のプロジェクトと共用する場合は、面倒な面がありました。そのため、ArduinoISPのファームウェアを書き込んだArduino互換機と、ブートローダライタシールドの機能を一体化して、1つの基板にしたのがブートローダ/スケッチライタです。また、ブートローダ/スケッチライタでは、ATtiny44/84/45/85といった、ピン数の少ないAVRマイコンにスケッチを書き込む機能などが拡張されています。

写真9、Arduino用ブートローダ/スケッチライタ
写真9、Arduino用ブートローダ/スケッチライタ
Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ

このブートローダ/スケッチライタでも、ブートローダを使わずに、スケッチをATmega328Pに書き込むことができます。詳しい話はArduino用ブートローダ/スケッチライタの製作(7)の記事に載っていますので、そちらを参照してください。

このページで使われている用語の解説

関連ページ

関連製品

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1440円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ
Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。