กล่าวถึงภาพรวมของ ESP32-S3

ESP32-S3 เป็นชิปตระกูล MCU/SoC สำหรับงาน IoT ที่รองรับ Wi-Fi 2.4 GHz และ Bluetooth Low Energy และบนโมดูลตระกูล ESP32-S3-WROOM ยังมีการเน้นว่าเหมาะกับงานประมวลผลสัญญาณและงาน neural network ด้วย.
จุดเด่นที่สุดของ ESP32-S3 คือ “ความยืดหยุ่นของขา” เพราะชิปมี GPIO จริง 45 ขา คือ GPIO0–21 และ GPIO26–48 และสามารถ route สัญญาณ peripheral ผ่าน GPIO matrix / IO MUX ไปยังขาได้หลายแบบ ไม่ได้ล็อกตายตัวเหมือน MCU บางรุ่น.
สำหรับงานเสียงแบบ I2S อย่าง INMP441 + MAX98357 ชิป ESP32-S3 มี I2S peripheral 2 ชุด และ I2S มาตรฐานใช้เส้นสัญญาณหลักคือ BCLK, WS และ DIN/DOUT โดย MCLK เป็นสัญญาณเสริมและไม่จำเป็นในทุกกรณี.
บนบอร์ด ESP32-S3-DevKitC-1 ขา I/O ส่วนใหญ่ถูกดึงออกมาที่ header ทั้งสองด้านของบอร์ด ยกเว้นบัส SPI ภายในของ flash และบอร์ดยังมีพอร์ต USB-to-UART สำหรับจ่ายไฟ/แฟลช/สื่อสาร, ปุ่ม Boot, ปุ่ม Reset และ LED RGB ที่ขับด้วย GPIO48.
ภาพรวมของขาสำคัญบนบอร์ดนี้ควรเข้าใจเป็น 4 กลุ่มใหญ่: ขาไฟเลี้ยง, ขา GPIO ทั่วไป, ขา analog/touch, และขาที่มีข้อจำกัดพิเศษ.
ขาไฟเลี้ยงและกราวด์
- 5V ใช้รับไฟเข้าบอร์ด แล้ววงจร LDO บน DevKitC-1 จะแปลงลงเป็น 3.3V ให้ชิป.
- 3V3 คือไฟ 3.3V ของบอร์ด ใช้เลี้ยงอุปกรณ์ภายนอกที่รองรับ 3.3V ได้.
- GND คือกราวด์ร่วม ต้องต่อร่วมกันทุกโมดูลเสมอ. ข้อนี้เป็นหลักการต่อวงจรมาตรฐานสำหรับการใช้งานบอร์ดอิเล็กทรอนิกส์ทั่วไป.
ขาพิเศษที่ควรระวัง
- GPIO0, GPIO3, GPIO45 และ GPIO46 เป็น strapping pins จึงมีผลต่อการบูตของชิป หากต่อวงจรภายนอกผิดระดับตอนเริ่มต้นอาจทำให้บูตไม่ขึ้นหรือเข้าโหมดผิด.
- GPIO19 และ GPIO20 ถูกใช้เป็น USB-JTAG โดยดีฟอลต์ หาก reconfigure ให้เป็น GPIO ปกติ ฟังก์ชัน USB-JTAG จะใช้งานไม่ได้.
- GPIO26–GPIO32 มักใช้กับ SPI flash/PSRAM ภายในและไม่แนะนำให้นำไปใช้งานภายนอกในบอร์ดส่วนใหญ่.
- GPIO33–GPIO37 ไม่แนะนำบนบอร์ดที่ใช้ Octal flash/PSRAM เพราะอาจถูกผูกกับ SPIIO4–SPIIO7 และ SPIDQS ภายใน.
- บางบอร์ดอย่าง ESP32-S3-DevKitC-1 รุ่นที่ใช้โมดูล WROOM-1/1U/2 แบบมี Octal SPI flash/PSRAM จะไม่เปิดให้ใช้ GPIO35, GPIO36 และ GPIO37 ภายนอก.
กลุ่ม GPIO ที่ใช้งานบ่อย
- GPIO1–GPIO10 เป็น ADC1 channels 0–9 และเป็น RTC GPIO ด้วย เหมาะกับงานอ่านค่าอนาล็อก และในเอกสารฮาร์ดแวร์ของ Espressif ยังแนะนำ ADC1 สำหรับงานที่ต้องการความแม่นยำมากกว่า.
- GPIO11–GPIO20 เป็น ADC2 channels 0–9 และเป็น RTC GPIO ด้วย แต่ GPIO19/20 มีข้อจำกัด USB-JTAG ตามด้านบน.
- GPIO21 เป็น GPIO ทั่วไปและเป็น RTC GPIO ด้วย.
- GPIO38–GPIO44 เป็น GPIO ทั่วไปบนชิป และ GPIO48 มักถูกใช้กับ LED บนบอร์ด DevKitC-1.
ถ้าดูแบบ “ทีละช่วงขา” จะเข้าใจง่ายที่สุดดังนี้
- GPIO0: ใช้ได้เป็น GPIO แต่เป็น strapping pin.
- GPIO1–GPIO10: กลุ่ม ADC1.
- GPIO11–GPIO18: กลุ่ม ADC2.
- GPIO19–GPIO20: ADC2 แต่มี USB-JTAG เป็นค่าเริ่มต้น.
- GPIO21: GPIO/RTC GPIO.
- GPIO22–GPIO25: ไม่มีอยู่ในกลุ่ม physical GPIO ของ ESP32-S3. ชิปนี้มี GPIO0–21 และ GPIO26–48 เท่านั้น.
- GPIO26–GPIO32: โดยมากสงวนให้ SPI flash/PSRAM.
- GPIO33–GPIO37: อาจถูกใช้กับ Octal flash/PSRAM ในบางโมดูล.
- GPIO38–GPIO44: GPIO ทั่วไป ใช้กับงานดิจิทัลต่าง ๆ ได้ตามการออกแบบบอร์ด.
- GPIO45–GPIO46: เป็น strapping pins.
- GPIO47–GPIO48: GPIO ทั่วไป โดย GPIO48 มักผูกกับ RGB LED บน DevKitC-1.
ทำความรู้จักกับ INMP441 I2S โมดูลไมโครโฟนรอบทิศทาง
INMP441 เป็นไมโครโฟน MEMS (Micro-Electro-Mechanical Systems) แบบดิจิทัลที่ส่งข้อมูลเสียงออกมาในรูปแบบ I2S (Inter-IC Sound) โดยตรง จึงไม่จำเป็นต้องใช้วงจร ADC ภายนอกเหมือนไมโครโฟน Analog ทั่วไป
Pinout:

