กลับไปหน้ารวมไฟล์
simple-led-vu-meter-from-system-audio-a2edeb.md

​มันต่างจาก VU meter อื่นๆ ยังไงล่ะ?

VU meter ส่วนใหญ่ที่ใช้ Arduino จะใช้ ADC (Analog to Digital Converter) ภายในตัวมันเอง เพื่อแปลงสัญญาณเสียงที่เป็นอนาล็อก ให้เป็นดิจิทัลที่ Arduino เข้าใจง่ายๆ แล้วค่อยส่งออกไปควบคุมไฟ LED พวกนี้แหละ วิธีทำก็มักจะใช้หัวต่อ TRS แบบเมีย หรือไมโครโฟนโมดูล ข้อเสียก็คือ คุณต้องเปิดเพลงออกลำโพงข้างนอกให้ไมค์ฟัง หรือถ้าใช้สายแยกก็ต้องมีสปลิตเตอร์ (ข้างนึงเสียบหูฟัง อีกข้างนึงเสียบ Arduino)

พี่ไม่มีสายสปลิตเตอร์แถมชอบฟังเพลงด้วยหูฟังซะด้วย เลยต้องหาทางออกใหม่ วิธีนี้ไม่ได้ใช้ ADC ภายใน Arduino นะ เพราะงั้นพี่คาดว่าน่าจะตอบสนองช้ากว่า เพราะสัญญาณต้องผ่านการประมวลผลหลายขั้นตอน เทียบกับวิธีตรงๆ ที่พูดไปก่อนหน้า

P.S. รู้ไว้หน่อยก็ดีนะ ว่า Spectrum Analyzer กับ VU meter มันคนละเรื่องกัน Spectrum Analyzer มันจะแสดงระดับเสียงของแต่ละย่านความถี่ (Frequency Band) ที่มีอยู่ในเสียงนั้นๆ มันอาจจะมีแถบเยอะๆ ให้เห็นรายละเอียด หรือมีแค่สามแถบก็ได้ แต่มันซับซ้อนกว่า VU meter อยู่แล้ว

ส่วน VU meter นี่ง่ายๆ แค่แสดงความดังของเสียงเฉยๆ ไม่มีรายละเอียดอะไรมาก ตัวอย่างเช่น เพลงที่มีเครื่องดนตรีหลายชั้นแต่ระดับเสียงเท่าๆ กันตลอดทั้งเพลง VU meter ก็แทบจะไม่ขยับเลย ในขณะที่ Spectrum Analyzer จะให้เราเห็นเครื่องดนตรีต่างๆ ได้ (ถ้ามันมีความถี่ต่างกันนะ) VU meter จะตอบสนองดีสุดกับเพลงที่มีจังหวะหนักๆ ดุดันๆ อย่างพวกกลองหรือเบส สู้งานนะน้อง!

แล้วมันทำงานยังไงล่ะ?

เพื่อจะดึงเสียงจากระบบมาวิเคราะห์ พี่ต้องใช้ Python เข้าช่วย มันมีไลบรารีที่ช่วยสตรีมเสียงมาเป็นอินพุตได้ (pyaudio) แล้วก็มีอีกตัวที่ใช้วิเคราะห์ความดัง (audioop) แต่มันมีอุปสรรคอีกอย่างนึงนะ: pyaaudio มันอ่านเสียงจากระบบคอมเราโดยตรงไม่ได้

โชคดีที่ในคอมเรามีไดรเวอร์ที่ติดตั้งมาล่วงหน้าแล้ว มันทำให้เราสามารถใช้การ์ดเสียงของระบบเป็นอุปกรณ์อินพุตให้ pyaudio ใช้ได้ พี่ไม่ได้คิดค้นวิธีนี้เองหรอกนะ แต่ค้นเจอหลังจากกูเกิ้ลหาอย่างหนักหน่วง (ต้องให้เครดิตคนที่ค้นพบวิธีนี้ด้วย) แต่อย่าลืมนะ **วิธีนี้ใช้ได้เฉพาะบน Windows** เท่านั้น! OS อื่นอาจมีวิธีแก้ไข แต่พี่ยังไม่ได้ลองหามากนัก

