ArduinoIDE × ATmega328 × AVR ISP MkII × Arduinoスケッチ

目的

AVRのATMEGA*8シリーズのマイコン(ArduinoUnoに入っているもの)にスケッチを書き込みたいなぁ。
でも環境整えるのとかがめんどくさそうだからAtmelStudioからではなく、ArduinoIDEから書き込みたいなぁ。
どうせなら、ArduinoUnoは外部クロック16MHzだけど、内蔵8MHzのクロックで動作させ部品点数を減らしたい。
結局クリスタルを使わないのなら、書き込むときにすら16MHzのクリスタルを使いたくない。

エディタ マイコン ライター ブートローダの有無 クリスタルの有無
ArduinoIDE ATmega*8シリーズ AVR ISP MkII どちらでも なし

こんなわがままを通すための方法をメモ代わりに残しておきます。

※環境
OS: Windows10
ArduinoIDEバージョン: 1.8.7
ライターにAVR ISP MkII所持: 秋月電子で購入したもの

最初に想像していた障害、分からなかった点

  1. Arduinoのスケッチを利用するにはブートローダを書き込む必要があるのではないか。
  2. ATmega*8のヒューズビットを変更するタイミングを理解していない。
  3. ほんとに外部クリスタルを一度も使わないでArduinoスケッチを書き込めるんだろうか?
  4. ヒューズビットを変更したらプログラム上の設定クロックはどう設定するんだろう
  5. ArduinoIDEからAVR ISP MkIIって使えるのだろうか?

疑問点の回答

Arduinoのスケッチを利用するにはブートローダを書き込む必要があるのではないか。

半分正解で半分不正解でした。
本来の意味でのブートローダを書き込まなくても、ATmegaにはスケッチを書き込むことはできます。
しかし、ArduinoIDEで言う「ブートローダを書き込む」という行為には主に2つの意味があります。
それは、ブートローダの書き込みと同時にヒューズビットの書き換えも行うということです。

Arduinoブートローダの機能は、UARTを介してプログラムを書き込めるようにすることです。
これによって、本来プログラムを書き込むための専用ライター(3000~1万円)の必要性を無くして、プログラマブルArduinoの値段を抑えることができます。
そのため、あらかじめライターを持っている人には必要のない部分ということになります。そして私はAVR ISP MkIIというライターを持っていたため、必要ないということになります。

次にヒューズビットの説明です。
ヒューズビットを変更すると、マイコンの動作周波数を変更したりすることができます。しかしそれは、最悪プログラムを書き込むことができなくなることを意味します。
プログラムの書き込みにも、ライターとマイコンで通信をしているわけで、動作周波数が不適切に変更されるとその通信すら成り立たなくなるというわけです。
そのため、ヒューズビットの書き換えは普通のプログラムを書き換えとは別に用意されており、不用意に変更しないようになっています。

半分正解、半分不正解といいましたがこれは、ブートローダを書き込む必要は無いですが、8MHzで運用するうえでヒューズビットは書き換える必要があるので、結局ArduinoIDEが言う「ブートローダを書き込む」という行為は必要になるということです。

これで疑問点「ATmega*8のヒューズビットを変更するタイミングを理解していない。」も解決です。

ヒューズビットを変更したらプログラム上の設定クロックはどう設定するんだろう

おそらく、通常のスケッチからでは、自分が真に動作している動作周波数を取得することはできません。
なぜならプログラムからヒューズビットの状態を取得することができないからです。
そのため、人が明示的にプログラムで明記しなければなりません。

しかし、ArduinoではF_CPUで動作周波数が定義されています。
これがどうやって定義しているか疑問だったのですが、解決しました。

スケッチのビルドするには、IDEのツール>ボードでは書き込み先(target)を選択しておく必要があります。
ここのボードとして表示されるものの実体は、ブートローダに書き込むhexファイルやヒューズビットの設定などを書き込んだboards.txtが一つのフォルダにまとまったものです。
このboardx.txtのbuild.f_cpuの値をを読みだしてF_CPUを定義しています。
つまり、ボードのArduino/Genuino Unoが指す実体のboards.txtではf_cpu=16000000Fと書かれているはずです。

ほんとに外部クリスタルを一度も使わないでArduinoスケッチを書き込めるんだろうか?

できます。
ATmega*8は工場出荷時の動作周波数は1MHzなので、ブートローダの書き込み速度に対応できるか不安だったのですが、書き込みは問題なく行えました。
書き込み速度のISPクロックは動作周波数の1/4以下にするべきなのですが、ググってもArduinoIDEでのブートローダ書き込み時のISPクロックが出てこなかったので、分からないままです。
できたということはいい感じになってるということですよね!。

Arduino - ArduinoToBreadboard
で紹介されているATmega328をArduino化する方法では、普通にクリスタルを使わない方法を書いているので、きちんと対応していることは分かります。

でもここでは、8 MHz internal clockと書いているので工場出荷時の動作周波数1MHzに対応しているか分からなかったんです。
今考えると、内部の内蔵RCクロックは8MHzで、それを1MHzに落としているので、動作周波数ではなく内部クロックの速度のことを言っているのでしょう。
動作周波数ならたぶんCPU ClockとかCPU Frequencyの書き方でしょうしね。

ArduinoIDEからAVR ISP MkIIって使えるのだろうか?

普通に使う分には問題ありません。
ArduinoIDEの書き込み装置を選択する一覧にもAVR ISP MkIIが用意されています。
しかしAtmel Studioを既にインストールしている人は注意が必要です。
なぜならドライバがAtmel StudioとArduinoIDEで使うものが違い、さらに両方互換性が無く、共存もできないからです。
最悪です。

しかし世の中には便利なものがあるもので、それらを共存させる方法がありました。
AVRISP mkIIでArduinoのスケッチを書き込む | なんでも独り言で紹介されている方法そのままです。
ここから libusb-win32-devel-filter-1.2.6.0.exeをダウンロード、インストールをします。
そしてlinf-wizard.exeからibusb-win32 Inf-Wizardを起動して(普通はインストール完了と同時に起動するはず)、Device Selectionにて、DescriptionがAVRISP mkIIなものを選択してInstallで終わりです。
対応はWindows7までの 32/64ビットと書いてますが、私はWindows10で確認しています。

インストールした後は、ArduinoIDEとかAtmelStudioは再起動してください。

方法

ブートローダを書き込んで8MHz運用

疑問点がいろいろ解決したところで、ようやく方法を記します。
基本的には公式が言ってることそのままでいいです。 Arduino - ArduinoToBreadboard

違う点は、
AVR ISP MkIIを使用することです。
簡単に説明しますと、ICSP接続できるライター(公式ではArduinoISP、私はAVR ISP MkII)をターゲットマイコンと接続します。
breadboard-1-6-x.zipをダウンロードして、ドキュメント/Arduino/hardware/の下に入れて解凍します。
そしてIDEを再起動、
ツール>ボードからATmega328 on a breadboard (8 MHz internal clock)を選択、
ブートローダを書き込む」で終了です。

これだけです。
Arduinoって便利にできていますね。でもいろいろ勉強になりました。

ブートローダを書き込まずに8MHzで運用する

上記の方法では、Arduinoブートローダが書き込まれてしまいます。
それはUARTからスケッチを書き込める反面、起動から1.5秒はスケッチが書き込まれるかどうかの判定のため、スケッチのプログラムの動作までに遅延があるということです。
この1.5秒が大きいか小さいかは使う用途によります。
人によっては致命的な場合もあるでしょう(まあ、私の用途ではどうでもよかったのですが...)。

このメリットとデメリット入れ替えたいひとは、別のボードファイルを使うことで解決できます。
使うものは、こちらのJames Sleemanさんが製作しているものです。
optiboot/README.md at master · sleemanj/optiboot · GitHub

ボードマネージャを使ってインストールします。
IDE>ファイル>環境設定>追加のボードマネージャのURLに
https://raw.githubusercontent.com/sleemanj/optiboot/master/dists/package_gogo_diy_atmega8_series_index.json
を追加します。 そしてボードマネージャから
DIY ATmega8, ATmega48, ATmega88, ATmega168, ATmega328
と検索すれば出てくるものをインストールしましょう。

このボードは、ブートローダは工場出荷時に入っているものと同じにしてありますが、ヒューズビットの等の設定を変えています。
つまり、ブートローダは工場出荷時の状態ですが、動作周波数は内部クロック8MHzに変更することができます。
このファイルの良いところは、設定が細かいところで、内部8MHzだけでなく、内部1MHzや外部20MHzとかも設定できます。
しかも、Arduinoブートローダも書き込むことができますので、公式が出しているシンプルなボードファイルの上位互換です(公式は項目減らしてわかりやすさ重視なのでしょうが)。
項目の説明はこちらを読んでください。
さらに言えば、別のボードファイルでTinyマイコンのものとかも出しているので、超いい感じです。
James Sleemanさんありがとうございます。