11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

【電子工作】Arduino(ATmega328P)を単体で内部クロック8MHzで動かしてみる!

Arduinoの動作クロックは基本的に5Vロジックで動作クロック16MHzで動いています。

ボードにもよりますがArduino UnoやNanoではATmega328PというAVRマイコンが搭載されていて、上記動作電圧およびクロック周波数で動いています。
一部ボードでは、例えばArduino Pro MiniではUnoやNanoと同じATmega328Pが使われていますが、5V 16MHzで動作するボードと3.3V 8MHzで動作する2タイプのボードがあります。

先日自作Arduino Unoを製作した際にATmega328Pのデータシートを読み込んだのですが、基本的に外部発振器(クリスタル)を使えば動作クロック16MHzで動かすことが出来ますが、ATmega328PにはInternalとして8MHzの内部発振器も搭載されています。

そのためATmega328Pに8MHzで動作するブートローダーを書き込む(ヒューズの書き換え)ことにより、外部発振器を必要とせずチップ単体で動作電圧も3V程度で動かすことが出来ます。

この事はArduinoを使い始めた頃から分かってはいましたが、わざわざ動作クロックを落として使う必要性があるのか・・・?
なんてことでこれまで実際に試すことはなかったのですが、便利に使える場面も多いようですね!

Arduino(ATmega328P)を内部クロック8MHzで動かしてみる!

Arduinoは基本的に5Vロジックで動作しクロック周波数は16MHzで動いています。

Arduino Unoを例に見てみると、UNOのボードにはATmega328Pチップの外部クロック用端子(XTAL1/XTAL2)に16MHzのクリスタル(発振器)と22pFのコンデンサが繋がれています。

こんな感じの接続です。

これで外部クロックによる16MHzでArduinoは動作しているわけですが、ATmega328Pチップには内部発振器として8MHzのオシレータ(オンチップオシレータ)が内蔵されています。

8MHzで動作するブートローダーを書き込みヒューズを書き換えることにより、外部に接続したクリスタル等のパーツは必要なくなりATmega328Pチップ単体で動作させることも出来ます。

また8MHzの動作では3V程度の電圧での駆動も可能となります。

ATmega328Pの動作電圧及びクロック周波数

ATmega328Pの動作周波数は電圧に依存します。
下図にあるようにATmega328Pを外部発振器を使い16MHzでArduinoとして通常動作させるには最低3.7V以上の駆動電圧が必要となってきます。

動作クロックを落としATmega328Pを8MHzで動作させる場合は3V程度でも十分駆動することが出来るようになり、電池からの駆動や消費電力を大幅に低減することが出来ます。

参考 ATmega328P running on CR2032 has issues with timing/sleep code as voltage depreciates over timeStack Exchange

とは言っても、私の環境ではあまり必要性がなかったのでこれまで試すことはなかったのですが・・・

ちょうど現在製作している自作基板の制御部分にATmega328Pと同じAVRマイコンとなるATtinyチップを使おうかと考えていたのですが、I/O端子の数やフラッシュメモリの容量などからATmega328Pを8MHzで動作させて使うといった選択肢が出てきました。

ATtinyチップは小型で便利なAVRマイコンですが、ある程度使いたいI/O端子の数が多くなってくるとピン数が多いシリーズのチップを選択する必要があり・・・そうなってくると表面実装タイプのATmega328P-AUを使えばサイズ的にもほぼ変わらずフラッシュメモリも多くなり、またチップの入手性も良くなりそうです。

ATtinyに関してはこちらの記事も参考にして下さい!

【ATtiny】各種ATtinyチップをArduino IDEを使って開発する方法まとめ!ブートローダーやArduinoスケッチの書き込み方法!

そんな事でちょっとした制御部分でそれほど高いクロックを必要としないもので、ATmega328Pを内部クロック8MHzで動かすテストをしてみました。

外部にクリスタルを接続する必要がなくパーツ点数を減らすことができ、用途によっては便利に使えそうです!
ほんとAVRマイコンって便利ですね!

少し前置きが長くなってしまいましたが、ATmega328Pを内部オシレータを使った8MHzで動かしてみたいと思います。

ATmega328Pを内部クロック8MHzで動かす

まずATmega328Pを単体で通常のArduinoのように動かすのは簡単です!(16MHzクロック)

外部に16MHzのクリスタルと22pFのセラミックコンデンサ、あと電源を接続するだけで動作してくれます。

詳しくはこちらの記事を参考にして下さい。

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

そして今回は外部発振器を使わず、ATmega328Pチップ単体で8MHzの内部クロックで動かしてみます。
接続は上記クリスタルとコンデンサが必要なくなるので、ATmega328Pに電源を接続しただけのシンプルな形で動作させることが出来ます。

今回テストしやすいようにDIP形状のATmega328Pチップを使います。
生のATmega328Pチップや既に8MHzで動作するブートローダーが書き込まれているチップを使う場合は上記接続で問題ありません!

MEMO
Arduino UnoからATmega328Pチップを取り外してテストするなど既に外部クロック(16MHz)で動作するブートローダーが書き込まれているチップを使う場合は、内部クロック8MHzで動作するブートローダーを書き込む際に上記16MHzのクリスタルとコンデンサを接続しておく必要があります!

ボードパッケージのインストール

ATmega328Pを内部クロック8MHzで動かすためのハードウェア構成は現在のArduino IDEには標準で搭載されていないようです。
Ardiuno公式サイトにあるbreadboard-1-6-x.zipをダウンロードして使います。

参考 From Arduino to a Microcontroller on a BreadboardArduino

Arduino IDEの[ファイル]→[環境設定]で設定しているArduinoフォルダ内に[hardware]フォルダを新規で作成し、このフォルダ内にダウンロード&解凍した[breadboard]フォルダを移動します。

