ATmega88/88V/168P/328PにArduinoのブートローダを書き込む(1)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (1) (2) (3) (4) (5) 次のページへ
2015年09月29日 公開。
2015年10月05日 章の構成を一部変更。
2015年10月15日 「ATmega88VにArduinoのブートローダを書き込む」から「ATmega88/88V/168PにArduinoのブートローダを書き込む」に改題。
ATmega168Pにブートローダを書き込む方法を追加。
Arduino IDE 1.6.XおよびArduino IDE 1.7.Xに対応。
2016年05月13日 秋月電子がATmega88の取り扱いをやめた事を追記。
2016年10月28日 「ATmega88/88V/168PにArduinoのブートローダを書き込む」から「ATmega88/88V/168P/328PにArduinoのブートローダを書き込む」に改題。
ATmega328Pのサポートファイルを追加し、ATmega328PでもATmega88/88V/168Pと同じ操作法でブートローダを書き込めるようにした。
2017年02月14日 表1の間違いを訂正。

目次

1. はじめに … 1ページ
2. ATmega88/88V/168PとATmega328Pの比較 … 1ページ
3. Optibootとは … 1ページ
3-1. 容量について … 1ページ
3-2. 書き込み速度について … 1ページ
3-3. ライセンス形式について … 1ページ
4. Arduino IDEでATmega88/88V/168P/328Pのスケッチを開発するために必要な手順 … 1ページ
5. Arduino IDEにATmega88/88V/168P/328P用のブートローダを登録する方法 … 1ページ
6. ATmega88/88V/168P/328Pにブートローダを書き込む方法 … 2ページ
6-1. ブートローダの書込み方の一般的な説明 … 2ページ
6-2. Arduino Uno用ブートローダライタシールドを使ったブートローダの書き込み方 … 2ページ
6-3. Arduino用ブートローダ/スケッチライタを使ったブートローダの書き込み方 … 2ページ
7. ブートローダ書き込み済みのATmega88/88V/168P/328Pにスケッチを書き込む方法 … 3ページ
7-1. Arduino用ブートローダ/スケッチライタでスケッチを書き込む方法 … 3ページ
7-2. ブートローダ書き込み済みのATmega88/88V/168P/328Pを組み込んだArduino互換基板にスケッチを書き込む方法 … 4ページ
7-2-1. スケッチの書き込みに必要になる機器(USBシリアル変換器) … 4ページ
7-2-2. USBシリアル変換器でスケッチが書き換えられるArduino互換基板の回路構成 … 4ページ
7-2-3. Arduino互換基板にスケッチを書き込む方法 … 4ページ
7-2-4. スケッチを書き込んだArduino互換基板を外部電源で使う方法 … 4ページ
8. ブートローダをコンパイルする方法 … 5ページ
8-1. サポートファイルに含まれているブートローダの種類 … 5ページ
8-2. Optibootのソースファイルの場所 … 5ページ
8-3. Arduino IDE 1.0.1のダウンロード … 5ページ
8-4. Makefileとのダウンロード … 5ページ
8-5. ブートローダのコンパイル法 … 5ページ

1.はじめに

AVRマイコンにArduinoのブートローダを書き込んでArduino IDEでソフト開発をする場合、Arduino Unoに使われているATmega328Pを使う場合が多いと思います。ATmega328Pはフラッシュメモリが32kBもあり、比較的大きなスケッチを書き込めるのが利点ですが、実際には、数kBのフラッシュメモリしか使わないスケッチの開発をする事も結構あります。そういう時にはATmega328Pは少しオーバースペックになります。

秋月電子でATmega328PのDIP品(ATmega328P-PU)を買うと、2015年10月現在で250円します。一方で、同じ秋月電子でATmega328Pと同系列のAVRマイコンを探すと、ATmega88のDIP品(ATmega88-20PU)が170円、ATmega88VのDIP品(ATmega88V-10PU)が150円、ATmega168PのDIV品(ATmega168P-20PU)が200円で販売されています。これらのマイコン(以降、まとめてATmega88/88V/168Pと呼ぶ)は、メモリが少ない点と、最高クロック周波数が低い(ATmega88Vのみ)点を除けば、ATmega328Pと同じ機能を持ったマイコンですから、メモリと速度に対する要求が低いプロジェクトには、ATmega328Pと同じ感覚で使えます。

2016年05月13日追記:現在、秋月電子ではATmega88の取り扱いを行っていない様です。

そこで、ATmega88/88V/168PにArduinoのブートローダ(Optiboot)を書き込む方法を紹介します。これらのマイコンにOptibootを書き込むと、Arduino IDEでスケッチを開発できる様になります。

また、ATmega328Pにブートローダを書き込む方法も同時に紹介します。

2.ATmega88/88V/168PとATmega328Pの比較

ブートローダの書き込み方の説明に入る前に、今回話題にしているATmega88/88V/168Pと、Arduino Unoに使われているATmega328Pの違いについて説明します。

簡単にいうと、ATmega88/88V/168PとATmega328Pは、クロック周波数、メモリの容量、電源電圧が違います。相違点を表1にまとめます。

表1、ATmega88/88V/168PとATmega328Pの相違点
マイコン ATmega88 ATmega88V ATmega168P ATmega328P
フラッシュメモリの容量 8kB 8kB 16kB 32kB
EEPROMの容量 512B 512B 512B 1KB
RAMの容量 1kB 1kB 1kB 2KB
電源電圧 2.7~5.5V 1.8~5.5V 2.7~5.5V 1.8~5.5V
最大クロック周波数 10MHz(2.7~4.5V)
20MHz(4.5~5.5V)
4MHz(1.8~2.7V)
10MHz(2.7~5.5V)
10MHz(2.7~4.5V)
20MHz(4.5~5.5V)
4MHz(1.8~2.7V)
10MHz(2.7~4.5V)
20MHz(4.5~5.5V)
秋月電子での価格
(2015年10月時点)
170円 150円 200円 250円

表1以外にも、消費電流が多少違ったり、細かな差異はあるのですが、説明は割愛します。

表1を見れば分かるように、一番違うのはメモリ容量です。ATmega88VとATmega88は、ATmega328Pはと比べて、フラッシュメモリの容量が4分の1、EEPROMとRAMの容量がそれぞれ2分の1倍になっています。またATmega168Pは、ATmega328Pはと比べて、フラッシュメモリ、EEPROMおよびRAMの容量が2分の1になっています。

また、クロック周波数の上限は、電源電圧によって変わるのですが、5Vの場合、ATmega328Pが20MHzまでなのに対して、ATmega88Vは10MHzまでです。電源電圧が3.3Vの場合は、両者は同じ10MHzまでです。ATmega88とATmega168Pに関しては、クロック周波数の上限はATmega328Pと同じです。

逆に言えば、表1に書いた事以外は、ATmega88/88V/168PとATmega328Pとは同じマイコンだといえます。例えば、UARTインターフェース、SPIインターフェース、TWI(I2C)インターフェース、タイマなどの周辺回路は、全て同じ仕様の物が、同じ数だけ内蔵されており、また、ピン配置も同じです。しかし、メモリ容量が違うことでスケッチやデータのメモリ配置が変わってきたり、何よりデバイスID(間違ったマイコンにプログラムを書き込んでしまうのを防ぐための、マイコンの型番ごとに付けられる識別番号)が違ったりするので、同じCPUを積んでいるマイコンでありながらも、ATmega328Pのプログラム(スケッチ)をそのままATmega88/88V/168Pに書き込んだり、その逆はできません。

しかしながら、ATmega88/88V/168P用のブートローダ(および設定ファイル)をArduino IDEに組み込めば、メモリ容量およびクロック周波数が違うこと以外は全く同じマイコンとして、Arduino IDE上でスケッチの開発ができるようになります。

3.Optibootとは

Optibootは、Arduino Unoに使われているブートローダの事です。以下、Optibootについて説明します。

3-1.容量について

Unoが出る前のArduino(DuemilanoveとかDiecimilaとかProなど)では、2kBのサイズのブートローダを使っていました。そのため、フラッシュメモリが32kBあっても、スケッチの書き込みに使えるのは30kBになってしまいました。

Arduino Unoに採用されたOptibootは、スケッチを書き込むのに最低限必要な機能だけを実装するように簡略化して、512B(0.5kB)の容量に抑えたブートローダです。つまり、Optibootの採用により、スケッチを書き込める容量が31.5kBに増えたのです。

ATmega328Pの様にフラッシュメモリが32kBもあるマイコンでは、ブートローダのサイズが1.5kB減ったくらいでは、それほどありがたみがないかも知れませんが、ATmega88Vの様に、フラッシュメモリが8kBしかないマイコンでは、1.5kBの差が、かなり大きなインパクトを持ちます。

実は初期のArduinoは、ATmega8というマイコンを使っていたのですが、このマイコンのフラッシュメモリが8kBでした。この時は2kBのフラッシュメモリを使っていたので、実際にスケッチを書き込める容量は3/4しかなかった事になります。

今回、ATmega88/88V/168Pにブートローダを載せるにあたって、古い2kBのブートローダを載せるよりは、せっかくだからOptibootを載せようと思いました。

3-2.書き込み速度について

Unoより前のArduinoでは、スケッチ書き込み時に、パソコンとArduinoが、19,200bpsなどの比較的遅い速度で通信を行っていました。Optibootでは115,200bps(Arduino Unoの場合)の高速通信を行っているので、Optiboot以前よりも、スケッチの書き込み速度が向上しました。

3-3.ライセンス形式について

Optibootは、オープンソースで配布されています。ソースリストが公開されているので、細部を書き換えて、カスタマイズやチューニングをする事ができます。ただし、GPLライセンスで配布されているため、Optibootを改変して再配布する場合、コンパイル済みのコードだけ再配布する事は許されず、ソースリストを添付したり、あるいは、求めに応じてソースリストを配布する手段を用意したりしなければなりません。

今回、ATmega88/88V/168PにOptibootを載せる際に、Optibootに手を加えたので、私も改変後のOptibootのソースリストを公開する義務があります。このことについては後にまた話すことにします。

広告

4.Arduino IDEでATmega88/88V/168P/328Pのスケッチを開発するために必要な手順

ATmega88/88V/168P/328Pのスケッチの開発をArduino IDEで開発するためには、次の3つの作業が必要です。

  1. Arduino IDEにATmega88/88V/168P/328P用のブートローダを登録する
  2. ブートローダをATmega88/88V/168P/328Pに書き込む
  3. 開発したスケッチをATmega88/88V/168P/328Pに書き込む

1のArduino IDEへの登録作業は、最初の1回だけすればOKです。

2のブートローダを書き込む作業は、新しいATmega88/88V/168P/328Pを使い始める時に、1回だけすればOKです。

3のスケッチを書き込む作業は、スケッチに変更がある度に行う必要があります。

次の章から、1~3の作業の手順について順に説明します。

5.Arduino IDEにATmega88/88V/168P/328P用のブートローダを登録する方法

Arduino IDEに、ATmega88/88V/168P/328P用のブートローダを登録する方法を説明します。

まず、次の表のサポートファイル(Arduino IDEに新しいマイコンを追加するためのファイル)の中から、必要な物をダウンロードしてください。

表2、ATmega88/88V/168P/328Pサポートファイル
対応Arduino IDE 対応マイコン バージョン ダウンロードリンク リリース日
1.0.X ATmega88/88V 1.10 ATmega88_110.zip (6kB) 2015/10/15
1.0.X ATmega168P 1.00 ATmega168P_100.zip (6kB) 2015/10/15
1.0.X ATmega328P 1.00 ATmega328P_100.zip (6kB) 2016/10/28
1.6.Xおよび1.7.X ATmega88/88V/168P/328P 1.00 ATmega88_168P_328P_100.zip (10kB) 2016/10/28

Arduino IDEのバージョンによって、必要なサポートファイルが違います。また、Arduino IDE 1.6.XまたはArduino IDE 1.7.X(Xは任意の数字)をお使いの方は、全てのマイコンがひとつのサポートファイルで使えますが、Arduino IDE 1.0.Xをお使いの方は、ATmega88/88VとATmega168PとATmega328Pとで、別のサポートファイルになっています。

Arduino IDE 1.0.Xの場合は、ダウンロードした3つのzipファイルを解凍すると、ATmega88ATmega168P、およびATmega328Pという名前のフォルダができます。それらのフォルダを、スケッチ保存用フォルダの中のhardwareというフォルダの中にコピーすると、Arduino IDEにATmega88/88V/168P/328P用のブートローダが登録されます。

なお、ATmega88/88V、ATmega168P、ATmega328Pの全てを使わないなら、使うマイコンのサポートファイルだけコピーしてもかまいません。使わないサポートファイルは登録しない方が、Arduino IDEのメニューがすっきりします。

図1、ATmega88、ATmega168P、ATmega328PフォルダのArduino\hardwareフォルダ内へのコピー
図1、ATmega88、ATmega168P、ATmega328PフォルダのArduino\hardwareフォルダ内へのコピー

またArduino IDE 1.6.Xおよび1.7.Xの場合は、ダウンロードしたzipファイルを解凍すると、ATmega88_168P_328Pという名前のフォルダができます。そのフォルダを、スケッチ保存用フォルダの中のhardwareというフォルダの中にコピーすると、Arduino IDEにATmega88/88V/168P/328P用のブートローダが登録されます。

なお、Windows環境の方の場合、スケッチ保存用のフォルダは、通常、PC\ドキュメント\Arduinoになっています。スケッチ保存用のフォルダが分かりにくい人は、Arduino IDEでファイル→環境設定メニューを選び、環境設定ウィンドウ内で、スケッチ保存用のフォルダを確認する事ができます。

図2、環境設定メニューの選択
図2、環境設定メニューの選択
図3、環境設定ウィンドウでのスケッチ保存用フォルダの場所の確認
図3、環境設定ウィンドウでのスケッチ保存用フォルダの場所の確認

なお、スケッチ保存用フォルダの中にhardwareというフォルダが元々なかった場合は、hardwareフォルダを作成してから、その中にzipファイルを解凍してできたフォルダをコピーしてください。

以上の操作で、ATmega88/88V/168P/328P用のブートローダがArduino IDEに登録されました。次に、きちんと登録されている事を確認しましょう。

Arduino IDE 1.0.Xの場合は、Arduino IDEを起動し、ツール→マイコンボードメニューを選ぶと、下の図で赤線で示した9つの選択肢が追加されている事に気づくと思います。

図4、Arduino IDE1.0.Xに登録されたATmega88/88V/168P/328P用ブートローダ
図4、Arduino IDE1.0.Xに登録されたATmega88/88V/168P/328P用ブートローダ

ここでATmega88Vが選択肢に出てこないのはおかしいと思われる方がいらっしゃるかも知れませんが、ATmega88VはATmega88と同じブートローダが使えるので、あえて別の選択肢を設けませんでした。

マイコンの型番(ATmega88、ATmega168PまたはATmega328P)の後ろに、8MHz/X'tal8MHz/INT OSC16MHz/X'talと書いてありますが、これらはクロックのオプションで、意味は次の表の通りです。

表3、クロックのオプション
表記 意味
8MHz/X'tal クロック源として8MHzの外付け水晶発振子を使う
8MHz/INT OSC クロック源として8MHzの内蔵CR発振器を使う
16MHz/X'tal クロック源として16MHzの外付け水晶発振子を使う

Arduino IDE 1.6.Xおよび1.7.Xの場合は、Arduino IDEを起動し、ツール→ボードメニューを選ぶと、ATmega88/168P/328Pというグループが追加されており、その中にATmega88ATmega168P、およびATmega328Pの3つの選択肢があるのに気づくと思います。ここでマイコンの種類を選択します。(ATmega88Vを使う場合は、ATmega88の選択肢を選んでください)

図5、Arduino IDE1.6.Xに登録されたATmega88/88V/168P/328P用ブートローダ
図5、Arduino IDE1.6.Xに登録されたATmega88/88V/168P/328P用ブートローダ

次にツール→Clockのメニューを選ぶと、8MHz/X'talと8MHz/INT OSC16MHz/X'talの選択肢が現れます。これらはクロックのオプションで、それぞれの意味は、先ほどの表3の通りです。

図6、クロックオプション
図6、クロックオプション

この様に、Aruino IDE 1.0.Xと、Arduino IDE 1.6.Xおよび1.7.Xでは、メニューの構成が異なります。この記事では、これ以降Arduino IDE 1.0.Xを使う事を前提に説明をしますが、Arduino IDE 1.6.Xおよび1.7.Xをお使いの方は、メニューの選択の部分を、適時読み替えてください。

参考:ATmega328Pでクロックの設定を16MHz/X'talにした場合は、Arduino Unoと同じブートローダを書き込みます。

ここで、内蔵CR発振器について、少し説明をしておきます。

ATmega88/88V/168P/328Pには、8MHzのCR発振器が内蔵されており、水晶発振子などの外部クロック源の代わりに利用する事ができるようになっています。

内蔵CR発振器で8MHzのクロックを発生すると、外付けの水晶振動子が不要になり、コストや実装面積が減ります。さらに、水晶発振子を接続するための端子が2つ不要になりますから、それらをGPIO(汎用I/O)ピンにでき、digitalRead関数digitalWrite関数で入出力が行えるようになります。(図7参照)

図7、内蔵CR発振器使用時のピン接続
図7、内蔵CR発振器使用時のピン接続

一方で、内蔵CR発振器の周波数精度は水晶発振回路よりもかなり劣るため、クロック周波数に精度が求められる用途には使えません。

なお、内蔵CR発振器を使う場合は、この記事で紹介する方法でブートローダを書き込むより、ブートローダを使わずにICSPで直接スケッチを書き込む方法をお勧めします。というのは、内蔵CR発振器の周波数精度が悪いため、ブートローダを使ってスケッチを書き込むと、エラーになりやすいからです。

ブートローダでスケッチを書き込む場合は、UARTインタフェースを使って書き込むのですが、調歩同期方式で安定な通信を行うには、クロックの周波数精度が±2%程度に収まっている必要があります。しかしながら、ATmega88/88V/168P/328Pの内蔵CR発振器の周波数精度は±10%と、かなり悪い精度になっています。このため、内蔵CR発振器を使うモードで、ATmega88/88V/168P/328Pをいくつも用いてブートローダ経由の書き込みの試験を行ったところ、うまく書き込める個体と、書き込みに失敗する個体がありました。

一方で、ICSPを使ってスケッチを書き込む場合は、クロック同期方式(信号のやり取りに必要なクロックの送信線を、信号線とは別に設ける方式)のSPIインターフェースを使います。この場合は、書き込みに必要なクロックがICSPライタから送られてくるため、マイコン自体のクロックの精度は要求されません。

ICSPを使って、ブートローダを使わずにスケッチを書きこむ方法については、以下の2つのの記事で説明してあります。

これらの記事では、ATmega168/328Pにスケッチを書き込む事を前提に説明がされていますが、マイコンボードの選択の際にATmega88やATmega168Pを選べば、それらのマイコンにもスケッチを書き込めます。

次のページでは、ブートローダを実際にマイコンに書き込む手順について説明します。

目次へ  前のページへ (1) (2) (3) (4) (5) 次のページへ

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

関連ページ

関連製品

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