หน้าแรก ดูโปรเจกต์ทั้งหมด
Expert

โปรเจกต์ Fourier Box

การใช้ blue laser และ phosphorescent paper เพื่อแสดงภาพการวาด sine wave รอบ circle

โปรเจกต์ Fourier Box

รายการอุปกรณ์และเครื่องมือ

2x Stepper Motor, Mini Step
-
1x Laser cutter (generic)
🛒 สั่งซื้อ
1x Rotary Encoder with Push-Button
🛒 สั่งซื้อ
2x Development Board, Motor Control Shield
-

รายละเอียดและวิธีทำ

The Background:

เคยสงสัยไหมว่าซอฟต์แวร์ตัดต่อเสียงสามารถตัดหรือเพิ่มเสียงเบสในการบันทึกเสียงได้อย่างไร? หรือหูฟังตัดเสียงรบกวนทำงานอย่างไร? หรือวิศวกรโยธาสามารถออกแบบอาคารให้หลีกเลี่ยงความถี่ resonant ของแผ่นดินไหวได้อย่างไร? คำตอบของคำถามเหล่านี้ทั้งหมดมีต้นกำเนิดมาจากชายคนหนึ่งคือ Joseph Fourier โดย Fourier ค้นพบวิธีการทางคณิตศาสตร์ในการแยกคลื่นที่ซับซ้อนออกมาเป็นส่วนประกอบของ sine wave ซึ่งช่วยให้แต่ละคลื่นสามารถถูกแก้ไขหรือสังเกตแยกกันได้ แนวคิดทั่วไป (โดยไม่ลงลึกถึงแคลคูลัสที่อยู่เบื้องหลัง) คือคุณนำคลื่นนั้นมาพันรอบวงกลมเพื่อให้มันวาดรูปทรงคล้ายดอกไม้ จากนั้นคุณค่อยๆ เพิ่มความถี่ที่คุณพันคลื่นรอบวงกลมนั้น แล้วสังเกตรูปร่างที่กราฟวาดออกมาที่เปลี่ยนไป คุณทำเช่นนี้จนกว่าจะพบความถี่ที่วาดรูปทรงที่ดูเหมือนรูปหัวใจ เมื่อคุณพบสิ่งนั้น แสดงว่าความถี่ที่คุณกำลังพันคลื่นรอบวงกลมนั้นเป็นความถี่เดียวกับหนึ่งในส่วนประกอบ sine wave ในคลื่นหลักที่คุณกำลังวิเคราะห์อยู่ ผมจึงตัดสินใจสร้างแบบจำลองทางกายภาพของกระบวนการค้นหา sine wave เหล่านั้นขึ้นมา

The Project:

ไอเดียที่พวกเรา (Henry Haggart และผม) คิดขึ้นมาคือการมีวงกลมหมุนที่ทำจากกระดาษเรืองแสงซึ่งคุณสามารถควบคุมความเร็วของมันได้ภายใต้ linear actuator ที่มีเลเซอร์สีน้ำเงินติดอยู่ แนวคิดคือให้ linear actuator พร้อมเลเซอร์วาดเส้น sine wave ในขณะที่คุณปรับความเร็วที่วงกลมฐานหมุนเพื่อพยายามหาจุดที่สอดคล้องกันและเริ่มวาดเป็นรูปหัวใจแทนที่จะเป็นรูปดอกไม้ สิ่งนี้สามารถทำได้ง่ายๆ โดยการขับ Stepper Motor สองตัวแยกกัน และใช้ input จาก rotary encoder เพื่อเปลี่ยนความเร็วที่วงกลมฐานหมุน ส่วนการออกแบบทางกายภาพที่เหลือนั้นค่อนข้างพื้นฐาน เนื่องจากเราต้องการเพียงวิธีแขวนเลเซอร์ไว้เหนือวงกลมฐานบน linear actuator ที่สร้างขึ้นเองซึ่งเรา laser cut จากอะคริลิก

Explaining the Code:

การเขียนโปรแกรมให้อุปกรณ์นี้ แม้ว่าจะไม่ยากจนเกินไป แต่ก็มีอุปสรรคที่คาดไม่ถึงสำหรับผม อย่างแรกคือผมไม่เคยใช้งาน Arduino และ Stepper มาก่อน จึงไม่ได้คำนึงถึงกลไกของฟังก์ชัน setSpeed สิ่งที่ความเร็วทำก็คือการเพิ่ม delay ที่แตกต่างกันระหว่าง step ในโปรแกรม ซึ่งเป็นปัญหาสำหรับเรา เพราะทุกครั้งที่ delay ในโค้ดสร้าง sine wave เปลี่ยนไป มันจะไปเปลี่ยนความเร็วของวงกลมฐานด้วย เนื่องจากใกล้ถึงเวลานำเสนอผลงานอย่างกระชั้นชิด วิธีแก้ปัญหาเฉพาะหน้าคือการแยกใช้ Board สองตัวควบคุม Motor สองตัวแยกกัน นี่เป็นวิธีที่ทำให้โค้ดอ่านง่ายขึ้นมาก และที่สำคัญกว่านั้นคือ debug ได้ง่ายขึ้น อย่างไรก็ตาม ในภายหลังผมได้เรียนรู้วิธีการรันโค้ดทั้งสองส่วนพร้อมกันบน Arduino ตัวเดียวกัน โดยไม่ให้ delay ในฟังก์ชัน sine ส่งผลกระทบต่อ delay ในวงกลมฐาน

นี่คือส่วนของโค้ดที่ช่วยให้เราทำสิ่งนั้นได้:

if ((millis() - previousMillis) >= value){
motor2.step(1, FORWARD, DOUBLE);
previousMillis = millis();
}

ฟังก์ชัน millis() ใน Arduino IDE เป็นฟังก์ชันตัวจับเวลา ดังนั้นค่าของมันจะนับด้วยอัตราที่คงที่ ไม่ว่าคุณจะมี delay ในโค้ดอย่างไรก็ตาม สิ่งที่โค้ดนี้ทำคือตรวจสอบว่า millis() นับถึงช่วงเวลาที่กำหนดแล้วหรือยัง (value หรือความเร็วของวงกลมฐาน) และเมื่อเงื่อนไขนั้นตรงตามที่กำหนด มันจะเลื่อนฐาน Stepper Motor ไปข้างหน้าหนึ่ง step

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: fourier-box-2e9779
2450 บาท
PromptPay QR Code