กลับไปหน้ารวมไฟล์
bluetooth-controlled-audio-player-for-nrf52x-devices-0ae088.md

โปรเจคนี้ใช้ความสามารถของบอร์ด nRF52 อย่าง XIAO BLE Sense 52840, Feather 52840, Clue หรือบอร์ดอื่นๆ มาสร้างเครื่องเล่นเสียงควบคุมผ่านบลูทูธ งานนี้มันส์แน่นอน!

มันทำงานยังไงวะ?

เจ้าไมโครคอนโทรลเลอร์พวกนี้มันมีฟีเจอร์บลูทูธและเสียงขั้นเทพติดมาในตัวอยู่แล้ว ทำให้เราสร้างแอปพลิเคชันเจ๋งๆ ได้ง่ายขึ้น ในโปรเจคนี้ บอร์ดจะเล่นไฟล์ .WAV จาก SD Card แบบมาตรฐาน ผู้ใช้สามารถใช้แอป nRF Connect เชื่อมต่อกับบอร์ดและควบคุมว่าจะเล่นเพลงไหน รวมถึงปรับระดับเสียงได้เลย

High-Efficiency SoC: nRF52x Audio Player

โปรเจคบลูทูธบน Arduino ส่วนใหญ่ชอบเอาโมดูล HC-05 ตัวใหญ่ยักษ์กินไฟมหาศาลมาต่อกับ Uno 5V กันใช่ไหม? nRF52x Audio Player โปรเจคนี้จะพาน้องๆ ไปรู้จักกับ System-on-Chip (SoC) สถาปัตยกรรมที่มันส์กว่า ตัวประมวลผล Nordic nRF52840 (ที่พบในบอร์ดอย่าง Arduino Nano 33 BLE และ Adafruit Feather) บีบอัดวิทยุบลูทูธลงไปบนชิปตัวเดียวกันกับ ARM processor หลักเลย ประหยัดแบตฯ ได้อย่างบ้าระห่ำ

The Bluetooth Low Energy (BLE) Framework

บอกเลยว่าเราไม่สามารถส่งข้อความธรรมดาๆ แบบ Serial ผ่าน BLE แบบสมัยใหม่ได้นะ โปรโตคอลมันคนละเรื่องกับบลูทูธรุ่นเก่า (Classic) ซะแล้ว

  1. โครงสร้าง (Architecture): BLE ทำงานบนโครงสร้างฐานข้อมูลที่ซับซ้อนของ "Services" และ "Characteristics"
    • เราต้องกำหนด Service สำหรับควบคุมเสียง (เช่น UUID 0x1812)
    • แล้วก็กำหนด Characteristic สำหรับ Play/Pause ไว้ข้างใน Service นั้น
  2. การเชื่อมต่อ (The Interlock): สมาร์ทโฟนของเราจะทำหน้าที่เป็น Central Unit มันจะสแกนหา nRF52x ของเรา (ซึ่งเป็น Peripheral) พอเชื่อมต่อกันได้แล้ว โทรศัพท์จะเขียนค่า byte แบบเลขฐานสิบหก (hex) ลงไปใน Characteristic "Play" โดยตรงเลย!
  3. การตอบสนอง (The Callback): ARM processor ข้างใน nRF52 จะรันอินเตอร์รัพท์ if (playCharacteristic.written()) { executeAudio(); }

การขับสัญญาณเสียง (Driving Audio Peripherals: I2S vs. PWM)

พอได้รับคำสั่ง Play ผ่านบลูทูธแล้ว บอร์ดจิ๋วของเราก็ต้องส่งเสียงออกมา

  • เพราะว่า nRF52 เป็น 32-bit ตัวเก่ง มันเลยไม่ต้องพึ่งไลบรารี PWM แบบ 8-bit ที่เสียงแตกๆ อีกแล้ว
  • มันใช้ โปรโตคอล I2S (Inter-IC Sound) แทน ซึ่งเป็นบัสดิจิตอล 3 สายที่ออกแบบมาเพื่อข้อมูลเสียงคุณภาพระดับ CD โดยเฉพาะ
  • nRF52 จะสตรีมข้อมูลคลื่นเสียงความละเอียดสูง (raw wave) ตรงไปยัง บอร์ดขยายเสียง MAX98357A I2S
  • ชิป MAX ตัวนี้จะแปลงข้อมูลดิจิตัลนั้นให้เป็นสัญญาณอนาล็อกที่ชัดเจนและขยายกำลังแล้ว ส่งออกไปยังลำโพง 3W ได้อย่างสุดพลัง!

อุปกรณ์ที่ต้องใช้ (Components)

1x บอร์ด Arduino ที่ใช้ชิป nrf52x

1x MAX98357A หรือแอมป์ I2S รุ่นอื่น

1x SD Card ที่มีไฟล์ .WAV อยู่ (16-44kHz, 8 หรือ 16-bits, mono/stereo)

1x ลำโพง 8 โอห์ม

1x มือถือ (iOS หรือ Android) ที่รองรับ BLE

อุปกรณ์สำคัญที่ต้องจัดให้ครบ (Crucial Hardware Loadout)

  • บอร์ดพัฒนา Nordic nRF52832 หรือ nRF52840 (เช่น SparkFun nRF52832 Breakout, Adafruit Feather nRF52840 Express)
  • MAX98357A I2S Class D Audio Amplifier
  • ลำโพง 3-Watt 4-Ohm
  • สมาร์ทโฟนที่มีแอป BLE Scanner เช่น nRF Connect หรือ LightBlue ไว้สำหรับส่งคำสั่งไปที่ Characteristic

