ที่มา:
คุณเคยสงสัยไหมว่าซอฟต์แวร์ตัดต่อเสียงสามารถตัดหรือเพิ่มเสียงเบสในการบันทึกได้อย่างไร? หรือหูฟังตัดเสียงรบกวนทำงานอย่างไร? หรือวิศวกรโยธาสามารถออกแบบอาคารและหลีกเลี่ยงความถี่เรโซแนนซ์ของแผ่นดินไหวได้อย่างไร? คำตอบสำหรับคำถามทั้งหมดเหล่านั้นมาจากบุคคลคนเดียว: Joseph Fourier. Fourier ค้นพบวิธีแยกคลื่นที่ซับซ้อนออกเป็นคลื่นไซน์ (sine waves) องค์ประกอบย่อยทางคณิตศาสตร์ ทำให้แต่ละคลื่นสามารถแก้ไขหรือสังเกตได้ทีละส่วน แนวคิดทั่วไป (โดยไม่ลงรายละเอียดทางแคลคูลัส) คือการนำคลื่นมาพันรอบวงกลมเพื่อให้มันวาดเป็นรูปดอกไม้ชนิดหนึ่ง จากนั้นคุณค่อยๆ เพิ่มความถี่ในการพันคลื่นรอบวงกลมนั้น สังเกตรูปร่างที่กราฟวาดซึ่งมีการเปลี่ยนแปลง คุณทำเช่นนี้จนกว่าจะพบความถี่ที่วาดเป็นรูปร่างคล้ายหัวใจ เมื่อคุณพบสิ่งนั้น หมายความว่าความถี่ที่คุณกำลังพันคลื่นรอบวงกลมนั้นเท่ากับความถี่ของหนึ่งในคลื่นไซน์ที่เป็นองค์ประกอบย่อยในคลื่นหลักที่คุณกำลังวิเคราะห์ ผมตัดสินใจสร้างการแสดงทางกายภาพของกระบวนการค้นหาคลื่นไซน์ที่เป็นองค์ประกอบย่อยนั้น
ตัวโปรเจกต์:
แนวคิดที่เรา (Henry Haggart และผม) คิดขึ้นคือการมีวงกลมกระดาษเรืองแสงที่หมุนได้ ซึ่งคุณสามารถควบคุมความเร็วได้ ใต้ linear actuator ที่ติดเลเซอร์สีน้ำเงิน แนวคิดคือ linear actuator ที่มีเลเซอร์จะวาดคลื่นไซน์ในขณะที่คุณเปลี่ยนความเร็วในการหมุนของวงกลม เพื่อพยายามหาจุดที่มันตรงกันและคุณเริ่มวาดรูปหัวใจแทนรูปดอกไม้ สิ่งนี้สามารถทำได้ง่ายๆ โดยการขับเคลื่อน stepper motors สองตัวแยกกัน และใช้สัญญาณอินพุตจาก rotary encoder เพื่อเปลี่ยนความเร็วในการหมุนของวงกลมฐาน ส่วนที่เหลือของการออกแบบทางกายภาพนั้นค่อนข้างพื้นฐาน เนื่องจากเราต้องการเพียงวิธีแขวนเลเซอร์เหนือวงกลมฐานบน linear actuator ที่ผลิตขึ้นเอง ซึ่งเราใช้การตัดด้วยเลเซอร์จาก acrylic
การอธิบายโค้ด:
การเขียนโปรแกรมสำหรับอุปกรณ์นี้ แม้ว่าจะไม่ได้ยากเกินไป แต่ก็มีความท้าทายที่ไม่คาดคิดสำหรับผม ประการแรก ผมไม่เคยทำงานกับ Arduino และ steppers มาก่อน จึงไม่ได้คำนึงถึงกลไกของฟังก์ชัน setSpeed สิ่งที่ความเร็วทำคือเพียงแค่เพิ่ม delay ที่แตกต่างกันระหว่าง step ในโปรแกรม นี่เป็นปัญหาสำหรับเรา เพราะทุกครั้งที่ delay เปลี่ยนในโค้ดสร้างคลื่นไซน์ ความเร็วของวงกลมฐานก็จะเปลี่ยนไปด้วย เนื่องจากใกล้ถึงเวลาจัดแสดงมาก การแก้ไขเฉพาะหน้าคือการใช้ motors ทั้งสองตัวจากบอร์ดที่แตกต่างกันสองบอร์ด นี่เป็นวิธีที่ทำให้โค้ดอ่านง่ายขึ้นมากและ (ที่สำคัญกว่านั้น) debug ได้ง่ายขึ้น อย่างไรก็ตาม ภายหลังผมได้เรียนรู้วิธีการเรียกใช้โค้ดทั้งสองพร้อมกันบน Arduino ตัวเดียวกัน โดยไม่ให้ delay ในฟังก์ชันไซน์ส่งผลต่อ delay ของวงกลมฐาน
นี่คือโค้ด snippet ที่ทำให้เราสามารถทำเช่นนั้นได้:
if ((millis() - previousMillis) >= value){
motor2.step(1, FORWARD, DOUBLE);
previousMillis = millis();
}
ฟังก์ชัน millis() ใน Arduino IDE เป็นฟังก์ชันจับเวลา ดังนั้นค่าของมันจะนับด้วยอัตราคงที่ไม่ว่าคุณจะมี delay ในโค้ดของคุณมากน้อยเพียงใด สิ่งที่ฟังก์ชันนี้ทำคือการตรวจสอบว่าเมื่อใดที่ millis() ได้นับเพิ่มขึ้นตามช่วงที่กำหนด (value หรือความเร็ววงกลมฐานของคุณ) และเมื่อเงื่อนไขนั้นเป็นจริง มันจะทำการขยับ stepper motor ฐานไปข้างหน้าหนึ่ง step
รายละเอียดทางเทคนิคเพิ่มเติม
การวิเคราะห์สัญญาณความเร็วสูง
Fourier Box เป็นเครื่องมือพิเศษสำหรับทำการวิเคราะห์ Fast Fourier Transform (FFT) โดยตรงบนฮาร์ดแวร์ Arduino
- Real-Time Spectrum Engine: เก็บสัญญาณจากไมโครโฟนหรืออินพุตแบบอนาล็อก Arduino ใช้ไลบรารี
arduinoFFTเพื่อแยกคลื่นเสียงที่ซับซ้อนออกเป็นความถี่องค์ประกอบ (20Hz - 10kHz) - Graphic Visualization LCD: แสดงแถบความถี่ 16 แถบที่แตกต่างกันในรูปของแท่งแนวตั้งบน I2C OLED หรือ 20x4 LCD ซึ่งเป็น visualizer ทางกายภาพที่คล้ายกับเครื่องปรับสมดุลเสียงระดับมืออาชีพ
การกำหนดเป้าหมายความถี่
- Resonance Detection: เฟิร์มแวร์สามารถระบุ "Dominant Frequency" ทำให้เป็นเครื่องมือที่มีประโยชน์สำหรับการปรับแต่งเครื่องดนตรี หรือการวินิจฉัยการสั่นสะเทือนของเครื่องจักร