ATmega328PとATmega328PBの違い

UNO-ATmega328

ArduinoUNOに使用されているCPUであるATmega328Pにはパッケージなどによっていくつかの種類が存在します。ここでは代表的なパッケージをご紹介します。

ATmega328Pの基本的な仕様

  1. クロック速度
    ATmega328Pは内部または外部のクロックソースを使用して動作し、最大20MHzまでのクロック速度に対応しています。Arduino Unoなどの一部の開発ボードでは、16MHzの外部クリスタルを使用しています。
  2. 動作電圧
    ATmega328Pは、1.8Vから5.5Vまでの電源電圧で動作するように設計されています。これにより、様々な電源環境での使用が可能になります。
  3. メモリ
    すべてのATmega328Pチップには、32KBのフラッシュメモリ、2KBのSRAM、1KBのEEPROMが搭載されています。これは、中規模のプロジェクトに適した容量です。

これらの仕様以外にも、ATmega328Pは、複数の内部および外部割り込み、多数のPWMチャネル、ADC(アナログ・デジタル・コンバーター)、I2C、SPI、UARTなどの豊富な周辺機能を備えています。これにより、センサーの読み取り、モーターの制御、通信機能の実装など、幅広いアプリケーションでの使用が可能になります。

代表的な型式

ATmega328P-AU

TQFP(Thin Quad Flat Package)32ピンパッケージのバージョンで、主に表面実装用に設計されています。

主要な特徴

  • CPU速度: 最大20MHzで、複雑なタスクを処理するための強力な処理能力を提供します。
  • メモリ: 32KBのISPフラッシュメモリ、1KBのEEPROM、および2KBのSRAMを備えており、大量のコードとデータの保存が可能です。
  • I/Oポート: デジタル入出力ピンが23個あり、多くのセンサーやアクチュエータとの接続に対応します。
  • アナログ入力: 6チャンネルの10ビットADCが搭載されており、アナログセンサーからの読み取りに利用できます。
  • 通信インターフェース: I2C、SPI、およびUSARTをサポートしており、他のデバイスやマイクロコントローラとの通信が容易になります。
  • PWMチャンネル: 6チャンネルのPWM出力をサポートし、モーターの速度制御やLEDの輝度調整に利用できます。

ATmega328P-AUを使う場合

実装面積が少なくSMTもしやすいパッケージなので、自前のボードを量産で起こす場合によく使うパッケージです。一般の半田ゴテを使用した実装も慣れれば問題なく行うことができるため、量産を見越した試作にも適しています。

ATmega328P-PU

これは、PDIP(Plastic Dual-In-line Package)28ピンパッケージのバージョンで、趣味の電子工作や教育用途で好まれる、ブレッドボードに挿入しやすい形状をしています。

主要な特徴

  • CPU: AVR 8ビットマイクロコントローラとして、高い性能と効率を提供します。
  • クロック速度: 最大20MHzの動作周波数により、迅速な処理が可能です。
  • メモリ: 32KBのフラッシュメモリ、2KBのSRAM、1KBのEEPROMを搭載しており、プログラムとデータストレージに対応します。
  • I/Oポート: デジタル入出力ピンが多数あり、さまざまなセンサーやアクチュエーターを直接制御できます。
  • アナログ入力: 6チャンネルの10ビットADCが内蔵されており、アナログセンサーからのデータ収集に使用できます。
  • 通信インターフェース: UART、SPI、I2Cのサポートにより、他のマイクロコントローラや周辺デバイスとの柔軟な通信が可能です。
  • PWM出力: 複数のPWM出力チャンネルを備え、モーター制御やLEDの調光などに利用できます。
  • パッケージ: PDIP形式であるため、ブレッドボード上での実験やプロトタイプ製作に最適です。

なぜATmega328P-PUを使う場合

PDIPパッケージは、実装面積は大きいものの、電子工作の初心者にとっても扱いやすく、即席のプロトタイプ作成や小規模製造に適しています。ICソケットなどに簡単に装着できるため、万が一CPUを壊しても簡単に取り換えができます。

ATmega328P-MMH

これは、”-MMH”のサフィックスは、この特定のモデルがQFN(Quad-Flat No-leads)32ピンパッケージで提供されることを意味します。この形状は、表面実装技術(SMT)を用いた製造プロセスに適しており、小型の電子機器や積層が密なPCB設計に理想的です。

主要な特徴

  • CPU: 効率的な8ビットAVRマイクロプロセッサコアを搭載。
  • クロック速度: 最大20MHzで、高速な処理が可能。
  • メモリ: 32KBのフラッシュメモリ、2KBのSRAM、1KBのEEPROMを提供し、複雑なプログラムやデータ保存に対応。
  • I/Oポート: 多数のデジタル入出力ピンを持ち、センサーやアクチュエータとの接続に対応。
  • アナログ入力: 6チャンネルの10ビットアナログ-デジタルコンバータ(ADC)を搭載し、アナログ信号のデジタル変換が可能。
  • 通信インターフェース: UART、SPI、I2Cに対応し、多様なデバイスとの通信が実現できます。
  • PWM出力: モーター制御やLED調光などに使用可能な、複数のPWMチャンネルをサポート。
  • パッケージ: QFN32ピンパッケージで、小型でスペースを効率的に使用したいプロジェクトに適しています。

なぜATmega328P-MMHを使う場合

ATmega328P-MMHは、小型で実装面積の小さなボードに適しています。ただし、はんだ面がパーツ下に隠れるため、はんだごてを使った手動実装はほぼ不可能なパーツで表面実装技術を使用してコンパクトなデザインを実現したい場合に使用します。

