Arduino IDEでAVRマイコンの動作周波数を自在に切り替える方法

ATMega328は5V・16MHz設定のArduinoで使えれば事足りていたのだが、3.3Vで動作させる必要に迫られてATMega328のデーターシートを確認したところ10MHz迄は3.3V動作OKと知った。が、あいにく使えそうな水晶の手持ちは無し。

よくよく調べてみるとATMega328には8MHzのRC発振回路が内蔵されており、ブートローダーを書き換えて内蔵発振回路を使う設定にすればクロック8MHzで3.3V動作も可能と知る。内蔵RC回路を使うことによって、水晶を接続するのに使われる端子(PB6とPB7)がプログラムで利用可能となるメリットもある。

今回は、Arduino IDEでAVRマイコンの動作周波数を自在に切り替える方法についてまとめた。

スポンサーリンク

カスタムArduinoブートローダーについて

AVRマイコンの動作クロック切替にはブートローダーの書き換えが必要だ。ブートローダーはArduino IDEデフォルトの状態でもボードのバリエーションに応じて用意はされているものの細かくは設定は出来ないため、カスタムブートローダーを使う必要がある。

Arduinoでブートローダーのカスタマイズ方法をネットで探ると必ずと言っていいほど登場するOptibootについても軽く触れておこう。OptibootとはArduinoのブートローダーを最適化して限られたメモリ空間を有効活用しようというプロジェクト。

詳しいルーツは不明たが、当初はArduinoとは独立したプロジェクトとして発祥し現在ではArduino本家でも採用され現行品にはOptibootが書き込まれて出荷されているらしい、という事は分かった。

そして現在は本家OptibootからフォークしたOptibootベースのプロジェクトがGitHub上に複数存在しているようだ。

MCUdudeでIDEから動作クロックを切り替える

Optibootフォーク(派生版)の中から、使いやすそうなMCUdudeをチョイスした。

Arduino IDEの中でクロックソースとクロック周波数を選択出来るようにする手順はGitHubのREADMEに記載されている通りだが、以下に簡単にまとめておく。

  1. Arduino IDEのメニューから”ファイル -> 環境設定”を選択し、環境設定ダイアログを開く
  2. 追加ボードマネージャのURLに “https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json” を記入し、ダイアログを閉じる
  3. メニューから”ボード -> ボード -> ボードマネージャ”を開き、ボードマネージャダイアログを開く
  4. 一覧から”MiniCore by MCUdude”を選択してインストールする

上記手順を完了させると、メニューから”ツール -> ボード”で表示されるボードの選択肢に”MiniCore”というタイトルが現れる。そのタイトル下のATMega328を選ぶと、”ツール”メニューが以下のような画面に変わってクロックなどを細かく設定出来るようになる。

クロック周波数を変更すると付随してUARTのタイミング設定等も変更が必要となり、手動でやろうとするとけっこう面倒臭い筈。それをメニューから選ぶだけの簡単操作で出来てしまうのは非常に有り難い。

ブートローダーの書き換え手順

ブートローダーの書き換えには専用のブートローダー書込み装置が必要だが、以前の記事と同様に今回もArduinoISPのスケッチを書き込んだAVRマイコンを書込み装置として使った。過去記事の配線図を再掲すると、以下のようなセットアップになる。MCUdudeのREADMEに書かれた推奨ブートローダー書込み回路と内容的には全く同じだ。

同じAVRマイコンを2つ並べて使うので頭が混乱するのだが、ブートローダーを書き変えてスケッチを書き込むまでの手順は以下の通り。

  1. ArduinoISPのスケッチを書き込んだ片方のAVRマイコン(“AVRマイコンA”とする。上図左側)にUSBシリアルを繋いでPCと接続する
  2. 動作クロックを変更したいAVRマイコン(“AVRマイコンB”とする。上図右側)と”AVRマイコンA”を上図のように接続する(詳細は過去記事を参照)
  3. Arduino IDEの”ツール”メニューで書込み装置として「Arduino as ISP(MiniCore)」を選択し、「ブートローダーを書き込む」を実行する
  4. USBシリアルを”AVRマイコンA”から”AVRマイコンB”に付け替える
  5. Arduino IDEから”AVRマイコンB”にスケッチを書き込む

3.で書込み装置を選ぶ際、装置名の後ろに”(MiniCore)”と書かれた物を選択する事に注意が必要だ。

また、3.の手順でブートローダーを書き込んで以降は、”AVRマイコンB”から水晶を取り外してもOK。再度水晶のクロックソースを選択したブートローダーを書き込まない限り水晶無しで動作するようになる。また水晶を取り外すことで空いたピン(PB6とPB7)はデジタルピンの20,21番としてプログラムで使用可能となる。

MCUdudeには他にも機能up項目が

MCUdudeはクロック設定以外の機能もある。MCUdudeのREADMEから以下に抜粋しておく。

  • 低電圧検出(BOD)
  • リンク時最適化(LTO)
  • printfサポート
  • プログラム実行時のフラッシュ書込み
  • 省電力化のための標準関数群

今回は上記の中でLTOだけは試してみたものの、コードサイズ低下の効果は見られなかった(デフォルトのブートローダーでもLTOが有効になっているような気がする)。

まとめ

今回はArduino IDEにインストールして、IDEからAVRマイコンの動作クロック周波数を自在に変更出来るMCUdudeを試してみた。IDEからの簡単な操作で手軽にクロック設定を変えられるので非常に便利と感じた。

実際にAVRマイコンのクロック設定の変更を試みたが、内蔵RC発振クロック1MHzのパターンではプログラムの書込み自体が失敗してしまった。しかし、2MHz以上ではプログラムの実行速度が遅くなる事以外の実害は無く、クロック精度の面で少々心配があったUARTの通信も問題なく行えた。

クロックが下がることで消費電力も下がり、I/Oポートが2つ追加で使用可能になるのも有り難い。高いクロック精度や大きな処理能力が必要でない限り、内蔵RC発振クロックでAVRマイコンを使うのはアリではないかと思う。

コメント