พอได้สัญญาณเสียงมาแล้ว ก็ถึงตาของ audioop มันใช้ค่า RMS ของเสียงในการหาความดัง RMS ย่อมาจาก root mean square พูดง่ายๆ มันคือค่าที่แสดงกำลังของเสียงนั่นแหละ ถ้าจะลงลึกอีกนิด กำลังของเสียงจะแสดงเป็นคลื่นไซน์ ซึ่งทำงานกับมันตรงๆ ยาก แต่การหา RMS ณ จุดหนึ่งๆ ทำให้เราหาค่าสัญญาณเทียบเท่าได้ ถ้ามันเป็นเส้นตรงธรรมดา ความถี่ในการสร้างค่า RMS อยู่ที่ 42Hz หลังจากคำนวณนู่นนี่แล้ว พี่ก็ตัดสินใจใช้ baud rate 115200 ซึ่งก็พอใช้ได้ ตอบสนองได้ทันใจเลย แต่บางทีก็มีไฟกระพริบๆ น่ารำคาญอยู่บ้าง

ค่า RMS นี้จะถูกส่งผ่าน Serial ไปหา Arduino ซึ่งจะอ่านค่าแล้วค่อยไปเปิดปิด LED 8 ดวงในแถว ขึ้นอยู่กับระดับเสียงที่ได้ **ฝั่ง Arduino พี่ใช้ shift register 74HC595 นะ** จะใช้พินธรรมดาก็ได้ แต่พี่อยากใช้ระบบไบนารีซักหน่อย LED 8 ดวง *ไม่น่า* จะทำให้มีปัญหาเรื่องไฟฟ้า เพราะไฟทั้ง 8 ดวงไม่ติดพร้อมกันตลอดเวลา แม้ว่าจะติดทั้งหมดในบางจังหวะ ก็ยังไม่น่าไปถึงขีดจำกัด 200mA ของบอร์ด Uno อยู่ดี แต่อย่าลืมเช็ค datasheet ของ LED ด้วยล่ะ เพราะ LED แต่ละแบบกินกระแสไม่เท่ากัน ห้ามช็อตนะตัวนี้!

รายละเอียดเทคนิคแบบจัดเต็ม

LED VU (Volume Unit) Meter นี่แหละคือหน้าจอแสดงผลคลาสสิกสุดเท่ที่เห็นในเครื่องเสียงรุ่นเก่าๆ หรือมิกเซอร์ แทนที่จะไปยุ่งกับอะไรซับซ้อนอย่างการวิเคราะห์ความถี่ (FFT) โปรเจคนี้เน้นไปที่ ความดัง (Amplitude) อย่างเดียว เพื่อสร้างแสงไฟที่สวยงามและตอบสนองกับเสียงได้อย่างชัดเจน

button_led_basic_interaction_1772681969235.png

The Envelope Follower (ตามจับสัญญาณเสียง)

หลักการสำคัญคือการตามจับ "ซอง" ของสัญญาณเสียง ในวงจรฮาร์ดแวร์ทั่วไป เราจะใช้ โมดูลขยายไมโครโฟนแบบอิเล็กเตร็ท (เช่น MAX4466) เป็นตัวหลัก โมดูลไมค์จะรับคลื่นเสียงเข้ามา แล้ว Arduino ของเราจะอ่านค่าจากขา Analog ให้เร็วที่สุดในช่วงเวลาสั้นๆ (เช่น 50 มิลลิวินาที) โค้ดของเราจะหาค่าแรงดัน peak-to-peak ในช่วงเวลานั้น ถ้าห้องเงียบ ค่าก็จะน้อย แต่ถ้ามีเสียงเบสดรัมดังปังมา ค่าก็จะพุ่งปรี๊ด! จากนั้นก็แปลงค่าสูงสุดนั้นเป็นตัวแปร "ความดัง" ไปเลย