- SCK: Serial clock for I2S interface
- WS: Word select for I2S (frame sync)
- L/R: Left/Right channel select (Low = left channel, High = right channel)
- SD: Serial data output
- VCC: Power supply, 1.8V to 3.3V
- GND: Ground
คุณสมบัติเด่น
| รายการ | ค่า |
|---|---|
| ประเภท | MEMS Digital Microphone |
| Interface | I2S |
| Operating Voltage | 1.8V – 3.3V |
| Current Consumption | ~1.4mA |
| Sensitivity | -26 dBFS |
| Frequency Response | 60Hz – 15kHz |
| SNR | 61 dBA |
| Direction | Omnidirectional |
| Output | 24-bit Digital Audio |
MEMS คืออะไร?
MEMS คือไมโครโฟนที่สร้างบนแผ่นซิลิกอนคล้าย IC
ข้อดีคือ
- ขนาดเล็กมาก
- ทนต่อแรงสั่นสะเทือน
- อายุการใช้งานสูง
- สัญญาณรบกวนน้อย
- ไม่ต้องใช้ ADC ภายนอก
หลักการทำงาน
ไมโครโฟนทั่วไป
เสียง
↓
Microphone
↓
Analog Signal
↓
ADC
↓
MCU
INMP441
เสียง
↓
MEMS Sensor
↓
24-bit ADC
↓
I2S Interface
↓
ESP32
จะเห็นว่า ADC อยู่ภายในตัวไมโครโฟนแล้ว
I2S คืออะไร?
I2S ย่อมาจาก
Inter-IC Sound
เป็นมาตรฐานรับส่งข้อมูลเสียงดิจิทัล
ใช้กับ
- Microphone
- DAC
- Amplifier
- Audio Codec
เช่น
- INMP441
- MAX98357
- PCM5102
- ES8388
สรุป Pinout ที่ใช้กับโปรเจ็ค
| INMP441 | ESP32-S3 |
|---|---|
| VDD | 3V3 |
| GND | GND |
| SCK | GPIO4 |
| WS | GPIO5 |
| SD | GPIO6 |
| L/R | GND |
ทำความรู้จักกับ Max98357 I2S Class D 3W Mono Audio Amplifier
MAX98357A เป็นชิปขยายเสียงดิจิทัล (Digital Audio Amplifier) ที่รวม DAC (Digital to Analog Converter) และวงจรขยายเสียง Class D ไว้ในตัวเดียว ทำให้สามารถรับข้อมูลเสียงแบบ I2S จากไมโครคอนโทรลเลอร์ เช่น ESP32-S3 ได้โดยตรง โดยไม่ต้องใช้ DAC ภายนอกเพิ่มเติม.

