Atmega328PBをArduinoで使うためのブートローダの書き込み、Mozziの修正
<!-- markdown-mode-on -->
# **概要**
<b>Atmega328PB</b>はAtmega328PAの後継だが、Arduino IDEからブートローダを書き込んで使おうとしても、
"avrdude: Expected signature for ATmega328P is 1E 95 0F"
といったエラーが出て書き込めない。
<b>miniCore</b>というボードマネジャをIDEにインストールして、miniCore のボードを選んで書き込むという手順が必要である。
<b>MozziはAtmega328PBを知らない</b>ようで、スケッチの書き込みでコンパイルエラーとなる。その対応策も書いておく。
<a name="more"></a>
# **本文**
## MiniCore Boards Manager のインストール
<figure class="blogcard b-link"><a aria-label="記事詳細へ(別窓で開く)" href="https://github.com/MCUdude/MiniCore" rel="noopener noreferrer" target="_blank"><div class="blogcard-content"><div class="blogcard-image bi-link"><div class="blogcard-image-wrapper biw-link"><img alt="GitHub - MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB" height="100" loading="lazy" src="https://opengraph.githubassets.com/095e00c95ecc9963a7c6e335befaaf482f721dd7900a592ee4b8db1a0b5b4793/MCUdude/MiniCore" width="100"/></div></div><div class="blogcard-text"><p class="blogcard-title bt-link">GitHub - MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB</p><p class="blogcard-description bd-link">Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB - MCUdude/MiniCore</p></div></div><div class="blogcard-footer bf-link"> <img alt="ファビコン" height="16" loading="lazy" src="https://www.google.com/s2/favicons?domain=https://github.com/MCUdude/MiniCore" width="16"/>github.com</div></a></figure>
このインストール方法には、Arduino IDEバージョン1.8.0以降が必要です。
1. Arduino IDEを開きます。
2. [ファイル] > [環境設定] メニュー項目を開きます。
3. [追加の Boards Manager URL] に次の URL を入力します。
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
4. [ボード > ツール] > [ボード マネージャー] メニュー項目を開きます。
5. プラットフォームインデックスのダウンロードが完了するのを待ちます。
6. MiniCoreエントリが表示されるまで下にスクロールしてクリックします。
7. 「インストール」をクリックします。
8. インストールが完了したら、[ボード マネージャー] ウィンドウを閉じます。
9. Arduino IDEにMiniCoreを設定
## ブートローダの書き込みとスケッチの書き込み
<figure class="blogcard b-link"><a aria-label="記事詳細へ(別窓で開く)" href="https://asukiaaa.blogspot.com/2020/07/atmega328pb-minicore-bootloader-for-uart-uploading.html" rel="noopener noreferrer" target="_blank"><div class="blogcard-content"><div class="blogcard-image bi-link"><div class="blogcard-image-wrapper biw-link"><img alt="ATMega328PBにMiniCoreのブートローダーを書き込み、UART経由でプログラムを書き込んでみた" height="100" loading="lazy" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJYSM5AiOv2wPUYvjwDLdA8zLfOajRxAvijwyloqIWugmPQhOt1tbkmmnxXEUYbJ9b58XGuy5akRLf6pprn06na-OloAYrkViYGmx3VCAAYXPd0LMu4vQV6hmFX-De9JPGYYrZx3Kv4-A/w1200-h630-p-k-no-nu/IMG_20200719_222403.jpg" width="100"/></div></div><div class="blogcard-text"><p class="blogcard-title bt-link">ATMega328PBにMiniCoreのブートローダーを書き込み、UART経由でプログラムを書き込んでみた</p><p class="blogcard-description bd-link">背景 ATmega328PBとは、Arduino Unoなどに使われているATmega328Pというマイコンの後継機です。 ATmega328PBをArduinoフレームワークで開発できるようにしてくれるMiniCoreというプラットフォームでブートローダーを提供してくれています...</p></div></div><div class="blogcard-footer bf-link"> <img alt="ファビコン" height="16" loading="lazy" src="https://www.google.com/s2/favicons?domain=https://asukiaaa.blogspot.com/2020/07/atmega328pb-minicore-bootloader-for-uart-uploading.html" width="16"/>asukiaaa.blogspot.com</div></a></figure>
Arduino as ISPを書き込んだProMicroをPCに接続した状態で、Arduino IDEを下記のような設定にします。
- ボード: (MiniCoreの)ATmega328
- Clock: Extarnal 16MHz (Externalを選ぶ場合は、発振子がD20に繋がっていることを確認してください。)
- Variant: 328PB
- Bootloader: Yes UART0
- シリアルポート: Arduino as ISPを書き込んだProMicroのポート
- 書き込み装置: Arduino as ISP(ATmega32U4)
ProMicroで使われているマイコンがAtmega32U4なので、マイコンが言及されている方を選びます。
## MozziにAtmega328PB を認識させる
<a href="https://forum.arduino.cc/t/compilation-error-between-328p-and-328pb-with-mozzi-library/1230299" target="_blank">ライブラリは 328PB について何も知らないようです。</a>
回避策としては、ライブラリ設定ファイルのPIN定義にAVR_ATmega328PBを追加することが考えられます。<b>Mozzi/config/known_16bit_timers.h</b>
```
// Arduino Uno, Duemilanove, LilyPad, etc
//
#elif defined (__AVR_ATmega168__) || defined (__AVR_ATmega328P__)
#define TIMER1_A_PIN 9
#define TIMER1_B_PIN 10
#define TIMER1_ICP_PIN 8
#define TIMER1_CLK_PIN 5
```
上から3行目を次に変える
```
#elif defined (__AVR_ATmega168__) || defined (__AVR_ATmega328P__) || defined (__AVR_ATmega328PB__)
```
## 関連リンク