Arduino UNO Q ทำ Hi-Fi Streamer แบบ Bit-Perfect ด้วย PCM5102A

คำว่า “Bit-Perfect” ในวงการ Audio พูดกันง่าย แต่โปรเจกต์นี้เลือกพิสูจน์ด้วยข้อมูล: PCM ทุก Byte ที่ออกจาก Linux ต้องตรงกับ Byte ที่ STM32 ส่งเข้า SAI/I2S ก่อนถึง PCM5102A DAC

Pure-Path Audio Bridge เปลี่ยน Arduino UNO Q ให้เป็น Network Audio Streamer ที่รับ Spotify Connect, UPnP/DLNA และ Local FLAC/WAV จากฝั่ง Linux แล้วส่ง Audio ผ่าน Custom Zephyr Firmware บน STM32U585 ไปยัง DAC ภายนอก

จุดพิเศษคือมีสองโหมด: Pure สำหรับส่ง PCM โดยไม่เปลี่ยน Sample และ Enhanced ที่เพิ่ม EQ, Custom 5-band EQ และ Auto Mode ซึ่งให้ YAMNet ฟังสำเนาของ Audio แล้วเลือก EQ Preset ให้อัตโนมัติ

Bit-perfect ในบทความนี้หมายถึง Digital PCM Transport ที่ Creator ตรวจด้วย CRC: ไม่ได้หมายความว่า Analog Output หลัง DAC ถูกพิสูจน์ว่าเหมือนต้นฉบับแบบ Byte-for-byte และไม่ได้ทำให้ Source แบบ Lossy เช่น Spotify กลายเป็น Lossless

Pure-Path Audio Bridge บน Arduino UNO Q
Pure-Path Audio Bridge: Network Audio Streamer บน Arduino UNO Q ที่แยกงาน Network Audio กับ I2S Output ระหว่าง Linux และ STM32

Key Takeaways

  • Linux บน QRB2210 รับ Spotify Connect, UPnP/DLNA และ Local Audio
  • STM32U585 รัน Custom Zephyr Firmware เพื่อรับ PCM แล้วส่งออกผ่าน SAI2/I2S
  • DAC ที่ใช้คือ PCM5102A / GY-PCM5102
  • Audio Format ปัจจุบันล็อกที่ signed 16-bit little endian, stereo, 44.1 kHz
  • Stock Arduino Bridge 115,200 baud ช้าเกินสำหรับ PCM 16/44.1 stereo
  • Creator วัด 2 Mbaud ได้ 161 kB/s, 3 Mbaud ได้ 222 kB/s และ 4 Mbaud เกิด RX overflow
  • Current Build เลือก LPUART1 ที่ 3 Mbaud พร้อม RTS/CTS และ DMA
  • Creator ใช้ CRC-32 ทั้ง Sender และ STM32 เพื่อพิสูจน์ว่า PCM Byte ตรงกันใน Pure Path
  • Long Run 105,840,128 bytes รายงาน CRC MATCH
  • Pure Mode ไม่ปรับ Sample ส่วน Enhanced Mode ใช้ DSP ปรับเสียงจริง
  • YAMNet ไม่แตะ Main Audio Path โดยตรง แต่ใช้เลือก EQ Preset
  • Current YAMNet Interval ใน Code = 2 วินาที
  • Custom EQ มี 5 Bands: 60 / 250 / 1k / 4k / 12k Hz
  • Software Volume ต้องอยู่ที่ 100% หากต้องการให้ CRC Match กับ Reference
  • Source ทั้ง Spotify / MPD / upmpdcli แชร์ audio.fifo เดียวกัน จึงควรเล่นทีละ Source
  • Current Firmware มี Known Ring-buffer Bug ที่อาจทำให้ CRC Test รอบถัดไป MISMATCH ถ้ามี PCM เก่าค้าง
  • Project ยังเป็น Work in progress และ Feature อย่าง 24-bit, UAC2, PCM5122 hardware volume ยังอยู่ใน Future Work

Pure-Path Audio Bridge คืออะไร?

แนวคิดคือเอาความสามารถ สองฝั่งของ UNO Q มาแบ่งงานกันอย่างชัดเจน

ฝั่ง หน้าที่ใน Project
QRB2210 / Debian Spotify Connect, UPnP/DLNA, MPD, Python DSP, YAMNet, Web UI
STM32U585 รับ PCM ผ่าน LPUART1, Buffer, SAI2/I2S Master, CRC, LED Matrix
PCM5102A รับ I2S แล้วแปลงเป็น Analog Line Output

Project รองรับ Source ที่ Creator ระบุ เช่น:

  • Spotify Connect
  • UPnP / DLNA
  • Local FLAC / WAV ผ่าน MPD

มุมที่น่าสนใจ: UNO Q ไม่ได้ใช้ Linux ทำทุกอย่าง แต่ให้ Linux ดูแล Network / Application และให้ STM32 ดูแล Timing-sensitive Audio Output

Hardware มีอะไรบ้าง?

Hardware build ของ Pure-Path Audio Bridge
Hardware Build ของ Pure-Path Audio Bridge จาก Project ต้นฉบับ

BOM ของ Creator ระบุ:

  • Arduino UNO Q × 1
  • GY-PCM5102 / PCM5102A I2S DAC × 1
  • Jumper Wire 6 เส้น
  • Breadboard แบบ Optional สำหรับยึด Module
  • USB-C Cable + 5V Supply
  • Headphone Amp หรือ Amplifier ที่มี Line Input

Creator ประเมิน DAC Module ไว้ประมาณ: US$5

US$5 คือราคาประเมินของ DAC Module ใน BOM ของผู้สร้าง: ไม่ใช่ราคารวมทั้ง Project, ไม่ใช่ราคา Globalbyte และไม่ใช่ราคาที่รับประกันว่าจะยังเท่าเดิม

Audio เดินทางจาก Spotify ไปถึง DAC อย่างไร?

Block diagram ของ Pure-Path Audio Bridge
Block Diagram ของระบบ: Source ฝั่ง Linux ไหลผ่าน FIFO และ bridge-tx ก่อนส่ง PCM ผ่าน UART ไปยัง STM32 และ PCM5102A
Spotify → librespot
UPnP/DLNA → upmpdcli → MPD
Local FLAC/WAV → MPD
↓
audio.fifo
↓
enhance.py
↓
bridge.fifo
↓
bridge-tx
↓
LPUART1 3 Mbaud
↓
STM32U585 + 64 KB Ring Buffer
↓
SAI2 / I2S
↓
PCM5102A

Audio Format ที่ Current Pipeline ใช้คือ:

s16le / stereo / 44.1 kHz

Current Pipeline ไม่ใช่ Hi-Res Bit-perfect Path: Source ระบุว่า Hi-res File จะถูก MPD / soxr Resample ลงมาเป็น Format 16-bit / 44.1 kHz ก่อนเข้าสู่ Bridge

ทำไม Arduino Bridge เดิมไม่พอ?

Creator เริ่มจาก App Lab ก่อนจะเจอข้อจำกัดเชิง Bandwidth และ Peripheral

16-bit Stereo 44.1 kHz ต้องใช้ข้อมูลเท่าไร?

Source ระบุ Data Rate ที่ต้องส่ง:

176,400 bytes/s หรือประมาณ 176.4 kB/s

แต่ Stock Arduino Bridge ระหว่าง Qualcomm และ STM32 ทำงานที่:

115,200 baud ≈ 11.5 kB/s

จึงช้ากว่า Requirement หลายเท่า

อีกปัญหาคือ SAI2 / DMA

Creator ระบุว่า App Lab Sketch รันบน Precompiled Arduino Loader ที่ Device Tree ถูกกำหนดไว้แล้ว ทำให้ไม่สามารถ Enable SAI2 และ DMA ในรูปแบบที่ Project นี้ต้องการได้

STM32 Side จึงถูกเปลี่ยนเป็น Custom Zephyr Application

นี่เป็นข้อจำกัดใน Architecture / Loader ที่ Creator ใช้กับ Project นี้: ไม่ควรตีความกว้างว่า App Lab ไม่สามารถใช้ SAI ได้ในทุกสถานการณ์หรือทุก Revision

ทำไมจบที่ 3 Mbaud?

Creator ไม่ได้เลือก UART Speed จาก Datasheet อย่างเดียว แต่ทดลอง Bandwidth จริงก่อนล็อกค่า

UART Speed Clean Payload ที่วัดได้ ผล
2 Mbaud 161 kB/s ต่ำกว่า 176.4 kB/s ที่ Audio ต้องใช้
3 Mbaud 222 kB/s ผ่าน และถูกเลือกใช้
4 Mbaud Source ไม่ให้ Clean Payload RX Overflow ใน Current Driver

Current Link ใช้:

  • LPUART1
  • 3 Mbaud
  • RTS / CTS
  • DMA

3 Mbaud มี Headroom ตามการวัดของ Creator: 222 kB/s เทียบกับ Requirement 176.4 kB/s ของ PCM Stream

ทำ 44.1 kHz Clock ให้ตรงได้อย่างไร?

DAC Audio ไม่ได้สนใจแค่ Sample Content แต่ยังต้องมี Clock ที่ตรงด้วย

Source ระบุว่า STM32 HSI 16 MHz ไม่สามารถหารเป็น 44.1 kHz ได้ตรงพอใน Configuration นี้ และ Divider ที่ใกล้ที่สุด ทำให้ Frequency สูงเกินประมาณ 3%

Creator จึงใช้:

PLL2 + Fractional N

PLL2 Clock Values จาก Source
N = 56 + 3670/8192
P = 20

PLL2P = 11,289,599.61 Hz
ideal = 256 × 44,100
      = 11,289,600.00 Hz

error ≈ -0.035 ppm

Creator ยังใช้ 440 Hz Test Tone ตรวจด้วย Tuner App ก่อนเดินหน้าต่อ

Link Protocol, CRC-16 และ 64 KB Ring Buffer

PCM ไม่ได้ถูกส่งเป็น Byte Stream แบบไม่มีโครงสร้าง แต่ถูกแบ่งเป็น Frame

PCM Link Frame
[A5 5A]
[seq u16]
[type u8]
[fmt u8]
[len u16]
[512 bytes PCM]
[CRC-16/CCITT]

STM32 ส่ง STATUS Frame กลับทุก:

100 ms

Status มีข้อมูล เช่น:

  • Ring Fill
  • Underrun
  • Bad Frame
  • Dropped Sequence Number
  • RX Overflow
  • Running PCM CRC-32
  • Consumed Byte Count

Ring Buffer

Current Firmware มี PCM Ring ขนาด:

64 KB

Source ประเมินว่า เทียบได้ประมาณ:

370 ms ของ Audio

Sender ใช้ Ring Fill เป็น Feedback โดย Target อยู่ประมาณ:

50%

และ Source ระบุ P-control ค่า: Kp = 0.6

CRC พิสูจน์ Bit-perfect อย่างไร?

นี่คือ Section ที่สำคัญที่สุดของ Project

ฝั่ง Sender คำนวณ CRC-32 ของ PCM Byte ทุก Byte ที่ส่งออก

ฝั่ง STM32 คำนวณ CRC-32 ของ PCM Byte ที่นำออกจาก Ring แล้วส่งเข้าสู่ SAI DMA

ถ้า:

  • Byte Count เท่ากัน
  • CRC-32 เท่ากัน

Creator ถือว่า Digital Transport Path ชุดนั้นเป็น Byte-exact

Short CRC Test
sent_bytes=5292032
sent_crc32=5c906e27

stm32_consumed=5292032
stm32_crc32=5c906e27

MATCH
10-minute CRC Test
sent_bytes=105840128
sent_crc32=887b40e4

stm32_consumed=105840128
stm32_crc32=887b40e4

MATCH

CRC ไม่ได้วัด Analog Output: สิ่งที่พิสูจน์คือ PCM Data จาก Linux Audio Pipeline ไปถึง Data ที่ STM32 ส่งเข้า SAI/I2S ไม่ได้พิสูจน์ Noise, THD, Jitter ที่ Analog Output หรือคุณภาพ Analog Stage ของ DAC Module

Spotify ยังเป็น Lossy

ตาม Test Environment ที่ Creator รายงานในเดือนกันยายน 2026 Spotify Connect Source ที่ใช้ใน Project เป็น 320 kbps Ogg Vorbis

ดังนั้น:

Lossy Source + Bit-exact PCM Transport ยังเป็น Lossy Source

ส่วน FLAC 16-bit / 44.1 kHz ที่เข้ามาโดยไม่ถูก Software Mixer เปลี่ยนค่า จึงเหมาะกับการทดสอบ Bit-exact Path มากกว่า

Digital Volume ทำไมทำให้ Bit-perfect หาย?

GitHub Operating Notes อธิบายชัดว่า ทั้ง MPD และ librespot สามารถทำ Software Attenuation กับ PCM Samples

นั่นหมายความว่า ถ้า Volume ไม่ใช่ 100%:

  • Audio ยังเล่นได้
  • Sample ยังถูกต้องตามคำสั่ง Volume
  • แต่ Sample ไม่เหมือน Reference เดิม
  • CRC จึงไม่สามารถ Match แบบ Byte-for-byte ได้

ถ้าต้องการพิสูจน์ Bit-exact: Source แนะนำให้ตั้ง MPD และ Spotify/librespot ที่ 100% แล้วปรับระดับเสียงที่ Amplifier หรือ Headphone Amp แทน

นี่ไม่ได้หมายความว่า Digital Volume “ผิด” หรือ “เสียงเสีย” โดยอัตโนมัติ: หมายถึงเพียงว่า Sample ถูกเปลี่ยน จึงไม่ตรงกับนิยาม Byte-exact ที่ Project ใช้สำหรับ CRC Verification

Known Limitations: เล่นทีละ Source และระวัง PCM เก่าค้างใน Ring

1. Source Arbitration ยังไม่มี

librespot, MPD และ upmpdcli เขียนลง audio.fifo ร่วมกัน

Current System ไม่มีตัว Arbitration ที่บังคับว่า Source ไหนมีสิทธิ์เล่น

ถ้า Spotify กับ UPnP เล่นพร้อมกัน Blocks สามารถ Interleave และเกิด Stutter ได้

ใช้งานทีละ Source: Disconnect Spotify ก่อน Cast ผ่าน UPnP และหยุด UPnP ก่อนกลับไปเล่น Spotify

2. Current Firmware ยังไม่ Flush PCM Ring ตอน Stream จบ

Operating Notes บันทึกว่า ถ้า Stream ถูก Interrupt อาจมี PCM จาก Track ก่อนหน้า ค้างอยู่ใน 64 KB Ring

Creator เคยวัด PCM ค้าง:

20,480 bytes หรือประมาณ 31.2% ของ Ring

ผลคือ CRC Test รอบถัดไป อาจขึ้น MISMATCH เพราะ STM32 Consume Byte เก่าก่อน Byte ของ Test File ใหม่

CRC Result เมื่อมี Stale PCM ค้างใน Ring
sent_bytes=5292032
sent_crc32=5c906e27

stm32_consumed=5312512
stm32_crc32=36ee26b8

MISMATCH

ก่อนรัน CRC Test ให้เช็ก Fill Gauge ว่า 0%: Source ระบุว่า Ring Flush Fix ยังเป็น Deferred / Not flashed ใน Revision ที่อธิบายไว้

3. มี Unexplained Power Loss หนึ่งช่วงทดสอบ

Operating Notes บันทึก Unclean Shutdown ระหว่าง UPnP Session แต่ Creator ยังไม่สามารถยืนยันสาเหตุว่าเป็น Power, Connector, Network Load หรือปัจจัยอื่น

Source ระบุไว้ตรง ๆ ว่า:

สาเหตุยังไม่ถูกระบุ

จึงไม่ควรสรุปเองว่าเป็น Brownout, Thermal Shutdown หรือ Firmware Bug

Enhanced Mode: AI ไม่แตะเสียงโดยตรง แต่ใช้เลือก EQ

Enhanced Mode มี:

  • Flat
  • Speech
  • Warm
  • Bright
  • Bass
  • Acoustic
  • Custom 5-band EQ
  • Auto ผ่าน YAMNet

แนวคิดสำคัญคือ:

AI chooses; DSP shapes.
YAMNet ฟัง Side Copy แล้วเลือก Preset แต่ Main Audio Samples ถูกปรับด้วย DSP / IIR EQ ไม่ใช่ถูกสร้างใหม่โดย AI

Current Code กำหนด:

  • Audio Input ของ Pipeline = 44.1 kHz stereo
  • Classifier เก็บ Mono Buffer ประมาณ 1 วินาที
  • Resample ไป 16 kHz
  • Inference Interval = 2.0 วินาที

ใน Docstring ของ enhance.py มีข้อความเก่าว่า “once per second”: แต่ Current Constant CLASSIFY_S = 2.0 และ Main Story ระบุทุก 2 วินาที บทความนี้จึงใช้ค่า 2 วินาที

ดู Enhanced / Auto Mode ทำงานจริง

YAMNet ได้ยินอะไร แล้วเลือก EQ แบบไหน?

Current Code Map Audio Labels ไปยัง Preset แบบ Rule Table

กลุ่ม Label Preset
Speech / Narration / Conversation Speech
Classical / Piano / Acoustic Guitar / Jazz Acoustic
Hip-hop / Electronic / Techno / House / Dubstep Bass
Rock / Heavy Metal / Punk / Grunge Bright
Pop / Singing / Soul / R&B / Reggae / Folk / Country Warm
อื่น ๆ Flat

Custom EQ

Current Code กำหนด Band Center:

  • 60 Hz
  • 250 Hz
  • 1 kHz
  • 4 kHz
  • 12 kHz

User Gain Limit: ±12 dB

Per-context Feedback Offset: ±6 dB

Feedback Button เปลี่ยน Band ที่เกี่ยวข้อง ครั้งละประมาณ: ±1 dB

Enhanced Mode ไม่ใช่ Bit-perfect เทียบกับ Original PCM: เมื่อ DSP ปรับ EQ Sample ถูกเปลี่ยนจริง ดังนั้น CRC ของ Output ไม่ควรถูกคาดหวังว่าจะเหมือน Input Reference

Click ตอนเปลี่ยน Preset ไม่ได้หายเพราะ Crossfade อย่างเดียว

Creator พบว่า การเปลี่ยน Filter Chain ทำให้เกิด Click

จึงเพิ่ม:

4096-frame Crossfade ≈ 93 ms

แต่หลัง Crossfade ยังเจอ Output พุ่งถึง Full Scale ระหว่างการสลับ Preset

จากการวัด Creator ตามไปพบว่า Initial State จาก scipy.signal.sosfilt_zi ไม่เหมาะกับกรณีที่ Filter Chain ใหม่ Fade เข้ากลางเพลง

Solution ที่ใช้ใน Project คือ:

เริ่ม Filter ใหม่ด้วย Zero Initial State

สถานะ Peak เทียบ Tone Max Slew เทียบ Natural
No crossfade 2.00× — Clips 21.2×
Crossfade เดิม 2.00× — Clips 1.37×
Crossfade + Zero State 1.00× 1.00×

ตัวเลขนี้เป็นผลจาก Test Setup ของ Creator: ไม่ควรนำไปใช้เป็น Benchmark สำหรับ SciPy, Filter Design หรือ Audio System อื่นโดยอัตโนมัติ

13×8 LED Matrix กลายเป็น VU Meter

Creator ใช้ LED Matrix บน UNO Q เอง เป็น Stereo VU Meter

Source ระบุว่าแสดง:

  • Left RMS
  • Right RMS
  • Peak-hold Pixel
  • Refresh ประมาณ 20 fps

VU ไม่ได้ใช้ Absolute Level ตรง ๆ แต่มี Auto-gain Reference เพื่อให้ยังเห็น Dynamic แม้ฟังที่ระดับเสียงเบา

Parameters ที่ Source ระบุ:

  • Fast Attack
  • Release ประมาณ 3 วินาที
  • Floor = -60 dBFS
  • Gain Cap = +40 dB

ดู Matrix VU Meter

Status Page ดูอะไรได้บ้าง?

Web status interface ของ Pure-Path Audio Bridge
ตัวอย่าง Web Interface ของ Pure-Path Audio Bridge บน Local Network

Main Source ระบุว่า Status Page แสดงข้อมูลอย่าง:

  • Buffer Fill
  • Link Counters
  • Now Playing
  • MPD Transport Controls
  • Mode / Preset
  • Live Level Meter
  • Service Health

Web UI อยู่บน Port: 8080 ตาม Repository

PCM5102A ต่อกับ UNO Q อย่างไร?

Wiring diagram ระหว่าง Arduino UNO Q และ PCM5102A
Wiring Diagram ของ Project ระหว่าง STM32 Side บน Arduino UNO Q กับ PCM5102A
PCM5102A UNO Q Header STM32 Function
VIN 5V Power
GND GND Common Ground
BCK D13 PB13 / SAI2_SCK_A
LCK D19 / A5 PC0 / SAI2_FS_A
DIN D11 PB15 / SAI2_SD_A
SCK GND PCM5102A ใช้ Internal PLL จาก BCK ใน Project นี้

Module Jumper Settings

Pad Setting
FLT L
DEMP L
XSMT H
FMT L

XSMT ต้องเป็น H ตาม Wiring Guide: Source ระบุว่า ถ้าปล่อย XSMT ต่ำ Module จะไม่มีเสียง

Source ยังแนะนำ:

  • Keep Signal Wires ต่ำกว่าประมาณ 10 cm
  • วาง GND ร่วมกับ Signal Route
  • PCM5102A ไม่มี Hardware Volume ใน Module นี้
  • ปรับระดับเสียงที่ Amplifier

Pin Conflict: Wiring Guide ระบุว่า D11 / D13 และ D19 ถูกใช้กับ Audio Path ดังนั้น SPI และ Second I2C Bus บางส่วนจะไม่พร้อมใช้พร้อมกัน ใน Configuration นี้

Wiring diagram เพิ่มเติมของ PCM5102A กับ Arduino UNO Q
Wiring Diagram เพิ่มเติม จาก Source
ภาพการต่อสายจริงระหว่าง Arduino UNO Q และ PCM5102A
ภาพ Wiring จริง ของ UNO Q และ PCM5102A ใน Project ต้นฉบับ

Build / Flash / Install ตาม Official Project Repo

Repository แยก Build Guide และ Linux-side Installation ไว้ชัดเจน

1. Clone Repository

Clone Official Project Repository
git clone https://github.com/AZNitro/pure-path-audio-bridge

2. Build STM32 Firmware

Official BUILD Guide ใช้ Board Target:

arduino_uno_q/stm32u585xx

Zephyr Build
west build -b arduino_uno_q/stm32u585xx /path/to/firmware

Repo ระบุว่า Target ไม่ใช่: arduino_uno_q/stm32u585xx/m33 เพราะ Target ดังกล่าวไม่ Resolve ใน Build Flow ที่ Creator ใช้

3. Flash ผ่าน adb + arduino-debug + GDB

Prepare OpenOCD via UNO Q
adb forward tcp:3333 tcp:3333
adb shell 'pkill -x openocd'
adb shell arduino-debug &
GDB Session
target extended-remote :3333
load
compare-sections

หลัง Flash ให้ Power-cycle ตาม BUILD.md: Repo ระบุว่า Debugger reset ทำให้ STM32U5 เข้า State ที่ติด Boot ROM ใน Setup นี้ จึงแนะนำถอด USB-C แล้วเสียบกลับ แทนการ Reset

west flash / west debug ไม่ใช่ Flow ที่ Repo ใช้: BUILD.md ระบุว่า Command เหล่านี้พยายามเปิด Local OpenOCD แทนการใช้ Forwarded Port ที่ Project ต้องการ

4. Linux-side Services

Running Bridge ใช้ 6 Services:

  • bridge-tx
  • enhance
  • bridge-api
  • librespot
  • MPD
  • upmpdcli

โดย 4 ตัวแรก เป็น Project Units ส่วน MPD และ upmpdcli ใช้ Distribution Services พร้อม Config จาก Repo

พิสูจน์ Bit-perfect ด้วย purecrc.sh

Project มี Tool สำหรับหยุด Service ที่เกี่ยวข้อง แล้วส่ง WAV ผ่าน Bridge เพื่อเปรียบเทียบ CRC โดยตรง

Run CRC Test on the Board
tools/purecrc.sh some_16bit_44k1.wav

ก่อนทดสอบให้เช็ก 3 อย่าง: Audio File ต้องเป็น Format ที่ Test รองรับ, Software Volume ต้องอยู่ที่ 100%, และ Fill Gauge ควรเป็น 0% เพื่อเลี่ยง Known Stale-ring Bug

สิ่งที่ยังไม่ได้ทำ และอยู่ใน Next Steps

Creator ระบุ Future Work ไว้หลายจุด:

  • Restoration Model สำหรับ Lossy Stream
  • Port enhance.py ไป Rust
  • 24-bit Audio บน DMA-only RX ที่ 4 Mbaud
  • USB Audio Gadget / UAC2
  • PCM5122 พร้อม Hardware Volume
  • Signal-adaptive Dynamic EQ
  • Feedback Loop ที่เรียนรู้ Preference ลึกขึ้น

ทั้งหมดนี้ยังเป็น Future Work: ไม่ควรเขียนว่า Current Build รองรับ 24-bit, USB DAC Mode, PCM5122 หรือ AI Restoration แล้ว

Maker เรียนรู้อะไรจาก Project นี้?

1. “เสียงดี” กับ “ข้อมูลตรง” เป็นคนละคำถาม

Creator เลือกพิสูจน์ Digital Transport ด้วย CRC แทนการอธิบายจากการฟังอย่างเดียว

2. Hardware Peripheral บางอย่างต้องลงไปต่ำกว่า App Layer

