Arduinoを24MHzで動かす ~覚書~

掲載日: / 更新日:
Arduinoを24MHzで動かす ~覚書~

秋月電子のATmega168/328マイコンボードキットを24MHzで動かす方法

まずは、16MHzでArduino化します。

方法は、いろいろな方が説明されているので、そちらをじっくり読めばできると思います。

実は、私は組立後ロクに確認もしないで行ったので、ブートローダーの書き込みは完了するのにスケッチが書き込めなくハマってしまいました。

原因は、ハンダ忘れが2か所も….汗

まぁ、うまくいかないときこそ、基本に立ち返って、ですね。

Arduino化が正常に完了したら、いよいよ24MHzで動作させましょう!

インターネット上に公開されている情報からは、ほぼ30MHzまでは動作するようなので、事前チェックは不要かもしれませんが、まず、16MHzの状態でシリアルコンソール74880bpsで通信できるスケッチを書き込んでおいて、24MHzにして、シリアルコンソールを11520bpsにして期待値どおり表示が出ることを確認します。

Arduino 1.8.5にArduinor Diecimila 24MHz版を追加する。

boards.txtを編集します。

Arduino 1.8.5をインストールした場所(例えばc:\Program Files (x86)\Arduino\hardware\arduino\avr)にもありますが、編集するのは、「ユーザーフォルダー\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.23」にあるファイルです。インストールした場所にあるのはインストール時のオリジナルで、こちらを編集しても反映されません。

反映されない場合は、一度ボードマネージャを立ち上げると反映されると思います。Updateは上書きされる可能性があるので、少なくとも修正部分は控えておくと良いと思います。

「Arduino Duemilanove or Diecimila w/ ATmega328P」の定義を丸ごとコピーして、以下のように編集して差し込みます。

編集の肝は、f_cpu と upload.speed

##############################################################

diecimila24.name=Arduino Diecimila 24

diecimila24.upload.tool=avrdude
diecimila24.upload.protocol=arduino

diecimila24.bootloader.tool=avrdude
diecimila24.bootloader.low_fuses=0xFF
diecimila24.bootloader.unlock_bits=0x3F
diecimila24.bootloader.lock_bits=0x0F

diecimila24.build.f_cpu=24000000L
diecimila24.build.board=AVR_DUEMILANOVE24
diecimila24.build.core=arduino
diecimila24.build.variant=standard

## Arduino Diecimila 24 w/ ATmega328P
## ———————————————-
diecimila24.menu.cpu.atmega328=ATmega328P

diecimila24.menu.cpu.atmega328.upload.maximum_size=30720
diecimila24.menu.cpu.atmega328.upload.maximum_data_size=2048
diecimila24.menu.cpu.atmega328.upload.speed=86400

diecimila24.menu.cpu.atmega328.bootloader.high_fuses=0xDA
diecimila24.menu.cpu.atmega328.bootloader.extended_fuses=0xFD
diecimila24.menu.cpu.atmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex

diecimila24.menu.cpu.atmega328.build.mcu=atmega328p

## Arduino Diecimila 24 w/ ATmega168
## ———————————————
diecimila24.menu.cpu.atmega168=ATmega168

diecimila24.menu.cpu.atmega168.upload.maximum_size=14336
diecimila24.menu.cpu.atmega168.upload.maximum_data_size=1024
diecimila24.menu.cpu.atmega168.upload.speed=28800
diecimila24.menu.cpu.atmega168.bootloader.high_fuses=0xdd
diecimila24.menu.cpu.atmega168.bootloader.extended_fuses=0xF8
diecimila24.menu.cpu.atmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex

diecimila24.menu.cpu.atmega168.build.mcu=atmega168

 

これで、シリアルコンソールや基本的な時間関数などは、正常に動作するようになり、特に24MHz化を気にする必要はなくなります。

ただ、ライブラリーで、CPUクロックf_cpuを考慮していない場合は注意が必要です。

16MHz版に対して1.5倍のSpeedとなりました。

先の記事の10HHz 標準クロックの周波数測定も、これを使えば、直接10MHzを扱えるので同じ精度が4倍のスピードで完了して環境温度等による周波数変動に対する追従特性の大幅な向上が可能となります。

問題点

今回実験に使用したボードは、たまたまリセット時間が長いのか?もしくは168Pだからか?スケッチの書き込みも問題ない様ですが、Arduinoのブートローダーの仕組み上、CPUが高速になるとブートローダーが待ちきれず書き込み済みのスケッチに動作を移すことがあるようです。

先の記事の作成に使用したのと同じ怪しいArduino Pro mini 8MHzで24MHz動作を確認したところまさにこの現象が発生しました。AVR自体は32MHzでもちゃんと動作しているのに20MHz以上のクロックではスケッチが書き込めない事象で、以下の暫定対策で24MHzでも書き込みできることを確認しました。

高速CPUに対応できるブートローダーへ変更が正しい対応と思いますが、暫定回避策としてDTRとリセットの間のコンデンサーの容量を大きくするなど物理t的にリセットパルスを少し長くする(電源オフ時に残留電荷で壊す可能性もありますし、どのくらいか難しいですが...)対策でもなんとかなりそう。。。。最悪、タイミングが難しいが人間リセットも。。。汗。(RXでLEDが光るようになっていればこれが光ったのをみてResetを解除すればよいらしい。)

実際にやってみましたが、コンデンサーを取り付ける方法は有効ですが、壊す可能性もあり、手動リセットはオーバークロックの場合は、タイミングが難しくちょっと無理っぽいので、Arduino側のReset入力のコンデンサーをショート(もしくはパス)して、USB-Serial変換ボード側でDTRをトリガーで負パルスを発生するようにNE555(100uF、100kVR)でワンショット、出力を少しなまらして(TrのBaseとGND間に200Ωと33uF)、Trでひっくり返してArduinoのDTR(Reset)へという専用書き込み器(ジャンパーで通常モードと切替)を作成しました。クロック・個体種別によってパルス幅は調整が必要かもしれませんが、標準のリセットのタイミングより少し遅らせる(なまらせた部分)ことが重要なポイントとなりました。

今のところ100%成功しています。AVRの本来の低消費電力に反しますが、目的によっては、24MHz(簡単な確認では32MHzでも問題ない模様で十分なマージンがあると思って良さそう。)で動作させることもできる準備が出来ました。

クロックアップArduino用書き込みTool

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA