2014年02月19日 | 公開。 |
2015年10月11日 | ヒューズビットを書き込む手順を追加。 |
Arduinoのブートローダって何?の記事で説明したとおり、Arduinoは、ブートローダを使うことで、高価なICSP書き込み用のライタを使うことなく、安価なUSBシリアル変換器でスケッチを書き込めるように工夫してあります。これは初心者が扱い易いように、Arduino本体にスケッチ書き込み回路を内蔵しているため、なるべく安価なスケッチ書き込み回路を使う必要があったからです。
一方で、Arduinoを使って何かを試作した後、それを量産しようと思ったら、量産機に組み込むArduino互換機には、必ずしもスケッチ書き込み用の回路を内蔵する必要はありません。量産機では、組み立て後にスケッチを書き換える事はないので、あらじめマイコンにICSP対応のライタ(プログラムを書き込む装置)でスケッチを書き込んでおき、それを量産機の基板に実装すれば事が足ります。ICSPライタが1台必要になるデメリットはあるものの、量産機からスケッチ書き込み回路を取り除けるので、価格、実装面積、消費電力などの面で多くのメリットがあります。
この記事では、ArduinoISPを使ったICSPライタを用いて、ブートローダを使わずにArduinoのスケッチをマイコン(ATmega328P)に書き込む方法を説明します。
ICSPとは、In-Circuit Serial Programmingの略で、基板に実装済みのマイコンに、シリアル信号線(つまり、本数の少ない信号線)でライタをつなぎ、プログラムを書き込むことを指します。ISP(In System Programming)と呼ばれることもあります。
詳細な説明は省略しますが、AVRマイコンの場合、次の図の様な2X3ピンの2.54mmピッチのヘッダ(ICSP端子)をターゲット基板(プログラムを書き込みたいマイコンが載った基板)に設けることになっています。ICSP端子にICSPライタからの6本の線を接続することで、プログラムが書き込めます。
昔のマイコンは、プログラムの書き込みに必要な信号線が多かったり、あるいはプログラム書き込み時に高い電圧を扱ったりしたために、マイコンをICソケットから抜き、プログラムライタのICソケットに挿入してプログラムを書き込んでいました。それが、今では電源を含めてもたった6本の線でプログラムの書き込みができ、また、普段の動作電圧と同じ電圧でプログラムが書き込めるようになったので、プログラムの書き換え時にいちいちマイコンをソケットから抜く必要がなくなった訳です。
Atmel(AVRマイコンのメーカー)純正のICSPライタとして安価に入手できるものに、AVRISPmkIIがあります。これなら、秋月電子通商で3千円ちょっとで買えるのですが、これを買うのもお金がもったいないと思うなら、ArduinoISPを使う方法があります。これは、Arduinoにスケッチを書き込むことで、ICSPライタとして使おうというものです。(ここでは詳しく説明しませんが、AVRISPmkIIには、Arduino IDE上から使うために若干の工夫が必要であるという問題もあります)
ArduinoISPのスケッチは、Arduino IDE 1.0.1~1.0.5なら、Arduino IDEに付属してきます。下の図に示すように、ファイル→スケッチの例→ArduinoISPメニューを選ぶと、ArduinoISPスケッチが開きます。
このスケッチを、ATmega168やATmega328Pをマイコンとして採用した16MHzクロックのArduino(Arduino Unoなど)に書き込むと、ArduinoがICSPライタになります。この際、RESET端子がArduinoのD10端子、MOSI端子がArduinoのD11端子、MISO端子がArduinoのD12端子、SCK端子がArduinoのD13端子になります。電源とD10~D13端子をターゲット基板のICSP端子につなげば、ターゲット基板上のマイコンにブートローダやスケッチを書きこむことができるようになります。
このArduinoISPを使って、ATmega328PにArduino Unoのブートローダを書き込む方法は、Arduino Uno用ブートローダライタシールドの製作の記事で説明しました。この記事で製作したブートローダライタシールドは、簡単に言うとZIFソケット(ゼロプレッシャーソケットともいい、DIP ICのリードを傷めることなく抜き差しできるICソケット)を電源とD10~D13端子に接続したものです。ZIFソケットにATmega328Pを挿入すると、ブートローダが書き込めます。
なお、Arduino Uno用ブートローダライタシールドには、キットがあります。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
ICSP本来の考え方は、ターゲット基板にICSP端子を設けることで、マイコンの抜き差しなしにプログラムを書き込むことができるというものですから、ZIFソケットにICSPの信号線をつなぐというのは、本末転倒な考え方です。しかし、実際にはICSP端子を使うより、ZIFソケットを使って書き込むほうが便利な場面も多いものです。
例えば、小型化を要求される装置では、プログラム書き込み時にしか使わないICSP端子を付けたくありません。また、ブレッドボードでプロトタイピングする場合は、ICSP端子用のヘッダをブレッドボードに挿せないという問題が生じます。(ブレッドボードは同じ列の端子はショートしてしまうため、2X6ピンのヘッダを使えない)
ブートローダライタシールドは、本質的に(ArduinoISPのスケッチを書き込んだ)ArduinoをZIFソケットにつないだだけのものですから、汎用のICSPライタであり、ブートローダ専用のライタではありません。ここでは、ブートローダライタシールドを使ってスケッチを書き込む方法を説明します。(ブートローダライタシールドの代わりにブレッドボードで済ます方法もありますが、その時の結線についてはArduino Uno用ブートローダライタシールドの製作(1)の記事をご覧ください)
Arduino Uno、ブートローダライタシールド、ATmega328P(新品でも、過去にブートローダやスケッチを書きこんだものでも良い)、Arduino IDE(1.0.1~1.0.5)をインストールしたWindowsパソコンを用意して、以下の手順でスケッチを書き込んでください。
注:上の図ではCOM15を選んでいますが、皆さんの環境に合わせて、COM番号を選んでください。
ArduinoISPのスケッチが正常に書き込めると、HeartbeatのLEDが明るくなったり暗くなったりを繰り返します。
この時点で、ArduinoがICSPライタとして機能し始めています。
下の図では例としてArduino IDEに標準で付いているBlink(D13に接続されているLEDを点滅させるスケッチ)を読み込んでいますが、実際には皆さんがマイコンに書き込みたいスケッチのファイルを開いてください。
下の写真のように、ATmega328PをZIFソケットに挿入してから、レバーを倒して固定します。
スケッチを書き込むに先立って、ヒューズビット(マイコンの動作モードを設定する情報)をATmega328Pに書き込んでおく必要があります。ツール→ブートローダを書き込むメニューを選択して、ヒューズビットを書き込んでください。
注1:この時、ヒューズビットと同時に、ブートローダも書き込まれますが、手順12でスケッチを書き込むのに、ブートローダは使いません。またスケッチを書き込む際に、ブートローダは消去されてしまいます。
注2:以前にヒューズビットを書き込んだ事のあるATmegae328Pの場合は、この手順をスキップする事ができます。
ファイル→書き込み装置を使って書き込むメニューを選ぶと、ATmega328Pにスケッチを書き込み始めます。
スケッチの書き込み中は、ProgrammingのLEDが点灯します。
しばらくすると、スケッチの書き込みが終わります。
スケッチの書き込みが終わったら、ProgrammingのLEDは消えます。
もし、スケッチの書き込みに失敗すると、Errorのランプが点灯して書き込みが中断します。(エラーの種類によってはErrorのランプが点灯しない事もあります) その場合は、正しい手順で書き込んでいるか再確認の上、もう一度スケッチを書き込んでください。
注:ブートローダを書き込んであったATmega328Pに、このページの方法でスケッチを書き込むと、ブートローダは消去されます。ブートローダを消さずに(ブートローダを利用して)スケッチを書き込むには、ブートローダ/スケッチライタが必要になります。詳しい話は、Arduino用ブートローダ/スケッチライタの製作(6)の記事をご覧ください。
以上の方法で、ATmega328PにArduinoのスケッチを書き込めます。複数のATmega328Pに同じスケッチを書き込む場合は、手順10~13を繰り返してください。
手順9の次に、ツール→マイコンボードメニューでArduino Uno以外のマイコンボードを選ぶと、Arduino Uno以外の互換機も作れます。ただし、使うマイコンの種類(ATmega168かATmega328P)やクロック周波数(8MHzか16MHz)に注意する必要があります。詳しい話は、Arduino用ブートローダ/スケッチライタの製作(5)とArduino用ブートローダ/スケッチライタの製作(6)の記事に載っていますので、そちらを参照してください。
スケッチを書き込んだATmega328Pの動作テストの方法については、こちらに詳しく載っています。
ブートローダライタシールドはArduino Unoと組み合わせて使うシールドでしたが、安価にATmaga328Pにブートローダが書き込める環境を得られる半面、ブートローダの書き込み前にArduino UnoにArduinoISPのファームウェアを書き込まなければならないため、Arduino Unoを他のプロジェクトと共用する場合は、面倒な面がありました。そのため、ArduinoISPのファームウェアを書き込んだArduino互換機と、ブートローダライタシールドの機能を一体化して、1つの基板にしたのがブートローダ/スケッチライタです。また、ブートローダ/スケッチライタでは、ATtiny44/84/45/85といった、ピン数の少ないAVRマイコンにスケッチを書き込む機能などが拡張されています。
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |
このブートローダ/スケッチライタでも、ブートローダを使わずに、スケッチをATmega328Pに書き込むことができます。詳しい話はArduino用ブートローダ/スケッチライタの製作(7)の記事に載っていますので、そちらを参照してください。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |