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の間違いを訂正。 |
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にブートローダを書き込む方法も同時に紹介します。
ブートローダの書き込み方の説明に入る前に、今回話題にしているATmega88/88V/168Pと、Arduino Unoに使われているATmega328Pの違いについて説明します。
簡単にいうと、ATmega88/88V/168PとATmega328Pは、クロック周波数、メモリの容量、電源電圧が違います。相違点を表1にまとめます。
マイコン | 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上でスケッチの開発ができるようになります。
Optibootは、Arduino Unoに使われているブートローダの事です。以下、Optibootについて説明します。
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を載せようと思いました。
Unoより前のArduinoでは、スケッチ書き込み時に、パソコンとArduinoが、19,200bpsなどの比較的遅い速度で通信を行っていました。Optibootでは115,200bps(Arduino Unoの場合)の高速通信を行っているので、Optiboot以前よりも、スケッチの書き込み速度が向上しました。
Optibootは、オープンソースで配布されています。ソースリストが公開されているので、細部を書き換えて、カスタマイズやチューニングをする事ができます。ただし、GPLライセンスで配布されているため、Optibootを改変して再配布する場合、コンパイル済みのコードだけ再配布する事は許されず、ソースリストを添付したり、あるいは、求めに応じてソースリストを配布する手段を用意したりしなければなりません。
今回、ATmega88/88V/168PにOptibootを載せる際に、Optibootに手を加えたので、私も改変後のOptibootのソースリストを公開する義務があります。このことについては後にまた話すことにします。
ATmega88/88V/168P/328Pのスケッチの開発をArduino IDEで開発するためには、次の3つの作業が必要です。
1のArduino IDEへの登録作業は、最初の1回だけすればOKです。
2のブートローダを書き込む作業は、新しいATmega88/88V/168P/328Pを使い始める時に、1回だけすればOKです。
3のスケッチを書き込む作業は、スケッチに変更がある度に行う必要があります。
次の章から、1~3の作業の手順について順に説明します。
Arduino IDEに、ATmega88/88V/168P/328P用のブートローダを登録する方法を説明します。
まず、次の表のサポートファイル(Arduino IDEに新しいマイコンを追加するためのファイル)の中から、必要な物をダウンロードしてください。
対応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ファイルを解凍すると、ATmega88、ATmega168P、およびATmega328Pという名前のフォルダができます。それらのフォルダを、スケッチ保存用フォルダの中のhardwareというフォルダの中にコピーすると、Arduino IDEにATmega88/88V/168P/328P用のブートローダが登録されます。
なお、ATmega88/88V、ATmega168P、ATmega328Pの全てを使わないなら、使うマイコンのサポートファイルだけコピーしてもかまいません。使わないサポートファイルは登録しない方が、Arduino IDEのメニューがすっきりします。
またArduino IDE 1.6.Xおよび1.7.Xの場合は、ダウンロードしたzipファイルを解凍すると、ATmega88_168P_328Pという名前のフォルダができます。そのフォルダを、スケッチ保存用フォルダの中のhardwareというフォルダの中にコピーすると、Arduino IDEにATmega88/88V/168P/328P用のブートローダが登録されます。
なお、Windows環境の方の場合、スケッチ保存用のフォルダは、通常、PC\ドキュメント\Arduinoになっています。スケッチ保存用のフォルダが分かりにくい人は、Arduino IDEでファイル→環境設定メニューを選び、環境設定ウィンドウ内で、スケッチ保存用のフォルダを確認する事ができます。
なお、スケッチ保存用フォルダの中にhardwareというフォルダが元々なかった場合は、hardwareフォルダを作成してから、その中にzipファイルを解凍してできたフォルダをコピーしてください。
以上の操作で、ATmega88/88V/168P/328P用のブートローダがArduino IDEに登録されました。次に、きちんと登録されている事を確認しましょう。
Arduino IDE 1.0.Xの場合は、Arduino IDEを起動し、ツール→マイコンボードメニューを選ぶと、下の図で赤線で示した9つの選択肢が追加されている事に気づくと思います。
ここでATmega88Vが選択肢に出てこないのはおかしいと思われる方がいらっしゃるかも知れませんが、ATmega88VはATmega88と同じブートローダが使えるので、あえて別の選択肢を設けませんでした。
マイコンの型番(ATmega88、ATmega168PまたはATmega328P)の後ろに、8MHz/X'talや8MHz/INT OSCや16MHz/X'talと書いてありますが、これらはクロックのオプションで、意味は次の表の通りです。
表記 | 意味 |
---|---|
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というグループが追加されており、その中にATmega88、ATmega168P、およびATmega328Pの3つの選択肢があるのに気づくと思います。ここでマイコンの種類を選択します。(ATmega88Vを使う場合は、ATmega88の選択肢を選んでください)
次にツール→Clockのメニューを選ぶと、8MHz/X'talと8MHz/INT OSCと16MHz/X'talの選択肢が現れます。これらはクロックのオプションで、それぞれの意味は、先ほどの表3の通りです。
この様に、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参照)
一方で、内蔵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を選べば、それらのマイコンにもスケッチを書き込めます。
次のページでは、ブートローダを実際にマイコンに書き込む手順について説明します。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |
商品名 | M3×6mm両側メススペーサ・M3X5mmネジ 各4本セット | |
税抜き小売価格 | 120円 | |
販売店 | スイッチサイエンス | |
サポートページ | M3×6mm両側メススペーサ・M3X5mmネジ 各4本セットサポートページ |