กลับไปหน้ารวมไฟล์
simple-hand-controlled-instrument-372bfc.md

ดูคลิปตัวอย่างการทำงานเลยจ้า!!!

เจ้านี่คือเครื่องดนตรีสุดต๊าชที่ให้เราเล่นโน้ตง่ายๆ แค่โบกมือไปมาในอากาศ!!

ช่วงกักตัวแบบนี้มันชวนเบื่อสุดๆ พวกเราก็เลยคิดอะไรสนุกๆ ขึ้นมาทำกับชิ้นส่วนอิเล็กทรอนิกส์ไม่กี่ชิ้นที่ติดบ้านนี่แหละ

จะมีอะไรดีไปกว่าดนตรีล่ะ จริงมั้ย!!!

และนี่คือผลงานของเรา เซ็ตอัพง่ายๆ สำหรับเล่นดนตรีด้วยมือ! เล่นให้สนุกนะจ๊ะ!!

ไอเดียหลักๆ ก็คือการสร้างเสียงความถี่ต่างๆ ตามตำแหน่งของมือเรา ซึ่งตรวจจับได้ด้วยเซ็นเซอร์อัลตราโซนิก

ต่อวงจรตามแผนภาพด้านล่างนี้เลยค้าบ พอเสร็จก็อปโค้ดที่ให้ไว้ไปวางใน Arduino IDE แล้วอัปโหลดลงบอร์ดได้เลย

วางเซ็นเซอร์ในที่โล่งๆ หน่อยนะ อย่าให้มีอะไรมาขวางหน้าอย่างน้อยซัก 1 เมตร จากนั้นก็เอามือหรือวัตถุอะไรก็ได้มาวางไว้หน้าเซ็นเซอร์เพื่อให้ได้ความถี่เสียงที่เปลี่ยนไป

Spatial Acoustics: The Ultrasonic Theremin

การเล่นเปียโนต้องกดปุ่มจริงๆ ที่ถูกกำหนดโน้ตไว้ตายตัวแล้ว แต่เจ้า Simple Hand Controlled Instrument ตัวนี้เลียนแบบเครื่องดนตรีรัสเซียสุดแปลกประหลาดและน่าขนลุกอย่าง "เทอเรมิน" จากยุค 1920s โดยใช้ซิลิกอนดิจิทัลล้วนๆ แทนที่จะใช้คลื่นวิทยุ อุปกรณ์นี้ใช้การส่งเสียงอัลตราโซนิกเป็นระเบิดออกไปแทน Arduino ของเราจะสร้างกำแพงเสียงขึ้นมาจากเซ็นเซอร์ HC-SR04 เมื่อมือเปล่าของผู้ใช้เข้าใกล้หรือห่างออกไปในอากาศ Arduino ก็จะตรวจจับค่าความห่างที่เปลี่ยนไปแบบฉับพลัน แล้วคำนวณสมการคณิตศาสตร์ซับซ้อนทันที แปลงค่าความยาวเซนติเมตรให้เป็นช่วงความถี่เสียงบริสุทธิ์ผ่าน Piezo Buzzer!

แปลงเซนติเมตรให้เป็นความถี่ (map())

หัวใจหลักของระบบนี้อยู่ที่การแปลงค่าตำแหน่ง (เช่น 5cm ถึง 30cm) ให้เป็นค่าความถี่เฮิรตซ์ที่ได้ยิน (เช่น 200Hz ถึง 1500Hz)

  1. SR04 ยิงพัลส์ 40Khz ออกไป แล้วดึงค่าตัวแปรระยะทางกลับมา
  2. Arduino ใช้ฟังก์ชันคณิตศาสตร์สุดทรงพลังอย่าง map() ที่มีอยู่แล้ว!
  3. int note = map(distance, 5, 30, 200, 1500);
  4. ทันทีที่ระยะทางต่ำกว่า 5cm หรือเกิน 30cm Arduino ต้องสั่งหยุดเสียงทันทีเพื่อป้องกันเสียงแปลกประหลาด (noTone())
int distance = getDistance(); // Returns the exact CM measurement!

if (distance >= 5 && distance <= 30) {
  // Constrain limits to prevent bizarre glitches!
  int rawFreq = map(distance, 5, 30, 261, 1046); // Map CM into Middle C up to High C!
  
  // Fire the hardware Timer array to generate the explicit square wave Hz!
  tone(BUZZER_PIN, rawFreq); 
} else {
  // Silence! Hand is outside the play area!
  noTone(BUZZER_PIN); 
}

// Intense delay limits the math loop so the tone isn't constantly stuttering!
delay(40); 

ในโค้ดที่ให้มา เสียงจะถูกส่งออกมาเป็นช่วงเวลาคงที่และระยะเวลาคงที่ น้องๆ สามารถลองเล่นกับตรงนี้ได้โดยเปลี่ยนค่าตัวแปร 'tim' และ 'space' ดู

นอกจากนี้ ลองปรับเปลี่ยนวิธีคำนวณความถี่จากระยะทางดูก็ได้นะ ตัวอย่างในโค้ดคือ:

tones =20+distance*5;

เอาชนะเสียงเพี้ยนจากคลื่นสี่เหลี่ยม (Square Wave)

