Spatial Acoustics: The Ultrasonic Theremin
ABSTRACT:
โปรเจคนี้เราจะมาออกแบบและสร้างเครื่องดนตรีที่เล่นได้โดยไม่ต้องกดปุ่มอะไรทั้งนั้น! เป้าหมายคือทำอินเตอร์เฟซที่ใช้ง่ายจนใครๆ ก็เล่นได้ แม้แต่มือใหม่หัดเล่น จนถึงระดับโปร ก็เล่นเครื่องดนตรีไร้คีย์นี้ได้สบายๆ
การเล่นเปียโนต้องกดปุ่มที่ถูกตรึงไว้ในแต่ละอ็อกเทฟ แต่ Keyless Musical Instrument ของเราจะจำลองเครื่องดนตรีสุดแปลกและน่าขนลุกจากรัสเซียยุค 1920s อย่าง "เทอเรมิน" ให้กลายเป็นดิจิทัลทั้งหมด! แทนที่จะใช้คลื่นวิทยุ เราใช้คลื่นเสียงอัลตราโซนิคแทน Arduino ของเราจะสร้างกำแพงเสียงด้วยเซ็นเซอร์ HC-SR04 เมื่อมือเปล่าของผู้เล่นโบกเข้า-ออกในอากาศ Arduino จะตรวจจับระยะทางที่เปลี่ยนไปแบบทันทีทันใด แล้วก็คำนวณสมการซับซ้อนเพื่อแปลงระยะทาง (เซนติเมตร) ให้เป็นความถี่เสียงผ่าน Piezo Buzzer!
OBJECTIVE:
ใช้สำหรับเล่นดนตรีโดยไม่ต้องมีปุ่มกด แสดงโน้ตดนตรีที่กำลังเล่นอยู่ แสดงอ็อกเทฟที่กำลังเล่นอยู่ สามารถเปลี่ยนอ็อกเทฟได้ตั้งแต่ อ็อกเทฟ 3 ถึง อ็อกเทฟ 7
METHODOLOGY:
เราแทนที่คีย์หรือสายด้วยแสงเลเซอร์ 8 เส้น แต่ละลำแสงจะตกกระทบโฟโตเรซิสเตอร์ (LDR-Light Dependent Resistor) ที่กำหนดไว้ เมื่อมีสิ่งมาบังแสงเลเซอร์ โฟโตเรซิสเตอร์จะส่งสัญญาณไปที่ Arduino จากนั้น Arduino จะสั่งให้ลำโพงส่งเสียงโทนเฉพาะออกมาผ่านแอมป์ ทำให้เกิดเป็นเสียงดนตรีขึ้นมา เราใส่จอ LCD เพื่อแสดงโน้ตและอ็อกเทฟที่กำลังเล่นอยู่ และใส่ Rotary Encoder สำหรับเปลี่ยนอ็อกเทฟ โดยสามารถปรับได้ตั้งแต่ อ็อกเทฟ 3 ถึง อ็อกเทฟ 7
แปลงเซนติเมตรให้เป็นความถี่ (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);
เอาชนะเสียงเพี้ยนจาก Square Wave
ฟังก์ชัน tone() ของ Arduino มันผลิตคลื่น Square Wave ที่สมบูรณ์แบบทางคณิตศาสตร์ ออกมาเสียงห้าว แรง และโหดร้ายมาก! มันฟังดูเหมือนเสียงเตือนไมโครเวฟราคาถูกจากยุค 80s ไม่ใช่เสียงไวโอลินที่เนียนนุ่มเลย!
- วิธีทำให้เสียงนุ่มขึ้น ก็คือใช้ ตัวเก็บประจุแบบ Low-Pass Filter เป็นตัวช่วยทางกายภาพ!
- โดยการต่อตัวเก็บประจุอิเล็กโทรไลต์
0.1µFหรือ1µFเข้ากับขาบวกและขาลบของ Piezo หรือลำโพง 8 โอห์มแบบจัดหนักเลย มันจะช่วยดูดซับสัญญาณไฟฟ้าความถี่สูงที่แหลมคมจนเกินไป ทำให้ขอบที่ห้าวๆ ของ Square Wave กลายเป็นคลื่นที่กลมขึ้น คล้ายกับ Sine Wave แบบธรรมชาติ!
รายการอุปกรณ์อะคูสติก
- Arduino Uno/Nano (ตัวจัดการไทเมอร์ความถี่ระดับฮาร์ดแวร์ที่ทำงานไม่หยุด)
- เซ็นเซอร์วัดระยะอัลตราโซนิค HC-SR04 (ต้องหันหน้าไปทางที่โล่งเตียน ไม่มีอะไรกีดขวาง)
- Piezo Buzzer แบบ Passive หรือลำโพงมินิ 8 โอห์ม (เดี๋ยวก่อน! ถ้าใช้ Buzzer แบบ Active จะล้มเหลวทันที เพราะมันส่งเสียงบี๊บเดียวที่น่ารำคาญเท่านั้น! ต้องใช้ Buzzer แบบ "Passive" ที่ทำตัวเหมือนลำโพงเปล่าๆ เลย ถึงจะเล่นความถี่ต่างๆ ได้!)
- ตัวเก็บประจุแบบ Low-Pass Filter (ปกติจะใส่หรือไม่ใส่ก็ได้ แต่สำคัญมากถ้าอยากได้เสียงซินธิไซเซอร์ที่ชัดเจนระดับโปร)
วิดีโอการทำงาน:
รูปภาพประกอบ:
