皆さんもよく使っているArduino、そのArduinoでLEDをチカチカさせる時、私たちは当たり前のようにIDEの「→(マイコンボードに書き込む)」ボタンを押します。
一瞬で完了するこの作業ですが、実は裏側では「翻訳・通信・書き換え」という、処理が行われています。
普段はなんとなく動くこのArduinoですが、この蓋を開けて中身を知ると、エラーが出た時に自力で解決できるようになったり、他のマイコンへの応用が効くようになったりします。
今回は「パソコンで書いた英語(コード)が、なぜ電気信号に変わってマイコンを動かせるのか?」 を解説します。
全体像:コードがメモリに届くまで
ボタンをと押した瞬間、プログラムは以下の3つの工程を経て、Arduinoの脳(マイコン)に届きます。
1. コンパイル(翻訳)
~英語を「0と1」にする作業~
まず大前提として、マイコン(Arduinoに乗っているATmegaチップなど)は、C言語が読めません。 彼らが理解できるのは、電気のON/OFFを表す「0」と「1」の羅列(マシン語/バイナリ)だけです。
そこで、私たちが書いたコード(人間語)を、マイコンが読める言葉(機械語)に翻訳する必要があります。これが「コンパイル」です。

実は「Arduino言語」なんてない?
よく「Arduino言語」と言われますが、実は中身は、組み込み業界で標準的に使われている「C++」そのものです。
Arduino IDEの裏側では、avr-gccという翻訳ソフト(コンパイラ)が動いていて、
* digitalWrite(13, HIGH);
↓
* 01010011 11000101 ... (.hexファイル)
という風に翻訳を行っています。この「0と1の変換済みデータ」のことをhexファイルと呼びます。
細かい話をすると、elfファイルという、デバッグのためのすべての情報が入ったファイルが生成され、そこから マイコンが動くためだけのhexファイル**が生成されます。
「Expor Compiled Binary」でコンパイルを行うとelfファイルやhexファイルが生成されます。是非見てみてください。


2. USBシリアル通信(通訳)
翻訳が終わったら、次はデータをArduinoに送ります。ここで問題になるのが「通信方式の違い」です。
- パソコン: 「USB」で話したい。
- マイコン: 「UART(シリアル通信)」で話したい。
この二人は直接会話ができません。そこでArduino基板上には、「USBシリアル変換IC」という仲介役のチップが乗っています(USBポートの近くにある、小さな黒いチップです)。ft232rlなど、FTDIのチップがよく使われていますね。
このチップが、PCから来たUSBの電気信号を、マイコンが理解できる「RX/TX(受信・送信)」の信号にリアルタイムで変換してくれます。

3. ブートローダー(案内人)
ここが今回の一番のポイントです。 シリアル通信でデータが届いたとして、マイコンはどうやってそれを「自分の記憶(フラッシュメモリ)」に焼き付けるのでしょうか?
本来、生のマイコン(買ったばかりのICチップ)にプログラムを書き込むには、数千円〜数万円する「専用の書き込み機(プログラマ)」というハードウェアが必要です。
でも、ArduinoはUSBケーブル1本で書き込めますよね。なぜでしょうか? それは、マイコンの中に「ブートローダー」という小さなプログラムがあらかじめ住んでいるからです。
ブートローダーの働き
ブートローダーは、マイコンが起動(リセット)した直後に、一番最初に動き出す「案内人」のようなプログラムです。
- リセット: (書き込みボタンを押すと、自動でリセットがかかります)
- ブートローダー起床: PCから新しいプログラムが届いてるか、を確認。
- 書き込み: プログラムが届いていれば、それを受け取って、自分自身のメモリを書き換える。
- 実行: 届いていなければ、すでに書き込まれているプログラムを実行する。
この「最初に書き込まれている案内人」がいるおかげで、私たちは高価な機材を買わずに、手軽に電子工作を楽しめるのです。
まとめ
私たちが「書き込み」ボタンを押したとき、裏側これらが起きています。
これが分かると、「書き込みエラー」が出たときに「あ、USB変換チップのドライバが入ってないな」とか「ブートローダーが壊れたかな?」と推測できるようになります。
次回
第二回はこちら!