[Arduino]フォルダ ー [hardware] ー [breadboard]

Arduino IDEを再起動して[ツール]→[ボード]の中に[breadboard-avr]という項目が追加されていればボードパッケージの導入の完了です!

書き込み装置の準備(Arduinoを使用)

ATmega328Pへのブートローダーやスケッチの書き込みにはAVRライタが必要となってきます。
USBaspなどのライタがあれば便利ですが、Arduinoを書き込み装置として使うことも出来ます。

【電子工作】Arduino(AVRマイコン)のブートローダー書き込みにUSBaspを使ってみる!

こちらではArduino Unoを書き込み装置として使う方法で進めていきます。

Arduinoを書き込み装置(AVRライタ)として使うにはArduinoISPを使います。
Arduinoを使った書き込みではおなじみですね!

Arduino IDEの[ファイル]→[スケッチ例]→[11.ArduinoISP]からArduinoISPを開きます。

このスケッチを書き込み装置として使うArduino(こちらではArduino Unoを使いました)に書き込みます。
これでAVRライタの完成です!

ATmega328Pとの接続

書き込み装置として機能するArduinoが出来たので、ATmega328Pとの接続です。
ICSP(MOSI/MISO/SCK/RESET)での書き込みとなるので対応する端子同士を接続するだけです。

ちなみにATmega328Pのピン配列及び書き込みで使用する端子はこちらです。

書込み装置として機能するArduino Unoとの接続です。

Arduino UnoATmega328P
5V(or 3.3V)VCC(7番ピン)
5V(or 3.3V)AVCC(20番ピン)
GNDGND(8番ピン)
GNDGND(22番ピン)
D10RESET(1番ピン)
D11MOSI(17番ピン)
D12MISO(18番ピン)
D13SCK(19番ピン)
MEMO
ATmega328Pに外部16MHzで動作するブートローダーが既に書き込まれている場合は、外部クリスタルとコンデンサの接続が必要となります!(上記図を参考に取り付けて下さい)

ブートローダーの書き込み(ヒューズビットの書き換え)

接続ができたらブートローダーの書き込みです。

ArduinoISPスケッチを書き込んだArduino Unoを経由して書き込みを行うので、[ポート]はArduino Unoのシリアルポートを選択し、[書き込み装置]をArduino as ISPに変更しておきます。

そして書き込む対象は、[ボード]設定の[breadboard-avr]にあるATmega328 on a breadboard(8MHz internal clock)を選択します。

この設定で[ブートローダーを書き込む]をクリックしてブートローダーの書き込みを行います。

これで内部クロック8MHzで動作するATmega328Pの完成です!

スケッチ書き込み① ICSPでの書き込み

最後にスケッチの書き込みです。
簡単にLチカスケッチを書き込んで動作確認してみます。

まずICSPでの書込みを行ってみます。
接続は先程のブートローダーを書き込んだ時と同じで、ATmega328Pの19番ピンにテスト用のLEDを追加接続しました。

ちなみにATmega328PのピンアウトをArduinoに対応させるとこのようになります。

書き込みの際の設定はブートローダーを書き込んだ時と同じです。

ボード: ATmega328 on a breadboard(8MHz internal clock)
書込装置: Arduino as ISP

書き込み装置として機能するArduinoを経由して書き込むので、スケッチの書き込みには通常の[アップロード]からではなく、[スケッチ]→[書込装置を使って書き込む]から書き込みを行います。

ATmega328Pの19番ピン(ArduinoのD13)に接続したLEDが1秒間隔で点滅すれば成功です!

スケッチ書き込み② シリアルでの書き込み

上記ICSPでの書き込みで問題ないのですが、用途によっては通常のArduinoボードのようにUSB端子からのシリアルで書き込みを行いたい場合もあります。
UARTのTX/RXラインを使った書き込みですね!

上記ICSPでの書き込みでは、ATmega328Pに既に書き込まれているブートローダーに上書きする形でスケッチが書き込まれます。
ATmega328Pを単体で動かす場合特に問題はありませんが、ブートローダーが消されてしまうのでUART(TX/RX)ラインからの書き込みは出来なくなってしまいます。

USB-シリアル変換モジュールを接続して書き込みを行いたい場合ではブートローダーが必要となってきます。
上記ICSPでのスケッチ書き込みを行った場合、同様の手順でもう一度ブートローダーを書き込めば問題ありません。

そしてUSB-シリアル変換モジュールを接続してスケッチ書き込みを行う場合の接続です。
USB-シリアル変換モジュールはFT232RLを使ったモジュールを例に行ってみます。

TX-RX/RX-TXという通常のシリアルでの接続となりますが、リセットをかけるためのDTR-RESET間には0.1μFのコンデンサが必要となります。

【Arduino】USB-シリアル変換モジュール(USB-TTLコンバータ)からArduinoにスケッチを書き込む方法!

USB-シリアル変換モジュールATmega328P
VCCVCC(7番ピン)
VCCAVCC(20番ピン)
GNDGND(8番ピン)
GNDGND(22番ピン)
TXRX(2番ピン)
RXTX(3番ピン)
DTR– 0.1μFコンデンサ – RESET(1番ピン)

シリアルポートを選択し、通常の[アップロード]ボタンをクリックしてスケッチの書き込みが行なえます。

最後に!

ATmega328Pを内部クロック8MHzで動かしてみました。

動作クロックは遅くなりますが3V程度の電圧でも駆動することが出来るので、ボタン電池やリチウムイオン電池、またリポバッテリーなどから動かすことも出来ます。

自作基板の製作など用途によっては便利に使える場面は多いと思います。
何かの参考になればと思います!

コメントを残す