2022年8月26日発売 書籍『あっと驚く技術力 ガジェット改造』に記事を掲載して頂きました!

【Arduino】ATmega328P単体でスケッチを動かしてみる!その① ブレッドボードでの接続&ブートローダーの書き込みなど

Amazonでちょっと面白いArduinoキット?があったので購入してみました。
Arduino Unoなどで使われているAVRマイコンとなるATmega328Pチップをブレッドボードなどに単体で組んでArduinoとして動かすというもので、Arduino Unoの修理のためにチップの入手先を探していた時にたまたま見つけたものとなります。

Arduinoで使えるAVRマイコンATmega328Pは、国内では秋月電子通商さんやスイッチサイエンスさんでも取り扱いされています。
素の状態のチップなら300円ほど、Arduinoブートローダーが書き込まれたものでも+100円ほどで入手出来ますが、これだけの単品購入では送料の方が高くなります。

【Arduino Uno】壊れたArduinoを修理する!マイコンチップATmega328Pの交換方法【壊れたArduinoの修復 その②】

そんな事で海外からチップの購入とともに別途Amazonにあったこちらのキットも購入していたのですが、本来Arduinoのボード上に搭載されているATmega328Pマイコンチップ(Arduino UnoのDIP-IC型)をこれ単独でArduinoとして動かすといったテストができ、Arduinoの理解も深まります。

なかなか面白いキットなのでご紹介したいと思います。

【Arduino】ATmega328Pを単体で動かしてみる!

Arduino UnoのマイコンチップATmega328Pの故障により交換用のチップを探していた時にたまたま見つけたArduinoキット?となります。

ArduinoとしてATmega328Pを単体で動かすために必要な最低限のパーツが入っていてAmazonで699円で売られていたものです。
ブレッドボードなどを使えばATmega328Pを単体でArduinoとして動かすことが出来ます。

送料込みでこの価格なので実はArduino Unoの交換用チップとして考えていたのですが、折角なので回路を組み(簡単です)実際に動かしてみました。

Arduinoの動作原理を理解するための学習用としてもよく、またこの価格なので交換用チップとして手元に置いておくのもいいかもしれませんね!

個々のパーツは比較的入手しやすいものばかりなので、手持ちのArduino UnoからATmega328Pチップを取り外し同様なことを試してみるのも面白いかと思います。

付属パーツ

今回は、ATmega328Pをこれ単体でArduinoとして動かしてみたいと思います。
まずこのキットの付属品を見ておきます。

Arduinoのスケッチ(プログラム)を動かす心臓部にあたるATmega328Pチップのほか、DIP-IC用ソケット・クロック発生用の水晶振動子(16MHz)・電源用の5V電圧レギュレータ(LM7805)・あとはコンデンサが付属していました。
ATmega328Pを単体でArduinoとして動かすための最低限のパーツが付属しています。

ATmega328Pにはブートローダーが書き込まれていない素の状態のチップが入っていました。
Arduinoとして動かすにはブートローダーの書き込み作業が必要となってきます。

また付属していた水晶振動子は、なぜだか18.432MHzのものが入っていました。
Arduinoは基本的に外部クロック(16MHz)で動いているのでArduinoボードには16MHzの水晶振動子が搭載されていますが・・・動作は可能なので進めていきます。

MEMO
追記でUSB-シリアル変換モジュールを使ってスケッチの書き込みを行いましたが、上手くスケッチの書き込みが行えなかったので16MHzの水晶振動子を使った方がいいかと思います!

USB-シリアル変換モジュールなどは付属していないため、当然スケッチの書き込みはこれだけでは出来ません。
書き込む方法はいろいろとあるので後述します。

付属パーツ一覧
  1. ATmega328P-PU × 1(ブートローダー未書き込み)
  2. DIP-ICソケット × 1
  3. 水晶振動子(16MHz) × 1 ※18.432MHzが入ってました
  4. 22pFセラミックコンデンサ × 2
  5. 5V電圧レギュレータ(LM7805) × 1
  6. 電解コンデンサ(0.1μF) × 1
  7. 電解コンデンサ(0.33μF) × 1

5Vレギュレーター(LM7805)とパスコンとして電解コンデンサも入っていますが、5V電源を用意出来るならこれらのパーツは必要なく・・・結構少ないパーツでArduinoって動かすことが出来るんですね!
実質的にATmega328Pチップとクロック発生用の水晶振動子と2本のコンデンサ(22pF)の接続で動かすことが出来るということです。
個別でパーツを用意し動かしてみるのも面白いかと思います。

