2014年01月31日 | 公開。 |
2016年05月19日 | 図3と図4を追加。 「フラッシュメモリライタ」と「ROMライタ」を「プログラムライタ」に書き換え、用語を統一した。 |
Arduinoをある程度使い込んでくると、Arduino関係の本やサイトに、「ブートローダ」(あるいは「ブートローダー」)という言葉が良く出て来ることが気になってきます。ブートローダって一体なんでしょう。
「ブート」とはマイコンが起動することを意味します。「ローダ」とはプログラムやデータなどを、メモリに読み込むプログラムを意味します。それらが合わさった「ブートローダ」とは何を意味するのでしょうか?結論から言うと、マイコンの起動時に、外部からプログラムをメモリに読み込むプログラムの事をブートローダと言います。
Arduinoの話から離れてしまいますが、例えば、例えばSDカードに実行したいプログラム書かれているマイコンシステムの場合について考えます。SDカード中のプログラムはRAMに転送してからしか実行する事ができません。この場合、起動時にSDカードからRAMにプログラムを転送し、RAM上のプログラムに実行を移すための短いプログラムを、マイコン内蔵のROMに書き込んでおきます。これがブートローダです。(図1参照)
この場合、ブートローダの働きは、SDカードからRAMにプログラムを転送することと、RAM上のプログラムに実行を移す事だけですから、ブートローダのサイズは小さく、マイコンに内蔵するROMの容量もわずかで済むことが分かります。一方でRAMは、実行したいプログラムとそれが使うデータが入るだけの、大容量の物が必要です。
内蔵ROMが大容量のマイコンを使って、そこに実行したいプログラムを直接書き込む手もあります(図2参照)が、一般に内蔵ROMを書き換えるのは専用のプログラムライタが必要になるなど、手間が掛かります。一方で、図1の様に、ブートローダを使ってSDカード上のプログラムを読み込んで実行するようにしておくと、SDカードを差し替えるだけで、実行するプログラムの変更が出来るようになり便利です。
それでは、Arduinoのブートローダは、どんな働きをするのでしょうか?
Arduinoにも色々種類があるので、Arduino Unoの場合を例に挙げて、ブートローダの働きを説明します。
Arduino Unoには、ATmega328Pというマイコンが使われています。このマイコンには32kバイトのフラッシュメモリ、1kバイトのEEPROM、2kバイトのRAMが内蔵されており、外部にメモリは増設できない設計になっています。(SPIやI2C接続のメモリを増設できますが、メモリ空間上には現れず、周辺機器扱いになる)また、プログラムを実行するには、フラッシュメモリに書き込む必要があり、RAMにプログラムを書き込んでも実行できない仕組みになっています。(ハーバードアーキテクチャ)
普通はATmega328Pのフラッシュメモリにプログラムを書き込むには、以下の2つの方法のいずれかを使います。
ここではこれらの方法について詳しくは説明しませんが、いずれも専用のプログラムライタ(書き込み器)が必要になります。プログラムライタは数千円以上と比較的高価です。最近では秋月電子などでAVRISPmkIIというICSP端子専用のライタが3千円台で発売されていますので、以前と比べると安価にプログラムが書き込めるようにはなりましたが、それでもプログラムを書き込むライタだけでArduino Uno本体と同じくらいの値段になってしまいます。
マイコンを初心者が試しに使ってみようと思っても、プログラムライタの値段が一つのハードルになる可能性があります。また、マイコンボードとプログラムライタの2種類の道具を使いこなさなければならないのも、初心者には分かりにくいです。そこで、Arduino Unoでは、もっと安くスケッチ(プログラム)を書き込める方法を採用し、かつ、そのための書き込み器もArduino Unoの基板上に搭載してしまいました。(Arduino Proでは書き込み器の大半を外付けにしたため価格が安い)
Arduino Unoが採用したスケッチの書き込み方法は、フラッシュメモリに小さなブートローダを書きこんでおき、パソコンのUSBポートから送られてくるスケッチの情報を、シリアルインターフェースで取り込み、ブートローダがフラッシュメモリにスケッチを転送してから実行するというものです。最初にフラッシュメモリにブートローダを書きこむ際には、先ほど紹介したAVRISPmkIIの様な専用のライタが必要ですが、ブートローダの書きこみ作業はArduino Unoの製造時に行われるので、ユーザーは高価なライタを買うことなく、スケッチの書き込みができます。
図5は、ブートローダを用いてパソコンからATmega328Pのフラッシュメモリにスケッチを書き込む際の概念図です。
Arduino UnoにはATmega328Pというマイコンが内蔵されていますが、このマイコンにはリセット回路、シリアルインターフェース(USART)、フラッシュメモリ、CPU(図中には書いていない)などが内蔵されています。また、Arduino Unoには、USB-シリアル変換回路も内蔵されており、シリアル通信線を介してマイコン内のシリアルインターフェースにつながっています。またUSB-シリアル変換回路はリセット信号線を介してマイコン内のリセット回路へもつながっています。
一方で、スケッチを開発したパソコン内のハードディスクには、コンパイル済みのスケッチが書き込まれています。そのスケッチはUSBポートとUSBケーブルを介してArduino Uno内蔵のUSB-シリアル変換回路に送られます。その後、シリアル通信線、マイコン内のシリアルインターフェースと順に通ったスケッチの情報は、CPUにより、内蔵フラッシュメモリに書き込まれます。
ここで、USB-シリアル変換回路について ちょっと説明します。USBというのは、今ではどのパソコンにも内蔵されている、便利なバス(情報伝達の経路)ですが、その仕組みは複雑であり、USBインターフェースを内蔵しているマイコンは少数派です。ATmega328PにもUSBインターフェースが内蔵されておらず、USBの信号を扱うことができません。そこでUSB-シリアル変換回路を用いて、USBの信号をシリアルの信号に変換します。この変換回路に使うICは数百円であり、プログラムライタよりかなり安い点がポイントです。
シリアル信号というのは、RX(受信信号線)とTX(送信信号線)の2本の信号線を使った単純な情報伝達信号で、ATmega328Pを含む、ほとんどのマイコンにシリアルインターフェースが内蔵されています。
このようにして、USB-シリアル変換回路のお陰で、パソコンのUSBポートから送られてきたスケッチをマイコンが受け取る事ができるのです。
マイコンから受け取ったスケッチをフラッシュメモリに書き込むためのプログラムが必要ですが、それがブートローダというわけです。またブートローダが起動するにはマイコンがリセットされる必要があるのですが、リセットを掛ける合図が、スケッチ書き込みの前にパソコンから送られてきて、USB-シリアル変換回路でリセット信号に変換され、マイコンのリセット回路に入力されます。
このページではブートローダの働きの概略を説明しましたが、次のページでは、時間順に、もう少し細かくブートローダの動作について説明します。
商品名 | Arduino Uno用ブートローダスケッチライタシールドキット | |
税抜き小売価格 | 1440円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino Uno用ブートローダライタシールドキットサポートページ |
商品名 | Arduino用ブートローダ/スケッチライタキット | |
税抜き小売価格 | 3000円 | |
販売店 | スイッチサイエンス | |
サポートページ | Arduino用ブートローダ/スケッチライタキットサポートページ |