改良版 ATmega328PBについて

ATmega328PBは同じピン配置で機能が改良された進化版328Pです。その違いを列挙します。

  1. 追加のシリアル通信インターフェース:
    ATmega328P: 1つのUSART(ユニバーサル同期・非同期受信送信機)
    ATmega328PB: 2つのUSARTが利用可能です。これにより、追加のシリアルデバイスを同時に扱うことができ、より複雑な通信要件に対応可能です。
  2. I2Cインターフェースの違い:
    ATmega328P: 単一のI2Cインターフェース
    ATmega328PB: 2つのI2Cインターフェースを搭載。これにより、I2Cデバイスをより多く、または衝突なく接続することが可能になります。
  3. SPI通信ポートの違い:
    ATmega328P: 単一のSPIポート
    ATmega328PB: 2つのSPIポートが利用可能。これにより、複数のSPIデバイスを同時に管理しやすくなります。
  4. タイマーの追加:
    ATmega328P: 3つのタイマー(2つの8ビット、1つの16ビット)
    ATmega328PB: 同じタイマー数だが、機能が強化され、より精密なタイミング管理が可能です。
  5. ピンの互換性:
    ATmega328PB: ATmega328Pとピン互換性がありながらも、一部のピンに新たな機能が追加されています。
  6. その他の機能の強化:
    ATmega328PBには、より多くのPWMチャンネル、追加のアナログコンパレータ、タッチセンシング機能などがあります。
  7. テータシートリンク

新たなピンとしてPE0, PE1, PE2, PE3が追加されています。これらのピンは、特に通信インターフェースや追加の機能を拡張するために重要な役割を果たしています。

PE0 (RXD0/AIN0/PCINT8)

  • 機能: このピンはUSART0の受信(RX)ピンとして機能し、シリアルデータの受信に使用されます。また、アナログ比較入力(AIN0)としても機能し、外部からのアナログ信号を比較する際に使用できます。さらに、ピン変化割り込み(PCINT8)にも対応しており、ピンの状態変化を検出するイベント駆動型プログラムに利用できます。
  • 用途: このピンは主にシリアル通信や特定のセンサーからのアナログ信号の読み取り、イベント駆動型の割り込み処理に適しています。

PE0(RXD0)とPE1(TXD0)を使ってシリアル通信を行う例

// UART通信初期化
void setup() {
  Serial.begin(9600); // ボーレートを9600に設定
}

void loop() {
  if (Serial.available() > 0) {
    char received = Serial.read(); // PE0からデータを受信
    Serial.print("Received: "); // PE1からデータを送信
    Serial.println(received);
  }
}

PE1 (TXD0/AIN1/PCINT9)

  • 機能: PE1はUSART0の送信(TX)ピンとして機能し、シリアルデータの送信に使用されます。同様にAIN1としても機能し、アナログ比較器の二番目の入力として使用することができます。ピン変化割り込み(PCINT9)もサポートされています。
  • 用途: このピンはシリアル通信でのデータ送信、アナログ比較、ピンの状態変化に基づくプログラミングに使用されます。

アナログ比較のサンプルプログラム(PE0, PE1)

void setup() {
  pinMode(PE0, INPUT);
  pinMode(PE1, INPUT);
  Serial.begin(9600);
}

void loop() {
  int sensorValue1 = analogRead(PE0); // PE0からアナログ値を読み取る
  int sensorValue2 = analogRead(PE1); // PE1からアナログ値を読み取る
  if (sensorValue1 > sensorValue2) {
    Serial.println("PE0 is higher than PE1");
  } else {
    Serial.println("PE1 is higher or equal to PE0");
  }
  delay(1000);
}

PE2 (XCK0/AIN2/INT2/PCINT10)

  • 機能: PE2は外部クロック(XCK0)として使用されることがあり、USART0の同期通信モードでクロック信号として機能します。また、アナログ入力(AIN2)、外部割り込み(INT2)、ピン変化割り込み(PCINT10)としての機能も備えています。
  • 用途: このピンは、同期シリアル通信、アナログ比較、外部からの割り込み処理などに適しています。

外部割り込みのサンプルプログラム(PE2, PE3)

PE2とPE3を外部割り込み入力として使用し、ボタンプレスでLEDを制御する例です。

#define BUTTON_PIN PE2
#define LED_PIN PE3

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP); // プルアップ抵抗を有効化
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), toggleLED, FALLING); // ボタンプレスで割り込み
}

void toggleLED() {
  static bool ledState = false;
  ledState = !ledState;
  digitalWrite(LED_PIN, ledState);
}

void loop() {
  // メインループでは何もしない
}

PE3 (OC0B/AIN3/INT3/PCINT11)

  • 機能: PE3は、タイマー/カウンター0の比較出力B(OC0B)としてPWM信号の生成に使用されることがあります。さらに、アナログ入力(AIN3)、外部割り込み(INT3)、ピン変化割り込み(PCINT11)の機能も持っています。
  • 用途: PWM出力、アナログ信号比較、外部イベントに基づく割り込み処理など、多目的に利用可能です。

PWM出力のサンプルプログラム(PE3)

PE3を使用してPWM信号を出力し、LEDの明るさを調整する例です。

#define LED_PIN PE3

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  for (int i = 0; i <= 255; i++) {
    analogWrite(LED_PIN, i); // LEDの明るさを徐々に上げる
    delay(10);
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(LED_PIN, i); // LEDの明るさを徐々に下げる
    delay(10);
  }
}

コメント

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