App Lab เหมาะกับงานหลายแบบ แต่ Project นี้ต้องควบคุม SAI, DMA, Clock และ UART ในระดับที่ Creator เลือกใช้ Zephyr โดยตรง

3. AI ไม่จำเป็นต้องอยู่ใน Main Signal Path

YAMNet ทำงานเป็น Side Classifier แล้วส่ง Decision ให้ DSP เลือก EQ ทำให้ Audio Processing ยังเป็นระบบ DSP ที่ตรวจสอบได้แยกจาก Model

4. Measurement เจอ Bug ที่หูอาจอธิบายไม่ครบ

Crossfade ลด Click ได้ แต่ Measurement ยังพบ Peak / Clipping ที่พา Creator ไปเจอปัญหา Initial Filter State

5. Known Issues ควรอยู่ใน Documentation

Ring Flush Bug, One-source-at-a-time และ Unexplained Power Loss ถูกบันทึกไว้ตรง ๆ ทำให้คน Build ต่อ แยก “ข้อพิสูจน์แล้ว” ออกจาก “สิ่งที่ยังต้องแก้” ได้ง่ายขึ้น

โปรเจกต์นี้มีหลาย Layer แนะนำอ่านต้นฉบับควบคู่กัน

ถ้าต้องการ Build จริง แนะนำเปิด Main Story พร้อม Official Repository เพราะรายละเอียดสำคัญ กระจายอยู่ใน Firmware, Linux Services, Wiring และ Operating Notes

FAQ: Pure-Path Audio Bridge บน Arduino UNO Q

Pure-Path Audio Bridge คืออะไร?

เป็น Network Audio Streamer บน Arduino UNO Q ที่ใช้ Linux ฝั่ง QRB2210 รับ Spotify / UPnP / Local Audio แล้วส่ง PCM ไปยัง STM32U585 เพื่อออก I2S ไปยัง PCM5102A

ใช้ DAC รุ่นอะไร?

Source ใช้ GY-PCM5102 / PCM5102A I2S DAC Module

Audio Format ปัจจุบันคืออะไร?

Current Pipeline ล็อกที่ signed 16-bit little endian, stereo, 44.1 kHz

Bit-perfect ใน Project นี้หมายถึงอะไร?

หมายถึง PCM Byte ที่ Sender ส่ง ตรงกับ PCM Byte ที่ STM32 ส่งเข้า SAI/I2S โดยตรวจ Byte Count และ CRC-32

CRC-32 พิสูจน์ Analog Output ของ DAC หรือไม่?

ไม่ CRC ตรวจ Digital PCM Transport ถึง SAI/I2S Path ไม่ได้วัด Analog Noise, Distortion หรือ DAC Output Waveform

Spotify กลายเป็น Lossless ไหม?

ไม่ ตาม Test Environment ที่ Creator รายงานในเดือนกันยายน 2026 Spotify Source เป็น Lossy Ogg Vorbis แม้ PCM หลัง Decode จะถูกส่งต่อแบบ Byte-exact ก็ตาม

เล่น Hi-Res แบบ Bit-perfect ได้หรือไม่?

Current Pipeline ไม่ได้ทำ Hi-Res Passthrough Source ระบุว่า Hi-res Audio ถูก Resample ลงเป็น 16-bit / 44.1 kHz ก่อน

ทำไมต้องตั้ง Volume 100%?

เพราะ Software Volume เปลี่ยน PCM Samples ทำให้ CRC ไม่ตรงกับ Reference เดิม ถ้าต้องการพิสูจน์ Byte-exact Source ให้ปรับ Loudness ที่ Amplifier แทน

ทำไม Stock Arduino Bridge ใช้ไม่ได้?

Source วัด Bridge เดิมที่ 115,200 baud หรือประมาณ 11.5 kB/s ขณะที่ PCM 16-bit stereo 44.1 kHz ต้องการประมาณ 176.4 kB/s

ทำไมเลือก 3 Mbaud?

Creator วัด 3 Mbaud ได้ Clean Payload 222 kB/s ซึ่งสูงกว่า Requirement ขณะที่ 2 Mbaud ต่ำเกินไป และ 4 Mbaud เกิด RX overflow

ทำไมต้องใช้ Zephyr?

Project ต้องใช้ SAI2, DMA, Custom Clock และ UART Configuration ที่ Creator ไม่สามารถ Enable ผ่าน App Lab Loader ใน Setup เดิมได้

YAMNet เปลี่ยนเสียงโดยตรงหรือไม่?

ไม่ YAMNet วิเคราะห์ Side Copy แล้วเลือก EQ Preset ส่วนการปรับเสียงจริง ทำโดย DSP / IIR Filters

Auto EQ ตรวจ Audio ทุกกี่วินาที?

Current Code ใช้ CLASSIFY_S = 2.0 หรือหนึ่ง Inference ทุกประมาณ 2 วินาที

Custom EQ มีกี่ Band?

5 Band: 60 Hz, 250 Hz, 1 kHz, 4 kHz และ 12 kHz

PCM5102A ใช้สายกี่เส้น?

Wiring Guide ใช้ 6 Connections: 5V, GND, BCK, LCK, DIN และ SCK ที่ต่อ GND ตาม Configuration ของ Project

ทำไม purecrc.sh บางครั้ง MISMATCH?

Current Firmware มี Known Issue ที่ PCM เก่าอาจค้างใน Ring หลัง Interrupted Stream ทำให้ STM32 Consume Byte เก่าก่อน Test File ใหม่ ควรเช็ก Fill Gauge ให้ 0% ก่อนรัน Test

เล่น Spotify กับ UPnP พร้อมกันได้ไหม?

ไม่ควร Current Design ไม่มี Source Arbitration และทั้งสอง Source สามารถเขียน audio.fifo พร้อมกัน จนเกิด Stutter

ใช้ west flash ได้ไหม?

Repo ระบุว่า west flash และ west debug ไม่ใช่ Flow ที่ Project ใช้ เพราะต้อง Flash ผ่าน Forwarded OpenOCD ด้วย arduino-debug + adb + GDB

Project เสร็จสมบูรณ์แล้วหรือยัง?

Main Source ระบุสถานะ Work in progress และยังมี Future Work เช่น 24-bit, UAC2, Rust Port และ PCM5122 Hardware Volume

สรุป: จุดเด่นคือ “พิสูจน์ Path” มากกว่าบอกว่าเสียงดี

Pure-Path Audio Bridge น่าสนใจตรงที่ Creator ไม่ได้หยุดที่ “ต่อ DAC แล้วมีเสียง”

แต่ไล่ตรวจตั้งแต่:

  • Bandwidth ของ Bridge
  • UART Speed
  • 44.1 kHz Clock Accuracy
  • Ring Buffer
  • Frame Integrity
  • CRC-32 ของ PCM
  • Software Volume
  • Preset Switching Transient
  • Known Runtime Limitations

จนได้ Architecture ที่แบ่งงานระหว่าง Linux และ STM32 อย่างชัดเจน

Network Audio
↓
Linux / QRB2210
↓
Pure หรือ Enhanced DSP
↓
3 Mbaud UART
↓
STM32U585 / Zephyr
↓
SAI2 / I2S
↓
PCM5102A

ส่วน AI ก็ถูกวางไว้แบบมีขอบเขต: YAMNet ไม่ได้แตะ Main Signal แต่ทำหน้าที่เลือก EQ Preset แล้วปล่อยให้ DSP เป็นผู้ปรับ Audio Samples

สำหรับสาย Maker นี่เป็นตัวอย่างที่ดีมาก ของ Project ที่รวม Embedded Linux, MCU Firmware, Real-time Audio, DSP, AI Classification และ Measurement เข้าด้วยกัน โดยยังบันทึกข้อจำกัด และ Bug ที่พบไว้ตรง ๆ

References / แหล่งข้อมูลต้นฉบับ

อยากเริ่ม Arduino, I2S หรือ Embedded Audio Project?

Project แบบ Pure-Path Audio Bridge ต้องมองทั้ง Board, DAC, Clock, Firmware, Linux Service และ Audio Interface ไปพร้อมกัน

ถ้ากำลังทำ Arduino, Embedded Linux, I2S Audio, DAC, DSP หรือ Maker Project สามารถสอบถามทีม Globalbyte เรื่อง Development Board, Module, Jumper Wire, Breadboard และอุปกรณ์ที่เหมาะกับ Project ได้

บทความนี้ไม่ได้ยืนยันว่า Arduino UNO Q, PCM5102A หรืออุปกรณ์รุ่นเดียวกับต้นฉบับ มี Stock อยู่ที่ Globalbyte กรุณาสอบถามรุ่นและ Availability ก่อนสั่งซื้อ

 


Blog posts