จุดเด่นของ MAX98357A
จาก Datasheet และข้อมูลผู้ผลิต
| Feature | รายละเอียด |
|---|---|
| Audio Input | I2S Digital Audio |
| Amplifier Type | Class D |
| Output | Mono |
| Supply Voltage | 2.5V–5.5V |
| Output Power | สูงสุด 3.2W |
| Speaker | 4Ω–8Ω |
| Sample Rate | 8kHz–96kHz |
| DAC Resolution | 16/24/32-bit |
| MCLK | ไม่จำเป็น |
| Efficiency | สูงถึง ~90% |
| Protection | Thermal + Over Current |
ตัวอย่างการเชื่อมต่อกับ ESP32-S3
| MAX98357A | ESP32-S3 |
|---|---|
| VIN | 5V |
| GND | GND |
| DIN | GPIO7 |
| BCLK | GPIO4 |
| LRC | GPIO5 |
| SD | 3V3 |
| GAIN | NC |
สำหรับการต่อวงจรทดสอบระบบเสียงชุดเดียว ESP32-S3 + INMP441 + MAX98357 + ลำโพง โดยใช้แนวคิด I2S เดียวกันทั้งรับและส่งเสียง: ESP32-S3 มี I2S peripheral 2 ชุด, ข้อมูลเสียง I2S ใช้สัญญาณหลัก BCLK และ WS/LRCLK ร่วมกับสายข้อมูล, และชิปนี้สามารถ route สัญญาณ peripheral ไปยัง GPIO ได้ยืดหยุ่นผ่าน GPIO matrix.
INMP441 เป็นไมโครโฟน MEMS แบบ digital output ที่ส่งเสียงออกทาง I2S โดยตรง เป็นอุปกรณ์ 24-bit I2S, ใช้ไฟ 1.8–3.3V, และขา L/R ใช้เลือกว่าจะให้ไมค์ส่งข้อมูลในช่องซ้ายหรือขวา. MAX98357A เป็นแอมป์ Class D ที่รับสัญญาณเสียงแบบ I2S/PCM, รองรับข้อมูล 16/24/32-bit, ไม่ต้องใช้ external MCLK, และใช้ไฟเลี้ยง 2.5–5.5V; เอาต์พุตลำโพงต่อระหว่าง OUTP และ OUTN แบบ bridge ไม่ใช่ต่อกราวด์.
สำหรับโปรเจ็คนี้ แนะนำใช้ GPIO4, GPIO5, GPIO6, GPIO7 เพราะหลีกเลี่ยงขาพิเศษของ ESP32-S3 ได้ดี: GPIO19/20 ถูกใช้เป็น USB-JTAG โดยดีฟอลต์, GPIO45/46 เป็น strapping pins, และ GPIO26–GPIO32 มักผูกกับ flash/PSRAM บนบอร์ดหลายรุ่น.
การต่อวงจรที่แนะนำ
| อุปกรณ์ | ขาโมดูล | ต่อกับ ESP32-S3 |
|---|---|---|
| INMP441 | VDD | 3V3 |
| INMP441 | GND | GND |
| INMP441 | SCK | GPIO4 |
| INMP441 | WS | GPIO5 |
| INMP441 | SD | GPIO6 |
| INMP441 | L/R | GND |
| MAX98357 | VIN | 5V |
| MAX98357 | GND | GND |
| MAX98357 | BCLK | GPIO4 |
| MAX98357 | LRC | GPIO5 |
| MAX98357 | DIN | GPIO7 |
| MAX98357 | SD | 3V3 |
| ลำโพง | + / – | OUTP / OUTN |
เหตุผลของการต่อแบบนี้คือ INMP441 ใช้ I2S serial clock และ word select เหมือนกับ MAX98357A ทำให้แชร์ BCLK/WS ร่วมกันได้ ส่วน data แยกคนละเส้น: INMP441 ส่งเข้าที่ GPIO6 และ ESP32-S3 ส่งออกไป MAX98357 ที่ GPIO7.
โค้ด Arduino สำหรับทดสอบเสียงแบบรับแล้วส่งออกทันที
โค้ดนี้จะรับเสียงจาก INMP441 ผ่าน I2S แล้วส่งต่อไป MAX98357 เพื่อให้ได้ยินที่ลำโพงทันที เหมาะสำหรับตรวจสอบว่าวงจรต่อครบและสัญญาณทำงานถูกต้อง
#include <Arduino.h>
#include "driver/i2s.h"
// =========================
// Pin mapping
// =========================
static const i2s_port_t I2S_PORT = I2S_NUM_0;
static const gpio_num_t PIN_I2S_BCLK = GPIO_NUM_4; // Shared clock
static const gpio_num_t PIN_I2S_WS = GPIO_NUM_5; // Shared LRCLK/WS
static const gpio_num_t PIN_I2S_DIN = GPIO_NUM_6; // INMP441 SD -> ESP32
static const gpio_num_t PIN_I2S_DOUT = GPIO_NUM_7; // ESP32 -> MAX98357 DIN
// =========================
// Audio settings
// =========================
static const int SAMPLE_RATE = 16000; // ชัดสำหรับเสียงพูดและลดภาระ CPU
static const int BUFFER_SAMPLES = 256; // จำนวน sample ต่อรอบ
static const float VOLUME = 0.35f; // ลดเสียงเล็กน้อยกันแตกและกัน feedback
static int32_t rxBuffer[BUFFER_SAMPLES];
static int32_t txBuffer[BUFFER_SAMPLES];
bool checkI2S(esp_err_t err, const char* step) {
if (err != ESP_OK) {
Serial.print(step);
Serial.print(" failed, err = ");
Serial.println((int)err);
return false;
}
return true;
}
void setupI2S() {
i2s_config_t i2s_config = {};
i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX);
i2s_config.sample_rate = SAMPLE_RATE;
i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT;
i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT;
i2s_config.communication_format = I2S_COMM_FORMAT_I2S;
i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1;
i2s_config.dma_buf_count = 8;
i2s_config.dma_buf_len = BUFFER_SAMPLES;
i2s_config.use_apll = false;
i2s_config.tx_desc_auto_clear = true;
i2s_config.fixed_mclk = 0;
i2s_pin_config_t pin_config = {};
pin_config.bck_io_num = PIN_I2S_BCLK;
pin_config.ws_io_num = PIN_I2S_WS;
pin_config.data_out_num = PIN_I2S_DOUT;
pin_config.data_in_num = PIN_I2S_DIN;
pin_config.mck_io_num = I2S_PIN_NO_CHANGE;
if (!checkI2S(i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL), "i2s_driver_install")) {
while (true) delay(1000);
}
if (!checkI2S(i2s_set_pin(I2S_PORT, &pin_config), "i2s_set_pin")) {
while (true) delay(1000);
}
i2s_zero_dma_buffer(I2S_PORT);
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println();
Serial.println("ESP32-S3 + INMP441 + MAX98357 audio loopback test");
Serial.println("Speak into the microphone and listen at the speaker.");
setupI2S();
Serial.println("I2S ready.");
}
void loop() {
size_t bytesRead = 0;
size_t bytesWritten = 0;
esp_err_t err = i2s_read(
I2S_PORT,
rxBuffer,
sizeof(rxBuffer),
&bytesRead,
portMAX_DELAY
);
if (err != ESP_OK || bytesRead == 0) {
return;
}
const size_t samples = bytesRead / sizeof(int32_t);
for (size_t i = 0; i < samples; i++) {
// ลดระดับเสียงเพื่อให้ฟังสบายและลดโอกาส feedback
int64_t s = rxBuffer[i];
s = (int64_t)(s * VOLUME);
txBuffer[i] = (int32_t)s;
}
i2s_write(
I2S_PORT,
txBuffer,
samples * sizeof(int32_t),
&bytesWritten,
portMAX_DELAY
);
static uint32_t lastPrint = 0;
if (millis() - lastPrint >= 1000) {
Serial.print("RX bytes = ");
Serial.print(bytesRead);
Serial.print(" , TX bytes = ");
Serial.println(bytesWritten);
lastPrint = millis();
}
}
อธิบายการทำงานทีละขั้น
บรรทัด I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX ทำให้ ESP32-S3 เป็นตัวสร้างสัญญาณ clock เองและทำงานทั้งรับและส่งในบัสเดียวกัน ซึ่งเหมาะกับงานทดสอบเสียงจากไมค์ไปลำโพงโดยตรง. แนวทางนี้สอดคล้องกับความสามารถของ ESP32-S3 ที่มี I2S peripheral สำหรับ input/output audio data.
บรรทัด I2S_BITS_PER_SAMPLE_32BIT ใช้เพื่อให้รับข้อมูลจาก INMP441 ในเฟรม I2S แบบ 32-bit slot ได้สะดวก แม้ตัวไมโครโฟนจะเป็น 24-bit digital output ก็ตาม. INMP441 เป็นไมค์ 24-bit I2S โดยตรง.
การกำหนด I2S_CHANNEL_FMT_ONLY_LEFT เข้ากับการต่อ L/R ของ INMP441 ที่ผูกลง GND เพื่อให้ไมค์ส่งสัญญาณในช่อง left channel.
ส่วน MAX98357 รับสัญญาณ I2S ได้โดยตรงและไม่ต้องใช้ external MCLK จึงต่อเข้ากับ ESP32-S3 แบบง่าย ๆ ได้ด้วย BCLK, WS และ DIN เท่านั้น. สัญญาณเสียงต้องออกไปที่ลำโพงผ่าน OUTP/OUTN แบบ bridge.
วิธีใช้งาน
- ต่อสายไฟและสายสัญญาณตามตารางด้านบน
- ให้ INMP441 ใช้ 3V3 เท่านั้น
- ให้ MAX98357 ใช้ 5V จะขับลำโพงได้เต็มกว่า
- เปิด Serial Monitor ที่ 115200
- อัปโหลดโปรแกรม
- พูดใกล้ไมโครโฟน แล้วฟังเสียงออกจากลำโพง
จุดที่ต้องระวังมาก
MAX98357 ต้องต่อ speaker ระหว่าง OUTP กับ OUTN เท่านั้น ห้ามเอาขั้วลำโพงไปต่อกราวด์โดยตรง เพราะเอาต์พุตของมันเป็นแบบ bridge.
ถ้าเสียงหอนหรือสะท้อนกลับแรง ให้ลด VOLUME ลงเหลือ 0.20–0.25 และวางลำโพงห่างไมค์ระหว่างทดสอบ เพราะระบบนี้เป็น loopback ตรงจึงมีโอกาสเกิด acoustic feedback ได้ง่าย
ถ้าคอมไพล์บน Arduino core รุ่นใหม่แล้วชื่อ API ของ I2S legacy เปลี่ยน ผมจะปรับโค้ดให้เป็นเวอร์ชัน i2s_std รุ่นใหม่ของ ESP32-S3 ให้ตรงกับบอร์ดที่คุณใช้อยู่
Link: https://www.techmaze.ae/shop/99189039-microphone-inmp441-i2s-omnidirectional-module-18165
https://uelectronics.com/producto/max98357-amplificador-de-audio-mono-i2s-clase-d-3w/?srsltid=AfmBOopWqQQcSIuV3KiF7qHfqRfnoCWQvMtyp8gxNYTt3yTB6Fn3zHl0
