【Arduinoの裏側①】コードが「電気」に変わるまで。コンパイルと書き込みの仕組み

※本ページはプロモーションが含まれています

皆さんもよく使っているArduino、そのArduinoでLEDをチカチカさせる時、私たちは当たり前のようにIDEの「→(マイコンボードに書き込む)」ボタンを押します。 一瞬で完了するこの作業ですが、実は裏側では「翻訳・通信・書き換え」という、処理が行われています。

普段はなんとなく動くこのArduinoですが、この蓋を開けて中身を知ると、エラーが出た時に自力で解決できるようになったり、他のマイコンへの応用が効くようになったりします。

今回は「パソコンで書いた英語(コード)が、なぜ電気信号に変わってマイコンを動かせるのか?」 を解説します。


全体像:コードがメモリに届くまで

ボタンをと押した瞬間、プログラムは以下の3つの工程を経て、Arduinoの脳(マイコン)に届きます。

  1. コンパイル(翻訳): 人間の言葉を機械語に変換する
  2. USBシリアル変換(通訳): PCとマイコンの言葉の壁を越える
  3. ブートローダー(案内人): データを受け取り、メモリに書き込む

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本で書き込めますよね。なぜでしょうか? それは、マイコンの中にブートローダー」という小さなプログラムがあらかじめ住んでいるからです。

ブートローダーの働き

ブートローダーは、マイコンが起動(リセット)した直後に、一番最初に動き出す「案内人」のようなプログラムです。

  1. リセット: (書き込みボタンを押すと、自動でリセットがかかります)
  2. ブートローダー起床: PCから新しいプログラムが届いてるか、を確認。
  3. 書き込み: プログラムが届いていれば、それを受け取って、自分自身のメモリを書き換える。
  4. 実行: 届いていなければ、すでに書き込まれているプログラムを実行する。

この「最初に書き込まれている案内人」がいるおかげで、私たちは高価な機材を買わずに、手軽に電子工作を楽しめるのです。


まとめ

私たちが「書き込み」ボタンを押したとき、裏側これらが起きています。

  1. コンパイラが、C++機械語(HEX)に翻訳する。
  2. 変換チップが、USB信号をシリアル信号に通訳する。
  3. ブートローダが、データを受け取ってメモリに焼き付ける。

これが分かると、「書き込みエラー」が出たときに「あ、USB変換チップのドライバが入ってないな」とか「ブートローダーが壊れたかな?」と推測できるようになります。

次回

第二回はこちら!

cratech.hatenablog.jp