ฟังก์ชัน tone() ของ Arduino มันผลิตคลื่นสี่เหลี่ยม (Square Wave) ที่สมบูรณ์แบบทางคณิตศาสตร์ ออกมาเสียงห้าวๆ ดุดันๆ เหมือนเสียงเตือนไมโครเวฟรุ่นโบราณยุค 80s เลยอะน้อง! ไม่ได้นุ่มลึกเหมือนไวโอลินซะหน่อย!

  • วิธีทำให้เสียงนุ่มขึ้น ก็คือต้องใช้ ตัวเก็บประจุแบบกรองความถี่ต่ำ (Low-Pass Filter Capacitor) เป็นตัวช่วยทางกายภาพ!
  • โดยการต่อตัวเก็บประจุ 0.1µF หรือ 1µF (แบบอิเล็กโทรไลต์) เข้ากับขาบวกและขาลบของเพียโซหรือลำโพง 8 โอห์มแบบจัดหนัก ตัวเก็บประจุจะดูดซับสัญญาณไฟฟ้าความถี่สูงที่แหลมคมจนเกินไป ทำให้ขอบคมของคลื่นสี่เหลี่ยมถูกทำให้มนขึ้น จนกลายเป็นคลื่นที่คล้ายกับไซน์เวฟ (Sine Wave) แบบธรรมชาติมากขึ้น!

รายการอุปกรณ์หลัก (Acoustical Hardware Matrices)

  • บอร์ด Arduino Uno/Nano (ทำหน้าที่ควบคุมตัวจับเวลา (timers) ทางฮาร์ดแวร์ให้ทำงานต่อเนื่องแบบไม่รู้จักเหนื่อย).
  • เซ็นเซอร์วัดระยะอัลตราโซนิค HC-SR04 (ต้องหันหน้าไปทางที่โล่งเตียน ไม่มีอะไรมาบังนะน้อง ไม่งั้นอ่านค่าผิด!).
  • ออดเพียโซแบบแพสซีฟ (Passive Piezo Buzzer) หรือลำโพงมินิ 8 โอห์ม (เดี๋ยวก่อน! ถ้าใช้ออดแบบแอคทีฟ (Active Buzzer) มันจะล้มเหลวทันที เพราะมันส่งเสียงบี๊บๆ แค่ความถี่เดียวที่น่ารำคาญ! ต้องใช้แบบ "แพสซีฟ" เท่านั้น ซึ่งมันทำงานเหมือนลำโพงเปล่าๆ ที่สามารถเล่นเสียงความถี่ต่างๆ ได้!).
  • ตัวเก็บประจุแบบกรองความถี่ต่ำ (Low-Pass Filter Capacitor) (ปกติแล้วไม่จำเป็นต้องมีก็ได้ แต่สำคัญมากถ้าอยากได้เสียงชัดเจนแบบมืออาชีพ).

ถ้าอยากเห็นค่าที่เซ็นเซอร์วัดระยะได้เป็นตัวเลข ก็ให้เพิ่มโค้ดต่อไปนี้ใน void setup

Serial.begin(9600); // Serial Communication is starting with 9600 of baudrate speed
 Serial.println("Project by theriveroars"); // print some text in Serial Monitor to indicate setup

และโค้ดต่อไปนี้ใน void loop

Serial.print("Distance to obstacle= ");
 Serial.print(distance);
 Serial.println(" cm");

แบบนี้ก็จะเห็นค่าที่วัดได้เป็นเซนติเมตรแล้วจ้า

ลองเล่นกับโปรเจคนี้ให้สนุก แล้วอาจจะเพิ่มลำโพงกับเซ็นเซอร์หลายๆ ตัว เพื่อสร้างเป็นเครื่องดนตรีที่ซับซ้อนและสนุกขึ้นไปอีกก็ได้นะ

สู้งานนะน้อง!

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

apps:
  - "1x Arduino IDE"
author: "theriveroars"
category: "Audio & Sound"
components:
  - "1x Jumper wires (generic)"
  - "1x Arduino UNO"
  - "1x Speaker, Mini"
  - "1x Breadboard (generic)"
  - "1x Ultrasonic Sensor - HC-SR04 (Generic)"
description: "มาประดิษฐ์เครื่องดนตรีสุดเท่ด้วยตัวเองกัน! แค่โบกมือไปมาในอากาศ ก็เล่นเป็นเพลงได้เลย งานง่ายแต่หล่อ ใช้ Arduino กับเซนเซอร์วัดระยะ จัดไปแบบวัยรุ่นๆ"
difficulty: "Easy"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX192iAaOFV3bsvHlcrrQfkOBKE86F1Wm0DDKqelAwt9I3x5TrsoLAGHSdyeVRzk/gKrqZ4v3zb2Dmas7YKGK+Id6TyHvQRH2SKw="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/simple-hand-controlled-instrument-372bfc_cover.jpg"
lang: "en"
likes: 8
passwordHash: "772c62f871ca8459b7f088d2fca914e8547dbdc19084ba5e708d350ceb6600a8"
price: 1499
seoDescription: "Build a DIY Simple Hand controlled instrument and play music by moving your hands in the air with Arduino."
tags:
  - "audio"
  - "music"
  - "piano"
  - "games"
title: "ออเคสตร้ามือลอย ควบคุมด้วยเซนเซอร์ง่ายๆ"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/yWOcTaAYIRs"
views: 10497