สร้างเครื่องวัดเสียง (dB Meter) พกพาฉบับทำเอง แม่นยำระดับโปรด้วย Arduino!

Handheld DB Meter Project

ทำไมถึงต้องสร้างเครื่องวัดเสียงเอง?

ในฐานะคนรักเครื่องเสียง ผมมักจะอยากรู้เสมอว่าแอมป์หรือลำโพงที่ผมใช้อยู่ มันมีประสิทธิภาพและสร้างเสียงรบกวน (Noise ambiance) ในห้องได้ดังแค่ไหนในหน่วยเดซิเบล หรือ dB(A)

หลายคนอาจจะบอกว่า "ทำไมไม่โหลดแอปในมือถือล่ะ ฟรีด้วย?" เอาเข้าจริงนะครับ ไมโครโฟนในสมาร์ทโฟนถูกออกแบบมาเพื่อ "การคุยโทรศัพท์" ไม่ใช่เพื่อการวัดค่าทางเสียงศาสตร์ที่ต้องการความแม่นยำสูง (Calibrated acoustic measurement) แต่พอผมหันไปดูราคาเครื่องวัดระดับเสียงเกรดโปร (Sound level meters) ราคาก็พุ่งไปหลายพันจนถึงหลักหมื่นเลยทีเดียว

Measuring Sound Setup

ผมเลยอยากได้อะไรที่อยู่ตรงกลางระหว่าง "แอปมือถือ" กับ "เครื่องมือโปร" นั่นคือเครื่องวัดเสียงแบบพกพาที่ทำงานด้วยแบตเตอรี่ได้ และต้องแม่นยำจริงๆ จนผมได้มาเจอกับเซ็นเซอร์ DFRobot Gravity Analog Sound Level Meter (SEN0232) ตัวนี้แหละครับที่เป็นกุญแจสำคัญ เพราะมันปล่อยค่าอนาล็อกออกมาเป็นเส้นตรง (Linear) ทำให้เราแค่เสียบเข้ากับ Arduino ต่อจอ OLED แล้วคูณค่าตัวเลขง่ายๆ ก็ได้เครื่องวัดเสียงระดับเทพไว้ใช้งานแล้ว!

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

  • เซ็นเซอร์วัดเสียง DFRobot SEN0232 Sound Level Meter
  • บอร์ดไมโครคอนโทรลเลอร์ Arduino Nano (ในบทความต้นฉบับผู้เขียนใช้บอร์ดที่สั่งทำเองจาก JLCPCB แต่สามารถใช้ Arduino Nano ทั่วไปแทนได้เลยครับ)
  • หน้าจอแสดงผล Adafruit SSD1306 0.96" OLED Display
  • เบรดบอร์ด (Breadboard) สำหรับต่อวงจร
  • สายจัมเปอร์ (Jumper Wires)
  • สาย USB (สำหรับเสียบไฟและอัปโหลดโค้ด)

เครื่องวัดระดับเสียงคืออะไร? ทำความรู้จักกับ dBA

ก่อนที่เราจะเริ่มต่อวงจร มาทำความเข้าใจกันก่อนครับว่า dBA และ dB ต่างกันยังไง? ปกติแล้วหูของคนเราจะไวต่อเสียงในช่วงความถี่ 1kHz ถึง 5kHz มากที่สุด และจะรับรู้เสียงในย่านความถี่อื่นๆ ได้น้อยกว่า

การวัดแบบ A-weighting (dBA) คือการปรับจูนกราฟการวัดเสียงให้ "ตรงกับการรับรู้ของหูมนุษย์จริงๆ" ไม่ใช่แค่วัดพลังงานเสียงดิบๆ (Raw acoustic energy) ทื่อๆ ซึ่งเซ็นเซอร์ SEN0232 ตัวนี้ถูกปรับแต่งมาให้วัดเป็นหน่วย dBA ตั้งแต่โรงงานเลยครับ

Sound Level Meter Graph
View more (ดูกราฟระดับเสียงอ้างอิง dBA)

ภาพด้านล่างนี้คือตารางเปรียบเทียบระดับความดังของเสียงในหน่วย dBA ที่เรามักจะเจอกันในชีวิตประจำวันครับ

dBA Reference Scale

ทำความรู้จักเซ็นเซอร์ DFRobot SEN0232

เซ็นเซอร์ตัวนี้ไม่ใช่แค่บอร์ดไมโครโฟนธรรมดานะครับ แต่มันคือโมดูลวัดระดับเสียงที่มีวงจรจัดการสัญญาณ (Signal conditioning) มาให้แบบครบจบในตัวเลย

DFRobot SEN0232

สเปคเด่นๆ ของบอร์ด:

  • ช่วงการวัด (Measurement Range): 30 dBA ถึง 130 dBA
  • ความคลาดเคลื่อน (Measurement Error): ±1.5 dB
  • ฟิลเตอร์ความถี่ (Frequency Weighting): A-Weighted
  • ใช้ไฟเลี้ยง (Input Voltage): 3.3V ถึง 5.0V
  • แรงดันไฟขาออก (Output Voltage): 0.6V ถึง 2.6V (เป็นสัญญาณอนาล็อก)