このキットには接続図や取説的なものが一切付属していませんでした。
Arduino公式サイトからArduino Unoの回路図を参考にブレッドボードで組んで動かしてみたいと思います。
まずは回路の確認からです。

ATmega328PをArduinoとして単体動作させるための接続

Arduinoはオープンソース・ハードウェアなので公式サイトに回路図等の情報が詳細に公開されています。
まず公式サイトからArduino Unoのボード情報を見てみます。

参考 Arduino Uno Rev3Arduino公式サイト

上記サイトの[SCHEMATICSIN.PDF]からボード全体の回路図を確認することが出来ます。

大きく別けると、電源・USB-シリアル変換・入出力(I/O)、そしてArduinoとして動かすためのマイコン部分(ATmega328P)に分けられます。

マイコン部分(オレンジ色)と今回ブレッドボード上で組もうと考えている部分(赤色)をざっくり抜き出してみました。

USB-シリアル変換部分(ATmega16U2が担当)はUSB端子からATmega328Pにスケッチを書き込む際に使うためスケッチを書き込んだあとは基本不要となります。(シリアル通信で使う場合がありますが)
また、5V電源を外部から供給出来れば電源部分も不要になります。

そう考えるとArduinoとして機能させるにはATmega328Pマイコンチップとクロック用のパーツと、少ない点数で動かすことが出来るようですね。

まずATmega328Pに関係する部分をブレッドボードに組んでみます。
ATmega328P-PUのピン配列はこのようになっています。(Arduino公式サイトより)

まずこのチップを駆動するための電源の接続です。(5Vで駆動)
7番ピンがVCC・8番ピンがGNDとなっています。
また、20番ピンはAVCC・22番ピンがGNDとなっています。
こちらはアナログ機能用の電源のようです。
それぞれ直結して5Vを供給できるようにブレッドボードの電源ラインに接続します。

ATmega328Pブレッドボード
VCC(7番ピン)/AVCC(20番ピン)電源ライン(+)
GND(8番ピン)/GND(22番ピン)電源ライン(-)

ATmega328Pの詳しいデータシートをご覧になりたい方は、秋月さんのサイトにあったのでこちらを参考にして下さい。

参考 ATmega328P データシート秋月電子通商

少し分かりづらいので、ATmega328Pのピン配列をArduino Unoボードのピンに対応させてみました。

次に必要なのがATmega328Pが動作するためのクロック信号です。
公式サイトの回路図にあるように16MHzの水晶振動子をXTAL1(9番ピン)/XTAL2(10番ピン)に接続し、その両端とGNDとの間に22pFのコンデンサを接続します。

ATmega328Pパーツ
XTAL1(9番ピン)水晶振動子→22pFコンデンサ→GND
XTAL2(10番ピン)水晶振動子→22pFコンデンサ→GND

実際の接続はこのようになります。

ATmega328Pにブートローダーやスケッチが書き込まれていることが大前提となりますが、これでArduinoとして動かすことが出来ます。

次に電源部分です。
付属していた5Vレギュレーター(LM7805)を使う場合はこのように接続します。

ブレッドボードの電源ラインに配置してパスコン(バイパスコンデンサ)を入れて完成です。
安定化電源などをお持ちで5Vの電圧を作ることが出来る場合や乾電池(1.5V×3)でも可能なので、テスト動作だけならその方が簡単です。

付属していたATmega328Pは何も入っていない素のチップでこのあとブートローダーの書き込み作業が必要となるため、今回この5Vレギュレーターは使わないことにしました。

ブートローダーの書き込み

基本的な回路を組むことが出来ました。
これでハードウェア的にはArduinoとして動かすことが出来るのですが、ATmega328Pチップにスケッチを書き込む必要があります。
また付属していたATmega328Pは素のチップのため、スケッチの書き込みにはブートローダーを先に書き込んでおく必要があります。

まずはブートローダーの書き込み作業をやっていきます。
ブートローダーの書き込みにはライタ(書き込み装置)と呼ばれる専用のハードが必要となってきますが、Arduinoボードを1台用意しこれをライタとして使い書き込むことが出来ます。

ブートローダーの書き込み作業に関してはこちらの記事も参考にして下さい。

【Arduino】ブートローダーの修復(書き換え)でArduinoボードが復活する場合があります!【壊れたArduinoの修復 その①】

①Arduino Unoをライタとして機能させるための準備

ブートローダーが書き込まれていないマイコンではスケッチの書き込みができないため、Arduinoを使い(今回Unoを使いました)ブートローダー書き込み用ライタとして機能させます。

まずライタ用のプログラムをArduino Unoに書き込んでおきます。
[ファイル]→[スケッチ例]→[11.ArduinoISP]からArduino ISPを選択します。

このスケッチを通常の手順でArduino Unoに書き込みます。
これでこのArduino Unoはブートローダーを書き込むためのライタとして機能します。

ブートローダー書き込み用の接続

書き込みが完了したら接続です。
このように接続します。
ブレッドボードに組んだ回路にはArduino Uno側から電源が供給されるように配線しているので、レギュレーターは外しておきました。
また、ATmega328Pのリセットピン(1番ピン)と電源ラインには10kΩの抵抗を使っています。(付属していません)

次にブートローダーの書き込みです。
PCからArduinoボードにプログラムを書き込む場合、通常「AVRISP mkⅡ」という書き込み装置を使っています。
Arduino(今回Unoを使用)を上記のようにライタとして機能するスケッチを書き込んだ場合、「Arduino as ISP」という書き込み装置を選択する事により直接接続したマイコンチップにブートローダーを書き込むことが出来るようになります。

書込装置に「Arduino as ISP」を選択し「ブートローダを書き込む」をクリックするとブートローダーの書き込みが行われます。

MEMO
ここでボード設定として選択しているArduino Unoとは、PCと接続しているArduino Unoではなく書き込み先(ターゲット)となるブレッドボードに接続しているATmega328Pという意味合いとなります。

無事ブートローダーの書き込みが完了すればこのように表示されます。

ブートローダーの書き込みが成功すれば、スケッチを書き込みArduinoとして動かすことが出来ます。

MEMO
ブートローダーの書き込みが完了すれば、書込装置を「AVRISP mkⅡ」に一応戻しておくのをお忘れなく!

動作確認

ブートローダーの書き込みが出来ました。
これでこのATmega328Pチップはスケッチを書き込んであげるとArduinoとして動かすことが出来ます。

しかしブレッドボード上に最低限のパーツのみで組んでいるため確認が難しく、USB-シリアル変換器がないのでスケッチの書き込みを行うことも出来ません。

Arduinoのスケッチを書き込む仕組みを簡単に説明すると、ATmega328PにArduinoブートローダーが書き込まれていることによりUSB-シリアル変換器として機能するATmega16U2からシリアル通信(UART)によってスケッチを書き込むことが出来るようになっています。

今の状態ではブートローダーを書き込んでいるのでスケッチを動かすことは出来ますが、書き込むための装置がありません。

そこでArduino Unoに付いているATmega328Pを外し、今回使っているATmega328Pと交換しスケッチの書き込みを行い動作確認をまずやってみたいと思います。

Arduino Unoに付いているATmega328PはICソケットに付いているので取り外すのは簡単です。

取り外しには、DIP-IC引き抜き工具があれば便利です!

【電子工作】DIP-ICを扱う際に便利な工具のご紹介!『DIP-IC引き抜き工具』『ピンそろった』

Arduino Unoに先程ブートローダーを書き込んだATmega328Pチップを取り付け電源を投入します。
電源投入時またはリセットスイッチが押された時にブートローダーが正常に書き込まれていればビルトインLED(D13の横にあるLED)が1秒ほど素早く点滅します。
普段Arduinoを使っていると見慣れた通常の動作です。
これが確認出来れば問題なくブートローダーが書き込まれ機能しています。

MEMO
ブートローダーが書き込まれていないチップの場合、LEDは点滅せず点灯状態となります!

ブートローダーが正常に書き込まれていることが確認できれば、あとは通常通りスケッチの書き込みを行うことが出来ます。
Lチカスケッチ(Blink)をテストの為に書き込んでおきます。

書き込みが完了したら先程のブレッドボードに戻します。

テストスケッチ[Blink]ではデジタルピンD13(オンボードLED)に繋いだLEDが点灯します。
ATmega328Pチップでは19番ピンがそれにあたります。

LEDを19番ピンに電流制限抵抗(330Ωほど)を1本挟んで接続します。
電源(5V)投入で無事LEDが点滅すれば成功です。

ATmega328P単体でスケッチを動かすことが出来ましたね!
ちょっと感動です!

リセットボタンの実装

次にリセットボタンを付けてみます。

ATmega328Pの1番ピンはリセット端子となっています。
この端子をGNDと接続する事によりリセットをかけることが出来ます。

VCCとリセットピンの間に10kΩの抵抗とタクトスイッチを接続しプルアップさせ、もう一方をGNDに接続します。
これでタクトスイッチが押されるとリセットピンがGNDレベルに落ちリセットする事ができます。

プルアップ・プルダウンに関してはこちらの記事を参考にして下さい!

【Arduino入門編⑤】プルアップ・プルダウンって何?デジタル入力の解説です!

これでタクトスイッチを押すとATmega328Pがリセットされ、スケッチが再度実行されるようになります。
通常のArduinoボードと同じですね。

スケッチを書き込む

スケッチが書き込まれたATmega328Pを使い、それ単体でArduinoとして動作させることが出来ました。
ブレッドボードで組んでみましたが、Arduino Unoと比べるとパーツ点数も少なく非常にシンプルですがArduinoとしてちゃんと動いてくれました。

次にスケッチを書き込んでみたいと思います。
スケッチの書き込みにはUSB-シリアル変換器が必要となってきます。
Arduino Unoではボード上に搭載されたATmega16U2というマイコンチップがそれを担当しています。

今回ブレッドボード上に組んだ回路に外部からUSB-シリアル変換器を繋げればスケッチの書き込みを行うことが出来るのですが、手元にあったUSB-シリアル変換モジュールにはDTR端子がなく手動でリセットする必要があるようです。
これがなかなか上手くいかず・・・別の方法でスケッチの書き込みをやってみました。

先程ブートローダーを書き込むためにライタとして使ったArduino Unoを経由してスケッチの書き込みを行ってみます。
シンプルな書き込み方法ではありませんが、先程のようにチップを抜きArduino Unoに差し込んで書き換えを行うよりは現実的です。

先程ライタとして使ったArduino Unoには[ArduinoISP]というスケッチが書き込まれています。
そして接続もブートローダーを書き換えた時と同じように接続します。
こんな感じですね!

そして[ボード]を「Arduino Uno」、そして[書込装置]も同様に[Arduino as ISP]に設定しておきます。

そして書き込みたいスケッチを用意します。
先ほどと同じ[Blink]を使いますね。
違いが分かりやすいように点滅の間隔を50msに変更しておきました。

そしてスケッチの書き込みを行いますが、通常書き込む際の[マイコンボードに書き込む]ではなく[書込装置を使って書き込む]を選択する事により、Arduino Unoに接続されたブレッドボード上のATmega328Pにスケッチを書き込むことが出来ます。

スケッチが問題なく書き込まれていればLEDの点滅間隔が短くなっていると思います。

【追記】USB-シリアル変換モジュールを使ってスケッチの書き込みを行う!

上記のArduinoボード経由でのスケッチ書き込みはあまりスマートな方法ではなかったので、手元にあった2つのUSB-シリアル変換モジュールを使いスケッチの書き込みを行ってみました。

リセットのタイミングが上手く合わず手こずったため本記事ではご紹介できませんでしたが、上手くスケッチの書き込みを行えるようになったのでこちらも参考にして下さい!

【Arduino】ATmega328P単体でスケッチを動かしてみる!その② USB-シリアル変換モジュールを使ってスケッチを書き込む!

【追記】ピンマッピングシールを買ってみました!

ATmega328Pのピン配列が分かりにくかったので、秋月電子さんでラベルシールを買ってきました。

ブレッドボード上に組んで動かす場合、これはあると非常に便利ですね!

最後に!

ATmega328Pを単体でArduinoとして動かすことが出来ました。
今回、Arduino Unoの回路図を見ながらブレッドボードで組んで動かしてみましたが、普段使っているArduinoボードについていろいろと理解が深まりました。

Arduinoを使い始めた頃は配線ミスなどによりATmega328Pを破損させたことが何度かあります。
Arduino Uno Rev3(通常版)ではDIP-IC形状でICソケットに付けられているので、今回のように簡単に取り外し交換することが出来るのでその予備チップとしてもいいですね!

ブートローダーを書き込むための専用装置やシールドなど販売されていますが頻繁に行う作業ではないので、このようなパーツが手元にあるとブレッドボードで組んで作業することも出来るのでいいかと思います。

コメントを残す