จัดไปวัยรุ่น! นี่คือ MicroLab Arduino Radar ที่พวกพี่ปั่นกันขึ้นมาในแลป MicroLab ตัวนี้ประกอบไปด้วย:
1. ไมโครคอนโทรลเลอร์ตัวจิ๋ว Arduino pro
2. มอเตอร์สเต็ป 2 เฟสของ Microcon ที่ตั้งให้หมุนได้ 360 องศาแบบต่อเนื่อง และมีสวิตช์สำหรับเปิด/ปิด
3. บอร์ด Bluetooth shield สำหรับ Arduino เพื่อให้ไมโครคอนโทรลเลอร์คุยกับคอมได้ ไว้ส่งโค้ด
4. สวิตช์เปิด/ปิด
5. แบตเตอรี่ลิเธียมไอออน 3 ก้อน (ก้อนละ 3000mAh) สำหรับจ่ายไฟให้มอเตอร์และไมโครคอนโทรลเลอร์
6. ซอฟต์แวร์ Processing 3 สำหรับสร้างภาพเรดาร์บนหน้าจอ
7. ซอฟต์แวร์ Arduino IDE
8. เซ็นเซอร์วัดระยะอัลตราโซนิก (Ultrasonic distance sensor) สำหรับ Arduino จำนวน 2 ตัว
9. บอร์ดขับมอเตอร์สเต็ป DRV8825 Stepper Motor Driver Carrier, High Circle 1 ตัว
10. ฐานยืนที่พิมพ์จากเครื่องพิมพ์ 3D
ขอขอบคุณ Petr Zverina ที่ช่วยพิมพ์ฐาน 3D ให้พวกพี่ด้วยนะ สุดยอดไปเลย!
Dual-Acoustic Stereoscopic Rendering: เรดาร์ 360 องศา
ปัญหาของเซ็นเซอร์อัลตราโซนิกตัวเดียวที่ส่ายไปมาคือ มันจะสร้างจุดบอดใหญ่โต 180 องศา และเสียเวลาสแกนพื้นที่ว่างเปล่าไปฟรีๆ เรดาร์สองเซ็นเซอร์ ตัวนี้จัดการปัญหานั้นได้หมดจด ด้วยการติดตั้งเซ็นเซอร์แบบสเตอริโอสโคปิกคู่! โดยการติดเซ็นเซอร์ HC-SR04 สองตัวแบบหันหลังชนกันบนฐานเซอร์โวที่หมุนได้ต่อเนื่อง Arduino จะส่งพัลส์ไปที่เซ็นเซอร์ทั้งคู่ รวบรวมข้อมูลตำแหน่งในพื้นที่แบบ 3 มิติได้ทั้งห้อง 360 องศา และเร็วขึ้นเป็นสองเท่า! จากนั้นก็ส่งข้อมูลดิบเลขฐานสิบหกนี้ผ่าน USB ไปยังจอแสดงผลที่สร้างด้วย Java Processing ซึ่งเลียนแบบคอนโซลเรดาร์ทางการทหารได้เป๊ะเวอร์!
วิธีป้องกันการชนกันของคลื่นเสียงแบบมว๊ากมว๊าก
การยิงพัลส์เสียง 40,000 เฮิรตซ์จากเซ็นเซอร์สองตัวในเวลาเดียวกันคือหายนะระดับชาติ! คลื่นที่สะท้อนจากเซ็นเซอร์ A จะวิ่งเข้าหาไมโครโฟนของเซ็นเซอร์ B พังข้อมูลจาก pulseIn() เรียบร้อย!
- Arduino ต้องยิงพัลส์ที่เซ็นเซอร์ด้านหน้า (Front Sensor) คำนวณค่า แล้วหยุดระบบทั้งหมดเป็นเวลา
30 มิลลิวินาทีเพื่อให้คลื่นเสียงสลายตัวไปก่อน - จากนั้นค่อยยิงพัลส์ที่เซ็นเซอร์ด้านหลัง (Rear sensor) อย่างรุนแรง!
- สตริงที่ส่งไปให้ PC จะมีหน้าตาแบบนี้:
"มุม,ระยะด้านหน้า,ระยะด้านหลัง"(เช่น120,54,12)
void loop() {
for(int angle = 0; angle <= 180; angle++) {
radarServo.write(angle); // ส่ายฐานไป!
delay(30);
int distFront = executeSonarPing(TRIG_F, ECHO_F);
delay(20); // ดีเลย์บังคับ รอคลื่นเสียงกระจายตัว! ห้ามช็อตนะตัวนี้
int distRear = executeSonarPing(TRIG_R, ECHO_R);
// ยิงข้อมูลพิกัด 3D ลง Serial Pipeline โลด!
Serial.print(angle);
Serial.print(",");
Serial.print(distFront);
Serial.print(",");
Serial.println(distRear);
}
}
The GUI Processing Visual Mapping Engine
Arduino มันตาบอดสนิทเลยจ้า มันเห็นแต่ตัวเลขกับสมการ! ส่วน Java Processing IDE นี่แหละที่ทำหน้าที่วาดแผนที่เรดาร์ให้เรา โดยใช้การแปลงพิกัดจาก Cartesian ไปเป็น Polar (คาร์ทีเซียนเป็นโพลาร์)!
- แอป Processing จะแยกสตริง
"120,54,12"ออกเป็นส่วนๆ อย่างละเอียด - มันใช้ฟังก์ชันตรีโกณฯ
cos()กับsin()ในการคำนวณเพื่อวางพิกเซลสีแดงสดใสลงบนหน้าจอได้อย่างแม่นยำ สะท้อนภาพเรขาคณิต 3 มิติของห้องนอนแบบเรียลไทม์! - เพราะเรามีเซ็นเซอร์สองตัว แอป Java จะพล็อตค่า
FrontDistที่มุม120พร้อมกับแมปค่าRearDistที่มุม120 + 180(มุม 300) ไปพร้อมกัน ทำให้ได้แผนที่ 360° สมบูรณ์แบบจากแค่การกวาด 180°!
Deep Scanning Hardware Needs
- Arduino Uno/Nano (เจ้าใหญ่คุมท่อ USB Host)
- HC-SR04 Ultrasonic Sonar Modules 2 ตัว (ต้องติดตั้งโดยหันหน้าไปคนละทาง 180 องศาพอดี บนแกนหมุนเดียวกัน)
- เซอร์โว SG90 หรือ MG996R แรงๆ (จำเป็นสำหรับการกวาดสแกนแบบลื่นไหล)
- แอปพลิเคชัน Processing IDE (รันบน PC เพื่อคอมไพล์และเรนเดอร์กราฟิกพล็อตพิกัดตรีโกณฯ แบบจัดเต็ม)