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
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 มีอะไรบ้าง?
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 อย่างไร?
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
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
[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
sent_bytes=5292032
sent_crc32=5c906e27
stm32_consumed=5292032
stm32_crc32=5c906e27
MATCH
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 ใหม่
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 ดูอะไรได้บ้าง?
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 อย่างไร?
| 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 นี้
Build / Flash / Install ตาม Official Project Repo
Repository แยก Build Guide และ Linux-side Installation ไว้ชัดเจน
1. Clone Repository
git clone https://github.com/AZNitro/pure-path-audio-bridge
2. Build STM32 Firmware
Official BUILD Guide ใช้ Board Target:
arduino_uno_q/stm32u585xx
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
adb forward tcp:3333 tcp:3333
adb shell 'pkill -x openocd'
adb shell arduino-debug &
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 โดยตรง
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 อย่างชัดเจน
↓
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 / แหล่งข้อมูลต้นฉบับ
- Hackster — Pure-Path Audio Bridge: Bit-Perfect Hi-Fi Streamer on UNO Q
- GitHub — AZNitro/pure-path-audio-bridge
- GitHub — Project README
- GitHub — PCM5102A Wiring Guide
- GitHub — Bill of Materials
- GitHub — Firmware Build and Flash Guide
- GitHub — Linux / systemd Installation Guide
- GitHub — enhance.py
- GitHub — purecrc.sh
- GitHub — Operating Notes / Known Issues
- YouTube — Pure-Path Audio Bridge Demo
- YouTube — Matrix VU Meter Demo
อยากเริ่ม 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 ก่อนสั่งซื้อ