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

最終修正  2022.1.12


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 ゼロプレッシャーソケットを取りつけたところ(不格好ですが・・・)

Arduino UNO の CPU である Atmega328P は、 素の Atmega328P とは異なり、ブートローダという プログラムが書き込んであります。 「UNO と同じブートローダを書き込み済みのもの」が、 マルツパーツから販売されています。 なぜか、2016.2 現在で 420 円であり、 素の Atmega328P (780 円) より安いです。

素の Atmega328P を買ってきて、ブートローダを書き込むには、 ライターが必要です。その方法は、次節で示します。

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

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

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

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

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

購入してきた Atmega328P を Arduino UNO に載っているものと同じ状態に するには、以下の 2 つの操作が必要です。

  1. ブートローダーを書き込む。
  2. ヒューズビット、ロックビットを設定する。

それには、ライターが必要です。 私は共立エレショップが販売している AVRWRT3 を使っています。 Arduino をライターとして使う方法もあるようです。 たとえば このページに載っています。「Arduino 自作」で検索すると 色々と見つかります。


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

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

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

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

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


AVRWRT3 を購入すると、マニュアルが PDF ファイルで付いてくるのですが、 書き込み用ソフトの操作説明やドライバの説明しか載っておらず、 マイコンとの結線図がありません。

結線の方法は、ネットを見たり「試しながら学ぶ AVR 入門  土井滋貴」を 見たところ、以下のようにすると良いようです(私はこれで 書き込みができました)。 AVRWRT3 をはじめ、AVR マイコン用ライターは 6 個の端子が あります(AVRWRT3 の JP1 はショートさせて、Vcc 端子に 電圧を供給するモードにしておきます)。 図4 のように 名前が付いています。これを、Atmega328P の 6 個の 同名の端子と接続します。 点線の範囲の部品は、内部発振モードのとき(購入直後の Atmega328P は 内部発振モードです)は、不要です。

  
図4 avr ライターと Atmega328P の結線(回路図)

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


図5 avr ライターと Atmega328P の結線(写真)

ブートローダーは arduino-1.0.5-r2 の場合、

hardware\arduino\bootloaders\optiboot\optiboot_atmega328.hex

です。 ヒューズビットとロックビットの設定は、 hardware\arduino\boards.txt の中に書いてあります。 それによると、UNO は

uno.bootloader.low_fuses=0xff       ---> 1111 1111
uno.bootloader.high_fuses=0xde      ---> 1101 1110
uno.bootloader.extended_fuses=0x05  ---> 0000 0101
uno.bootloader.unlock_bits=0x3F     ---> 0011 1111
uno.bootloader.lock_bits=0x0F       ---> 0000 1111

とあります。ところが、2016.1 に購入した Arduino UNO に 搭載されている Atmega328P の 中身を読み出すと、high_fuses のみが一致せず

uno.bootloader.high_fuses=0xd6      ---> 1101 0110

となっています。Atmega328P のデータシートの p.283 を見ると、 一致しない bit は「チップをイレースするときに EEPROM MEMORY を 保持するか否か」を決定するビットなので、通常は 関係なさそうです。