Arduinoを内部クロック(8MHz)で動かす

概略

最小構成(発振子など一切なし)でArduinoを使いたかったので内部クロック(8MHz)ブートローダの書き込みをやってみました.ネット上には古い情報が出回っており,公式の方法は簡単にできるわりに情報が少なかった(2020/11/24現在)ので備忘録として記録します.

準備物

手順

①hardware configurationのダウンロードと配置

From Arduino to a Microcontroller on a Breadboardのbreadboard-1-6-x.zipをダウンロード&解凍します.
キャプチャ1

スケッチブックフォルダ(デフォルトだと"ドキュメント"→"Arduino")に"hardware"という名前のフォルダを作り,解凍された"breadboard"フォルダを入れます.
キャプチャ2

ここで,もし電源電圧を3.3Vないしもっと低い電圧でマイコンを動かしたいなら,ヒューズビッツの設定を書き換える必要があります.注意点として,ビットを書き込んだ場合は論理レベルが"0"になるという点があります.つまり,0を書き込むと論理レベルは"1",1を書き込むと論理レベルは"0"になります.逆になっています.
キャプチャ11

AVRにはBrown-Out Detection (BOD)と呼ばれる機能がついており,一定の電源電圧を下回るとリセットがかかります.このBODを作動させる閾値電圧はヒューズビッツのExtended Fuse Byteによって設定されます.
キャプチャ12

具体的なビットの組み合わせは,以下のようになっています.なお,古いデータシートを参照すると110がReservedになっていません.また,BOD disabledにすると,電圧降下によるリセットが行われなくなり,つまり作動する最低電圧(2.7V(古いデータシートだと1.8V))までマイコンが動くようになります.
キャプチャ13

具体的な設定方法は,スケッチブックフォルダ→"hardware"→"breadboard"→"avr"→"boards.txt"を開き,
atmega328bb.bootloader.extended_fuses=0x05
の"0x05"部分を任意の値に変更すればOKです.例えば2.7V(Typ)でBODを作動させるには,表から"101"→(ビットを反転)→"010"→(16進数に変換)→"0x02"となります.ブートローダを書き込んだ後にヒューズビッツを変更したい場合は,ブートローダを再書き込みすれば大丈夫です.

②Arduino Uno R3をブートローダ書き込み機にする

"ファイル"→"スケッチの例"→"11.ArduinoISP"→"ArduinoISP"を選択しスケッチを開き,ボードをUnoとCOMポートを設定し,Unoに書き込みます.
キャプチャ3

キャプチャ4

Warningが出ますが大丈夫です.
キャプチャ5

③ブートローダ書き込み機になったArduino Uno R3からATmega328P-PUへ書き込み

"ツール"→"ボード"→"breadboard-avr(in sketchbook)"→"ATmega328 on a breadboard (8 MHz internal clock)"を選択し,"ツール"→"書込装置"→"Arduino as ISP"を選択します."ArduinoISP"ではないので注意です.また,ボードの選択を誤ると,別のブートローダが書き込まれるので注意しましょう.
キャプチャ6

キャプチャ7

図のように配線し(電源は上下に2ヶ所入れなくても(内部で通電しているので)片方だけでOK),
イメージ1

"ツール"→"ブートローダを書き込む"をクリックします.
キャプチャ8

"ブートローダの書き込みが完了しました。"のメッセージが出れば成功です.Warningが出ますが無視でOKです.
キャプチャ9

④8MHz Arduino Uno R3へ書き込みテスト

ライタとして使ったUnoのマイコン部を外し,図のように配線します.これは,ArduinoボードをUSB⇔UART変換に使っているのです.市販のUSB⇔UART変換モジュール(DTR端子付き)でも大丈夫です.ただし,0.1uのコンデンサをDTR-RESET端子間にはさみ,RESETを10kでプルアップしなければなりません.
イメージ2

"ファイル"→"スケッチの例"→"Basics"→"Blink"を選択し,"ツール"→"ボード"→"breadboard-avr(in sketchbook)"→"ATmega328 on a breadboard (8 MHz internal clock)"を選択し書き込みます.これまたWarningが出ますが大丈夫です.
キャプチャ10

⑤Blinkのテスト

ATmega328P-PUの19番ピン(Arduinoの13番ピン相当)を,マイコンを外したボードの13番ピンに接続すると,LEDの点滅が確認できます.
m1.mp4
ピンアサインは以下の通りになっています.
イメージ3

⑥おまけ ATmega328P-AU(表面実装品)の場合

①~③までの手順は変わらないですが,ATmega328P-AU(表面実装品)に配線できる環境がないのでaitendoのQFPでいいのを使ってブートローダ書き込み+8MHz駆動でBlinkを試してみました.ポイントとしては,キットに付属する水晶発振子と22pFコンデンサx2を実装しないでおくことです.スケッチの書き込みには,同じくaitendoのUSB-UART変換モジュール(M2102P6D8UAM)を使いました.13番ピンの青色LEDが異常に明るいので電流量を計算してみましたが,おおむね5mAと大丈夫な範囲でした.
m2.mp4

注意事項

環境

参考資料