ATmega328PB徹底比較:328Pから乗り換えるべき7つの理由と注意点

Programming

最初にざっくり要点

  • ATmega328PBは 328Pと完全ピン互換を保ちつつ、通信×2・PWM×8・ADC×8に強化。
  • Timer3/Timer4の追加で10-bit高解像度PWMがネイティブに使える――LED調光や精密モータ制御が一気に楽!
  • PE0/PE1は元GND/VCCピンがI/O化。旧基板流用派はショート破損リスクに要注意。
  • UART/SPI/I2Cが2ポートずつ。GPS+BLEなど同時接続の配線地獄を一蹴。
  • タッチセンサ16ch内蔵で静電容量スイッチがライブラリ一発。
  • 筆者実測でArduino IDEビルドはそのまま。328P用ソースを9割流用可。
  • パーツ単価は2025年7月時点で約220円差(秋月調べ)。機能差を考えるとコスパ良。

ATmega328PBって何者?――体験談まじえた速習ガイド

「328Pで十分」と思っていた私が、秋月で328PBをカゴに放り込んだのはデュアルUARTに惹かれたから。
実際にLチカから高解像度PWMまで回したところ、「もっと早く乗り換えれば良かった」が正直な感想だ。

[ミニ用語解説]

  • UART:Universal Asynchronous Receiver/Transmitter。非同期シリアル通信の定番。
  • SPI:Serial Peripheral Interface。高速全二重通信。クロック・MOSI・MISO・SSで4線。
  • I2C:Inter-Integrated Circuit。アドレス指定型の2線式バス。
  • PWM:Pulse Width Modulation。デューティ比で平均電圧を制御。
  • ADC:Analog-to-Digital Converter。アナログ電圧を数値化。

328P vs 328PB 基本スペック比較

結論先出し:強化ポイントはほぼI/O系。クロックやメモリは据え置きなのでArduinoスケッチはそのまま動く。

機能 / 特徴 ATmega328P ATmega328PB
ピン数(DIP) 28 32
UART 1 2
SPI 1 2
I2C (TWI) 1 2
PWMチャンネル 6 8
ADCチャネル 6 8
外部割り込み 2 3
タッチセンシング 16 ch QTouch®
プログラマブルゲインAMP ×4

ピン互換を保ちつつ増えた4ピン――配線トラブル回避策

ATmega328PB vs ATmega328P ピン配置比較図
図1:PBの追加ピンはPE0〜PE3。旧基板では空きランドを活用するか要配線見直し。

最大の落とし穴はPE0(旧GND)/PE1(旧VCC)。既存基板にPBを挿すと電源ラインがI/O化するため、DDRE設定を誤ると一瞬で玉砕。「PE0をHighにして燃えた」報告が海外フォーラムでも散見される。

設定チェックリスト

  1. DDRE &= ~(1<<PE0)で必ず入力設定に。
  2. 基板流用の場合はテスタで導通確認。PE0/E1が他ラインと接触していないか。

新タイマー3・4で10bit PWM!――高精度Lチカ実験レポ

Timer3は16bit、Timer4は10bit高解像度。実際にLEDを繋ぎ、下記コードで0→100%フェードを測定したところ、フリッカレスで階調も滑らか。オシロで見るとデューティ変化が細かく階段状にならない。

// Timer4による10bit PWMサンプル
void setup() {
  pinMode(5, OUTPUT);          // OC4B
  TCCR4A = _BV(COM4B1) | _BV(WGM40);
  TCCR4B = _BV(CS40);          // No prescaler
}
void loop() {
  for (int i = 0; i < 1024; i++) { OCR4B = i; delayMicroseconds(500); }
}

落とし穴:PB7のOR/AND動作

Timer3 BとTimer4 BはPD2共有。さらにPB7状態で論理がOR/ANDに切り替わる。PWM出力時はPB7をHIGH固定が吉。

通信インターフェース倍増――デュアルUART/SPI/I2C活用術

試しにUART0でデバッグ、UART1でGPS NMEA、SPI1でEEPROM、SPI0でLCDを同時駆動。割込み優先度を整理すれば遅延ゼロで快適。一枚のマイコンで配線スッキリは大きな正義だ。

// デュアルUART同時送信(9600bps)
void USART0_init() { UBRR0=103; UCSR0B=_BV(RXEN0)|_BV(TXEN0); UCSR0C=_BV(UCSZ01)|_BV(UCSZ00); }
void USART1_init() { UBRR1=103; UCSR1B=_BV(RXEN1)|_BV(TXEN1); UCSR1C=_BV(UCSZ11)|_BV(UCSZ10); }
void setup(){ USART0_init(); USART1_init(); }
void loop(){ UDR0='A'; while(!(UCSR1A&_BV(UDRE1))); UDR1='B'; delay(1000); }

タッチセンシング16chで“タッチパッド自作”が秒で完了

QTouchライブラリを入れ、A0に銅箔テープを貼っただけで静電容量スイッチが即動作。モバイルバッテリ駆動で誤検知ゼロ。Timer割込みと併用する場合は処理順序に注意しよう。

実機ベンチ:ビルド/動作クロックはどう?

  • Arduino IDE 2.3.2でスケッチをビルドすると328Pと平均0.4 s以内の差。ほぼ同等。
  • F_CPUは20 MHz上限。CKDIV8ビットはデフォルトでOFF(8分周なし)。

要は「置き換えてもタイミングが狂わない」ので、既存プロジェクトを安心してPB化できる。

FAQ(よくある質問)

Q1. 328P用ブートローダはPBでそのまま使えますか?

A. 結論:OK。ピン互換&同サイズなので書き込み成功。ただし追加I/Oは未初期化のまま。

Q2. 328PBの追加I2CはArduino Wireライブラリで使えますか?

A. 使えるがWire1と書く必要あり(コアアップデート必須)。

Q3. 高解像度PWMはオシロ無しでも体感できますか?

A. LEDフェードなら肉眼でも階調の滑らかさがわかる。ファン制御では回転ムラが減少。

Q4. 電源ピンがI/Oになったことで消費電流は増えませんか?

A. データシート上は同等。I/Oを入力プルアップ無効にすれば影響なし。

Q5. 費用対効果は? 328P在庫が山ほどあるんだけど……

A. 個人用途なら在庫を使い切ってからでOK。ただ量産や通信周りが肝の案件はPB採用で配線が劇的に楽

あとがき:328PBは「もう一声ほしかった」機能を全部乗せ

長年AVRで遊んできた身として、「あのときUARTがもう1本あれば…」という悔しさをPBは一刀両断してくれた。基板改版コストよりI/O地獄の工数の方が高い――そう痛感したあなたは、次の買い物カゴにPBをそっと忍ばせてみては?

関連記事:Arduino IDE 2.3.2を最速インストール! も合わせてどうぞ。

タイトルとURLをコピーしました