The Bar Graph Array (แถว LED แสดงระดับ)

  • เตรียม LED ไว้ประมาณ 5 ถึง 10 ดวงเรียงกันเป็นแถว แล้วเก็บหมายเลขขา (pin) ของมันไว้ในอาร์เรย์
  • ใช้ฟังก์ชัน map() ของ Arduino เพื่อแปลงค่าตัวแปรความดัง (เช่น 0 ถึง 1024) ให้เป็นเลขดัชนีของ LED (เช่น 0 ถึง 8)
  • ใช้ลูป for เปิด LED ทุกดวงที่อยู่ต่ำกว่าหรือเท่ากับดัชนีนั้น และปิด LED ที่อยู่เหนือมันขึ้นไป วิธีนี้ทำให้แถบไฟของเรา "เด้ง" ขึ้นลงตามจังหวะเพลงได้อย่างพอดิบพอดี!

อุปกรณ์ที่ต้องใช้สำหรับวงจรมาตรฐาน

  • Arduino Uno/Nano: หัวใจหลักของโปรเจค
  • โมดูลขยายไมค์ MAX4466: ให้สัญญาณที่ชัดเจนและดังกว่าเซ็นเซอร์เสียงแบบธรรมดา
  • LED สีต่างๆ (เช่น เขียว 5 ดวง, เหลือง 3 ดวง, แดง 2 ดวง) และตัวต้านทาน (Resistor)

บอกเลยว่านี่เป็นโปรเจคเริ่มต้นที่เห็นผลงานชัดเจนและมันส์มากๆ ตัวหนึ่งเลย

ผลลัพธ์ที่ได้

ขอแจ้งให้ทราบก่อนนะวิดีโอพวกนี้ผมอัดเสียงตรงจากหูฟังเลย เสียงอาจจะไม่ค่อยชัดเท่าไหร่ และเสียงมันดันไปอยู่ข้างเดียวซะงั้น (ไม่รู้ทำไม) อีกอย่างคือผมอยากใช้ LED สีเหลืองตรงกลางนะ แต่ปรากฏว่ามันมัวไปหน่อย เลยไม่ใช้ **คำเตือน: มีแสงไฟกระพริบ**




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

apps:
  - "1x Arduino IDE"
  - "1x Python 3"
author: "v1ckery"
category: "Audio & Sound"
components:
  - "8x LED (generic)"
  - "1x Arduino Uno R3"
  - "1x 74HC595 Shift Register"
  - "8x 220 Ohm Resistor"
  - "18x Jumper wires (generic)"
description: "โปรเจควิจัยวัยรุ่น! ใช้ Python จับสัญญาณเสียงจากระบบ แล้วส่งข้อมูลผ่าน Serial ไปให้ LED Array แสดงผลแบบ Music Reactive จัดไปแบบเทพๆ"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX19jNmwHIyll/BARwo7owelACi6aiYY4O10hf+h7LX0k1J212fYmcpVHEbxTRTxu+HuvsJs3Uhad/TGOQ+JDGAYTfFSi2cGIvGNswmIrURR75akZDBG3dgwo"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/simple-led-vu-meter-from-system-audio-a2edeb_cover.jpg"
lang: "en"
likes: 1
passwordHash: "0f8310a74f77290d2e61189a3bcee917e7b0e1844083827f7fe46c99766c4e36"
price: 1499
seoDescription: "Build a Simple LED VU meter using system audio, Python, and serial communication to create a music reactive LED array."
tags:
  - "Audio"
  - "Lights"
title: "งานง่ายแต่หล่อ! เปลี่ยนเสียงเพลงให้เป็นไฟกระพริบ VU Meter สุดตึง"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/8L4qE3saGf4"
  - "https://www.youtube.com/embed/ltGrG8uZvyk"
  - "https://www.youtube.com/embed/Ofv0_yxjCkQ"
views: 8472