ความเจ๋งของมัน: ไมค์ MEMS จะรับเสียงเข้ามา ผ่านวงจรกรองแบบ A-Weighting และเข้าสู่วงจรแปลงสัญญาณเสียง (AC) ให้กลายเป็นแรงดันไฟกระแสตรง (DC) ที่นิ่งสนิท แรงดันขาออกนี้จะแปรผันตรงกับค่าเดซิเบลเลย ทำให้เราไม่ต้องไปเขียนโค้ดคณิตศาสตร์ยากๆ อย่าง DSP หรือ FFT ให้ปวดหัวครับ!

การต่อวงจร (Circuit Connections)

การต่อสายไฟนั้นง่ายสุดๆ ครับ นี่คือข้อดีของอินเทอร์เฟซแบบ Gravity:

  • ฝั่งเซ็นเซอร์: ต่อสายไฟ 5V และ GND จาก Arduino เข้าเซ็นเซอร์ และนำสายสัญญาณ (Signal) ไปเสียบที่ขา A0 ของ Arduino
  • ฝั่งจอ OLED: ต่อ VCC ไปที่ 5V, GND ไปที่ GND, ขา SDA ต่อเข้า A4 และขา SCL ต่อเข้า A5
Circuit Wiring

โค้ด Arduino และการตั้งค่า (Arduino Code)

คุณจำเป็นต้องติดตั้งไลบรารีสำหรับจอ OLED ก่อนครับ โดยเข้าไปที่ Sketch > Include Library > Manage Libraries แล้วค้นหาและติดตั้ง Adafruit SSD1306 (ระบบจะบังคับติดตั้ง Adafruit GFX ให้ด้วยอัตโนมัติ)

Arduino Code Screenshot

จากนั้นคุณสามารถดาวน์โหลดไฟล์โค้ด (dba_meter.ino) ได้ที่ลิงก์ด้านล่างนี้เลยครับ เมื่ออัปโหลดเสร็จแล้ว ลองเปิด Serial Monitor ที่ 115200 baud คุณควรจะเห็นค่าวิ่งอยู่ระหว่าง 30 ถึง 130 dBA (ถ้าอยู่ในห้องเงียบๆ ควรจะอ่านค่าได้ประมาณ 35-45 dBA ครับ)

เจาะลึก: โค้ดทำงานอย่างไร? (How the Code Works)

เนื่องจากเซ็นเซอร์ตัวนี้อาศัยการอ่านค่าแรงดันไฟแบบอนาล็อก (ADC) "ความนิ่งของไฟเลี้ยง" จึงสำคัญมากครับ! แต่ไฟ 5V ของ Arduino บางทีก็แกว่งอยู่ระหว่าง 4.6V ถึง 5.2V ยิ่งถ้าใช้แบตเตอรี่ แรงดันก็จะยิ่งตกลงเรื่อยๆ

เพื่อแก้ปัญหานี้ ในโค้ดจึงมีการใช้ฟังก์ชัน readVcc() เพื่อดึง แรงดันอ้างอิง 1.1V ภายในชิป Arduino (Internal Bandgap) มาใช้เทียบค่า ทำให้เราได้ค่าแรงดันไฟที่แท้จริงในหน่วยมิลลิโวลต์ และทำให้การคำนวณ dB แม่นยำขึ้นมากครับ

นอกจากนี้ โค้ดยังมีการทำ Running Average (ค่าเฉลี่ยเคลื่อนที่) โดยเก็บข้อมูล 10 ตัวอย่างล่าสุดมาหาค่าเฉลี่ย (10 samples x 125ms = 1.25 วินาที) เทคนิคนี้ช่วยกรองสัญญาณรบกวน (Noise) ออกไป ทำให้ตัวเลขบนจอไม่วิ่งแกว่งไปมาจนอ่านไม่รู้เรื่องครับ

View more (ดูสมการการแปลงค่า ADC เป็น dBA / Copy Code)

สมการแปลงค่าก็ตรงไปตรงมาครับ แรงดัน 0.6V ถึง 2.6V จะถูกแมป (Mapping) ให้กลายเป็น 30-130 dBA เป็นเส้นตรงเป๊ะๆ ไม่มีสูตร Polynomial โค้งๆ ให้วุ่นวาย แค่เอาไปคูณ 50 ก็จบเลย (0.6V = 30 dBA, 2.6V = 130 dBA)

dbValue = (analogRead(A0) / 1024.0) * Vref * 50.0; // อธิบายที่มา: Sensitivity ของเซ็นเซอร์ = 100 dB / 2.0V = 50 dB/V

การทดสอบและผลลัพธ์ (Testing and Working)

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

ระบบ Running Average ช่วยให้ตัวเลขบนจอ OLED สมูทมากๆ และไม่มีอาการจอกระพริบ (Flickering) เลยครับ

View more (ดูวิดีโอสาธิตการทดสอบด้วยเสียงสนทนา)

สรุปผล (Conclusion)

Handheld Meter Final

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

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

อัปเกรดทักษะงานประดิษฐ์และเซ็นเซอร์เจ๋งๆ!

อยากประกอบอุปกรณ์วัดค่าต่างๆ ใช้เอง หรือกำลังมองหาบอร์ด Arduino และเซ็นเซอร์ดีๆ อยู่ใช่ไหม? แวะมาพูดคุยและหาซื้อของเล่นสาย Tech กับเราได้เลยครับ!

คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา โปรดอ้างอิงข้อมูลทางเทคนิคและการต่อวงจรโดยละเอียดจากต้นฉบับ
อ้างอิงจาก (References):

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี