最終修正 2022.1.12
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 ゼロプレッシャーソケットを取りつけたところ(不格好ですが・・・)
素の Atmega328P を買ってきて、ブートローダを書き込むには、 ライターが必要です。その方法は、次節で示します。
ここで示した方法で作成した回路の例が図3 です(1 番ピンの 10 kΩ の抵抗は省略しています)。
図3 Arduino を利用して開発した自作回路
ブレッドボードで動作確認してから、ユニバーサル基板上に 作りました。自分が使わない端子は放置しています。
ブレッドボードの配線は、0.65 mm^2 の線を購入し、 ニッパーで適切な長さに切断して使用しています。
購入してきた Atmega328P を Arduino UNO に載っているものと同じ状態に するには、以下の 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 を 保持するか否か」を決定するビットなので、通常は 関係なさそうです。