วิธีการต่อสาย (Connecting Everything)

MAX98357A I2S breakout:

  1. BCLK -> Arduino D1 (p0.03)
  2. LRCK -> Arduino D3 (p0.29)
  3. DIN -> Arduino D5 (p0.05)
  4. พินข้างบนสามารถกำหนดใหม่ในสเก็ตช์ได้ โดยระบุหมายเลข GPIO และ/หรือพอร์ตก่อนเรียกฟังก์ชัน begin():
  5. ถ้าอยากใช้ D7 (p1.12) สำหรับ LRCK ให้เรียก aaAudio.I2S_PIN_LRCK = 12; และ aaAudio.I2S_PORT_LRCK = 1;
  6. SD -> Arduino D6

SD Card:

  1. พิน CS ของ SD Card ต่อกับ Arduino D2 ในโค้ดตัวอย่าง ส่วนพินอื่นๆ ต่อตามที่ระบุไว้บนบอร์ด

Pin-Out for XIAO BLE Sense 52840

ซอฟต์แวร์ (Software):

เดโม่นี้ใช้ตัวอย่างที่มากับไลบรารี Auto Analog Audio นะน้อง

  1. ติดตั้งไลบรารี Auto Analog Audio ผ่าน Arduino library manager ไปเลย
  2. เข้าไปที่ examples -> Auto Analog Audio > Platforms -> nRF52 -> nRF52_BLE
  3. เลือกตัวอย่างตาม Board Support Package ที่น้องใช้อยู่ ว่าจะเป็น mbed หรือ non-mbed
  4. หรือจะใช้โค้ดที่แนบมากับโปรเจคนี้ก็ได้ ง่ายดี

**หมายเหตุ:** ความเร็ว SPI ใน Mbed BSP ยังถูกจำกัดอยู่ เลยทำให้ความเร็ว SD Card ไม่เต็มที่ ถ้าอยากได้เสียงคุณภาพสูง ให้ใช้โค้ดเวอร์ชัน non-mbed (Bluefruit) ไปเลยจ้า

เชื่อมต่อกับ Bluetooth:

  1. ติดตั้งแอพ nRF Connect ในมือถือของน้อง
  2. สแกนหาอุปกรณ์ - หาชื่อ 'BLE Audio Player' แล้วเชื่อมต่อเข้าไป
  3. พอเชื่อมต่อแล้ว น้องควรจะเห็น 'Common Audio'
  4. และ 'Audio Input Type' - ตรงนี้แหละที่น้องจะพิมพ์ชื่อไฟล์ UTF8 เช่น mywavfile.wav เพื่อเริ่มเล่นไฟล์เสียง
  5. และ 'Audio Input Control Point' - ตรงนี้แหละที่น้องจะใส่ค่าตัวเลขเพื่อควบคุมระดับเสียง, 1 คือเบาที่สุด, 10 คือเต็มเสียง, 11 สำหรับคนชอบเสียงดังจนบ้านแตก

หน้าจอสแกนของแอพ nRF Connect

ควบคุมการเล่นหรือระดับเสียงจากหน้าจอนี้

พิมพ์ชื่อไฟล์ .wav เพื่อเริ่มเล่น

โค้ดที่ให้มานี้เป็นแค่ตัวอย่างสำหรับสาธิตนะน้อง น้องสามารถเอาไปต่อยอดเพิ่มฟีเจอร์และฟังก์ชันการทำงานได้อีกเพียบเลย เอาไปเล่นกันให้หนำใจ อย่าลืมแบ่งปันผลงานให้พี่ดูบ้างล่ะ สู้งานนะน้อง!

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x nrf Conect"
author: "TMRh20"
category: "Audio & Sound"
components:
  - "1x Seeeduino Xiao BLE Sense"
  - "1x Stereo Enclosed Speaker - 3W 8Ω"
  - "1x SD card module"
  - "1x I2S 3W Class D Amplifier Breakout - MAX98357A"
  - "1x iPhone"
description: "Nordic Silicon! Step away from traditional Arduinos and utilize the ultra-high-efficiency nRF52 chip series to stream low-energy Bluetooth audio architectures directly from a smartphone."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://github.com/TMRh20/AutoAnalogAudio"
  - "https://projects.arduinocontent.cc/236c073c-bcc1-4722-a50b-03bf20915415.ino"
  - "https://projects.arduinocontent.cc/a0140cc6-da6e-4657-b80d-77eca575abf3.ino"
encryptedPayload: "U2FsdGVkX1/o63HVD4aCm1I4EU+6taeM2hZQjxHHkwbhepwNOluPjQDbIedMcxuhqCElGO7VPHhJFbpVFbdLQOQyrsIgYnn0X5nCVXU50Dk="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/bluetooth-controlled-audio-player-for-nrf52x-devices-0ae088_cover.jpg"
lang: "en"
likes: 0
passwordHash: "e3caffda906a7b9a4e33e947a3dbc58b342cca20a22706363a9eb97783b41dfc"
price: 2450
seoDescription: "Learn how to build a Bluetooth Controlled Audio Player for nRF52x. Control playback and volume easily."
tags:
  - "Music"
  - "Internet Of Things"
  - "Audio"
title: "ควงบอร์ด nRF52x เล่นเพลงไร้สายด้วย Bluetooth งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://www.youtube.com/watch?v=xMr4lPcjwW8"
views: 1171