arduino のハードウェアの覚え書き

最終更新  2024.6.25


Arduino UNO を自作する

Arduino は素晴らしいマイコンの開発環境です。 プロトタイプを迅速に作ることができます。 しかし、

のときは、1 個約 3000 円の Arduino を沢山買うのは、 何となくもったいない感じが します。PIC マイコンを使っていた人は、そう思うでしょう。 また、

という人もいるでしょう。 Arduino は回路図が公開されています。Arduino の基板から CPU である ATmega328P を取り外し、図1 のように接続すると、単独で動作します。

(注意!!) 本記事は、私が試して「とりあえず動いた」という 結果に基づいて書いています。長期間あるいは 何らかのじょう乱が加わった場合の安定動作を保証するものではありません。 例えば、Arduino Uno Rev3 の回路図には 9 番ピンと 10 番ピンの 間に 1M オームの抵抗がありますが、何のためにあるのか私には 分かりません。図1ではその抵抗は省略しています。


図1 328 を動かすために最低限必要な接続

以下の条件を満たせば、動作するようです。

5V と Gnd の間の 0.1uF のコンデンサは、 電源に混入するノイズで ATmega328P が誤動作 しないように入れてあります。 私の経験では、大きな電流 (そのときは 0.4A) を on/off する MOSFET (2SK975) が寄生発振してスパイク上のノイズを発生させ、 PIC マイコンを誤動作させたことがあります(ゲートに抵抗を 入れることで回避できます)。 ハードウェアを制御するマイコンが誤動作すると、 非常に恐いことになる可能性があります。 例えば、プログラムカウンタの値が 全く違う値に設定されたと仮定すると、意図せぬ端子が on (off) に なったりして、想定外の動作をすることになります。

私は以下のように、Arduino の CPU を取り外して、 ゼロプレッシャーソケットを取りつけて、「プロトタイプ開発用 Arduino」兼 「スケッチ書き込み器」として使っています。

  
図2 ゼロプレッシャーソケットを取りつけたところ(不格好ですが・・・)

ここで示した方法で作成した回路の例が図3 です(1 番ピンの 10 kΩ の抵抗は省略しています)。

  
図3 Arduino を利用して開発した自作回路

ブレッドボードで動作確認してから、ユニバーサル基板上に 作りました。自分が使わない端子は放置しています。

ブレッドボードの配線は、0.65 mm^2 の線を購入し、 ニッパーで適切な長さに切断して使用しています。

Arduino UNO 用のブートローダを ATmega328P に書き込む

Arduino UNO に乗っている ATmega328P は、 素の ATmega328P とは異なり、ブートローダという プログラムが書き込んであります。 秋月電子などから購入した ATmega328P を Arduino UNO に載っているものと同じ状態に するには、ブートローダーを書き込む必要があります。

Arduino を使ってブートローダを書き込むことが できます。その方法は、 たとえば このページに載っています。「Arduino 自作」で検索すると 色々と見つかります。


ここから次の水平線までは、PIC を使ったことがない人は スルーして構いません。

PIC マイコンの経験がある人が、AVR を扱うときに陥る 落とし穴があります。

PIC では「内部発振器を使うか外部発振器を使うか」を「コンフィギュレーション レジスタ」で指定します。コンフィギュレーションレジスタの指定値は、 hex ファイルの中に含まれています。書き込み直前の PIC がどちらの モードになっていても、PIC 用ライターは hex ファイルを書き込みます。

AVR では「内部発振器を使うか外部発振器を使うか」は「ヒューズビット」に 書き込まれており、hex ファイルには含まれていません。 ライターで別途書き込む必要があります。 また、書き込み直前の AVR が外部発振モードになっていると、 水晶振動子1個とコンデンサ2個が外付けされていないと、 書き込みができません(私は最初、これが分からず、苦しみました)。

購入直後の ATmega328P はヒューズビットが内部発振モードになっているので、 発振用外付け回路なしで書き込みできますが、 一旦ヒューズビットを外部発振モードに書き換えてしまうと、 発振用外付け回路がないと、書き込み不可能となります。 Arduino UNO は外部発振回路を使用して動作します。

この問題は Arduino を使って書き込む場合、生じません。 私が 2016 年ごろに Arduino を自作したとき、 ブートローダの書き込みに AVRWRT3を使っていました。 AVRWRT3 を使う場合、ブートローダの書き込みと ヒューズビットの書き込みを別々に書き込む必要があります。 そのときにこの問題が発生しました。


Arduino の 5V, Gnd, D10, D11, D12, D13 端子を ATmega328P に以下のように結線します。


図4 Arduino と ATmega328P の結線(回路図)

ATmega328P の 1 番端子と 5 V の電源端子 の間に 10 kΩの抵抗を入れます。

ATmega328P の 9, 10 番端子に 22p のコンデンサと 16 MHz の 水晶発振子を図 1 と同様に結線します。

図 5 のようにブレッドボードに組みました。


図5 Arduino と ATmega328P の結線(写真)

まず、Arduino にブートローダを書き込むプログラムを 送り込みます。

  file --- exsamples --- 11. ArduinoISP --- ArduinoISP

次に、

  tools --- Programmer --- Arduino as ISP
  tools --- Burn Bootloader

で ATmega328P にブートローダを書き込みます。 これで、Arduino UNO に搭載されてる ATmega328P と同じ状態になりました。