เจ้านี่คือเครื่องดนตรีสุดต๊าชที่ให้เราเล่นโน้ตง่ายๆ แค่โบกมือไปมาในอากาศ!!
ช่วงกักตัวแบบนี้มันชวนเบื่อสุดๆ พวกเราก็เลยคิดอะไรสนุกๆ ขึ้นมาทำกับชิ้นส่วนอิเล็กทรอนิกส์ไม่กี่ชิ้นที่ติดบ้านนี่แหละ
จะมีอะไรดีไปกว่าดนตรีล่ะ จริงมั้ย!!!
และนี่คือผลงานของเรา เซ็ตอัพง่ายๆ สำหรับเล่นดนตรีด้วยมือ! เล่นให้สนุกนะจ๊ะ!!
ไอเดียหลักๆ ก็คือการสร้างเสียงความถี่ต่างๆ ตามตำแหน่งของมือเรา ซึ่งตรวจจับได้ด้วยเซ็นเซอร์อัลตราโซนิก
ต่อวงจรตามแผนภาพด้านล่างนี้เลยค้าบ พอเสร็จก็อปโค้ดที่ให้ไว้ไปวางใน Arduino IDE แล้วอัปโหลดลงบอร์ดได้เลย
วางเซ็นเซอร์ในที่โล่งๆ หน่อยนะ อย่าให้มีอะไรมาขวางหน้าอย่างน้อยซัก 1 เมตร จากนั้นก็เอามือหรือวัตถุอะไรก็ได้มาวางไว้หน้าเซ็นเซอร์เพื่อให้ได้ความถี่เสียงที่เปลี่ยนไป
Spatial Acoustics: The Ultrasonic Theremin
การเล่นเปียโนต้องกดปุ่มจริงๆ ที่ถูกกำหนดโน้ตไว้ตายตัวแล้ว แต่เจ้า Simple Hand Controlled Instrument ตัวนี้เลียนแบบเครื่องดนตรีรัสเซียสุดแปลกประหลาดและน่าขนลุกอย่าง "เทอเรมิน" จากยุค 1920s โดยใช้ซิลิกอนดิจิทัลล้วนๆ แทนที่จะใช้คลื่นวิทยุ อุปกรณ์นี้ใช้การส่งเสียงอัลตราโซนิกเป็นระเบิดออกไปแทน Arduino ของเราจะสร้างกำแพงเสียงขึ้นมาจากเซ็นเซอร์ HC-SR04 เมื่อมือเปล่าของผู้ใช้เข้าใกล้หรือห่างออกไปในอากาศ Arduino ก็จะตรวจจับค่าความห่างที่เปลี่ยนไปแบบฉับพลัน แล้วคำนวณสมการคณิตศาสตร์ซับซ้อนทันที แปลงค่าความยาวเซนติเมตรให้เป็นช่วงความถี่เสียงบริสุทธิ์ผ่าน Piezo Buzzer!
แปลงเซนติเมตรให้เป็นความถี่ (map())
หัวใจหลักของระบบนี้อยู่ที่การแปลงค่าตำแหน่ง (เช่น 5cm ถึง 30cm) ให้เป็นค่าความถี่เฮิรตซ์ที่ได้ยิน (เช่น 200Hz ถึง 1500Hz)
- SR04 ยิงพัลส์ 40Khz ออกไป แล้วดึงค่าตัวแปรระยะทางกลับมา
- Arduino ใช้ฟังก์ชันคณิตศาสตร์สุดทรงพลังอย่าง
map()ที่มีอยู่แล้ว! int note = map(distance, 5, 30, 200, 1500);- ทันทีที่ระยะทางต่ำกว่า 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");
แบบนี้ก็จะเห็นค่าที่วัดได้เป็นเซนติเมตรแล้วจ้า
ลองเล่นกับโปรเจคนี้ให้สนุก แล้วอาจจะเพิ่มลำโพงกับเซ็นเซอร์หลายๆ ตัว เพื่อสร้างเป็นเครื่องดนตรีที่ซับซ้อนและสนุกขึ้นไปอีกก็ได้นะ
สู้งานนะน้อง!