โปรเจคนี้มันคืออะไรวะ?
นี่คือเจ้า "สามเหลี่ยม" ตัวนี้แหละ มันจะพยายามทรงตัวให้ได้ด้วยตัวเอง โดยใช้เซนเซอร์และแอคชูเอเตอร์ที่ติดตั้งอยู่บนตัวมัน
ทำไมถึงอยากทำมันขึ้นมาล่ะ?
ก็อยากลองสร้างหุ่นยนต์ทรงตัวแบบไม่ใช้ IMU อย่าง MPU-6050 ไงล่ะน้อง เปลี่ยนมาใช้เซนเซอร์อัลตราโซนิคธรรมดาๆแทน มาดูกันว่าทำได้มั้ย!
มันทำงานยังไง?
หลักการก็คือ สามเหลี่ยมกลับหัว นั่นเอง โดยใช้การถ่วงน้ำหนักด้วยเซอร์โวมอเตอร์เพื่อให้มันทรงตัวได้ และใช้เซนเซอร์อัลตราโซนิคตรวจจับทิศทางที่มันกำลังจะล้ม
เวลามันตั้งตรง จุดศูนย์ถ่วง (Center of Gravity - CG) จะอยู่เหนือฐานพอดี แต่ถ้ามันเริ่มเอียงซ้าย CG ก็จะเลื่อนไปทางซ้ายด้วย ถ้าเลยฐานออกไป มันก็ล้มซะงั้น ทางขวาก็เหมือนกัน
วิธีแก้ก็คือ เราใส่ เซอร์โวมอเตอร์ เข้าไป พร้อมกับน้ำหนักถ่วงที่เพลาของมัน
ทีนี้ถ้าสามเหลี่ยมเริ่มเอียงไปทางนึง เซอร์โวมอเตอร์ก็จะเคลื่อนน้ำหนักไปทางตรงกันข้ามทันที ทำให้ CG รวมของระบบยังอยู่ที่เดิม มันก็เลยไม่ล้มไงล่ะ ง่ายมั้ยล่ะ!
ลงลึกกันหน่อย (Technical Details)
ฟิสิกส์ของสามเหลี่ยมกลับหัว:
- พลวัตของจุดศูนย์ถ่วง (CG Dynamics): พอตัวโครงสร้างหมุนออกจากแกนตั้ง CG มันจะเลื่อนออกนอกฐาน ทำให้เกิด "โมเมนต์การล้ม (Tipping Moment)" ระบบต้องสร้างแรงบิดที่เท่ากันและตรงข้ามมาหักล้าง
- การถ่วงน้ำหนักแบบไดนามิก (Kinetic Counterbalancing): โปรเจคนี้ใช้ลิงค์โลหะที่ขับด้วยเซอร์โว พอเคลื่อนน้ำหนักนี้ไปในทิศทางที่กำลังล้ม CG รวมของระบบทั้งหมดจะถูกดึงกลับมาที่แกนกลางอีกครั้ง ($M_{total} = M_{body} + M_{counterweight}$) ทฤษฎีคือมันจะคืนสภาพเสถียรภาพให้
การรับรู้แบบไม่ใช้ความเร่ง (Non-Inertial Feedback):
- การคำนวณมุมเอียงด้วยตรีโกณ (Trigonometric Tilt Calculation): เซนเซอร์ HC-SR04 ติดอยู่ที่ "ปีก" ของหุ่น พอหุ่นเอียง ระยะห่างจากเซนเซอร์ถึงพื้นก็เปลี่ยนไป Arduino ก็สามารถคำนวณมุมเอียงจากความต่างของระยะนี้ได้ โดยไม่ต้องใช้ accelerometer เลย
- ความล่าช้าจากเสียง (Acoustic Latency): ไม่เหมือน IMU แบบซิลิกอน เซนเซอร์อัลตราโซนิคอาศัยความเร็วเสียง มันเลยทำให้เกิด เฟสแล็ก (phase lag) เล็กน้อยในลูปฟีดแบ็ก ซึ่งเป็นตัวแปรสำคัญเวลาเราปรับแต่งอัลกอริทึมทรงตัวความเร็วสูงนะ อย่าลืม!
ลำดับการควบคุม (Logical Control Flow):
- อัลกอริทึมแก้ไขทิศทาง (Directional Correction Algorithm): เฟิร์มแวร์ทำงานบนหลักการง่ายๆแต่ได้ผล: ถ้า
ระยะทาง > ค่าที่ตั้งไว้(หุ่นกำลังล้มซ้าย) ก็ให้เซอร์โวเคลื่อนที่ไปขวาตรรกะ "แรงต้าน" แบบนี้แหละที่เป็นพื้นฐานของระบบทรงตัวแบบลูปปิด (closed-loop stabilization) ทั้งหลายเลย จัดไปวัยรุ่น!
ขั้นตอนการทำ
หาถังกระดาษเก่ามาใช้

ไปหาถังกระดาษเก่ามาสักกล่อง ตัดตามขนาดที่ต้องการ จากนั้นพับให้เป็นรูปปริซึม แล้วใช้เทปติดให้แน่น นี่จะเป็นตัวเรือนหรือลำตัว (fuselage) ของหุ่นยนต์ เราจะติดเซอร์โวมอเตอร์ไว้ด้านบน ส่วนปีกจะเสียบเข้าไปด้านข้าง
ตัดปีก

จากกล่องกระดาษเดียวกันนี่แหละ ตัดออกมาสองชิ้นยาวๆ สำหรับทำปีก
ต่อปีกเข้ากับลำตัว

เจาะรูทั้งสองข้างของลำตัว ขนาดของรูต้องเท่ากับขนาดของปีกที่ตัดไว้
เจาะรูบนลำตัว

ใช้เซนเซอร์อัลตราโซนิกเป็นต้นแบบ ทำเครื่องหมายบนปีก จากนั้นก็ตัดตามรอยที่ทำไว้ เซนเซอร์จะถูกเสียบเข้าไปในรูพวกนี้
เซนเซอร์อัลตราโซนิก

เตรียมเซนเซอร์อัลตราโซนิกสองตัว เอาไว้สองตัวจริงๆนะ แต่ตัวที่สองนี่เอาไว้ถ่วงน้ำหนักเฉยๆ ไม่ได้ต่อวงจร
เสียบเซนเซอร์อัลตราโซนิก

เสียบเซนเซอร์เหล่านี้เข้าไปในรูที่เจาะไว้บนปีก
หลังจากเสียบเซนเซอร์แล้ว

หน้าตามันจะเป็นแบบนี้หลังจากเสียบเซนเซอร์บนปีกทั้งสองข้างแล้ว
เซอร์โวมอเตอร์พร้อมลิงค์ที่ติดไว้

หยิบเซอร์โวมอเตอร์มา จากนั้นก็เอาลิงค์โลหะยาวๆมาติดเข้ากับฮอร์นบนเซอร์โวมอเตอร์ จะเอาน้ำหนักมาถ่วงเพิ่มที่ลิงค์นี้ก็ได้
เจาะรูบนลำตัว (อีกแล้ว)

เจาะรูบนลำตัวเพื่อติดตั้งเซอร์โวมอเตอร์
หลังจากติดเซนเซอร์และแอคชูเอเตอร์ทั้งหมดแล้ว

ติดเซอร์โวมอเตอร์เข้ากับลำตัวด้วยเชือก/สายรัด/ลวด
วิศวกรรมและการนำไปใช้
- การตอบสนองและแรงบิดของแอคชูเอเตอร์: เซอร์โวมอเตอร์ SG90 ทำหน้าที่เป็น "กล้ามเนื้อ" ของระบบ เพราะเซอร์โวมอเตอร์เป็นแอคชูเอเตอร์แบบเกียร์ มันให้แรงบิดในการยึดเกาะที่มากเพียงพอ เพื่อให้แน่ใจว่าน้ำหนักถ่วงจะอยู่ตำแหน่งเดิม แม้แรงโน้มถ่วงจะพยายามดึงหุ่นยนต์ลงมา
- การลดน้ำหนักโครงสร้าง: การใช้ลำตัวจากกล่องกระดาษเก่าเป็นทางเลือกทางวิศวกรรมที่ตั้งใจไว้ การรักษามวลของตัวเรือนหลักให้ต่ำ ($m_{body}$) ทำให้อิทธิพลสัมพัทธ์ของน้ำหนักถ่วงจากเซอร์โว ($m_{weight}$) มีค่าสูงสุด ซึ่งจะเพิ่ม อำนาจการควบคุม (Control Authority) ของระบบ
แผนภาพวงจรและการจำลองบน TinkerCAD

นี่คือแผนภาพวงจรของสามเหลี่ยมทรงตัวตัวเอง
การเชื่อมต่อกับไมโครคอนโทรลเลอร์


เขียนโค้ดและอัปโหลดลงไมโครคอนโทรลเลอร์ได้เลย
โค้ดควรมีตรรกะแบบนี้: เมื่อไหร่ที่สามเหลี่ยมเอียงไปทางซ้าย ให้ขยับลิงค์ไปทางขวา และเมื่อไหร่ที่สามเหลี่ยมเอียงไปทางขวา ให้ขยับลิงค์ไปทางซ้าย เพื่อถ่วงสมดุล
หลักการทำงาน
ตอนที่สามเหลี่ยมตั้งตรงอยู่ จุดศูนย์ถ่วง (CG) ของมันจะอยู่เหนือฐานพอดี
แต่ถ้าสามเหลี่ยมเอียงไปทางซ้าย จุด CG ก็จะเลื่อนไปทางซ้ายด้วย และเมื่อมันเลยฐานออกไป สามเหลี่ยมก็จะล้มลงทันที ทางขวาก็เหมือนกัน
เราเลยเพิ่มเซอร์โวมอเตอร์เข้าไป พร้อมกับติดน้ำหนักถ่วงไว้ที่เพลา ทีนี้ถ้าสามเหลี่ยมเริ่มเอียงไปทางใดทางหนึ่ง เซอร์โวมอเตอร์จะขยับน้ำหนักไปทางตรงกันข้ามทันที ทำให้จุด CG รวมของระบบยังคงอยู่ที่เดิม
สู่สมดุลสมบูรณ์แบบ (PID)
เวอร์ชันปัจจุบันอาจใช้แค่ลอจิกพื้นฐาน แต่ก็เป็นบันไดสำคัญไปสู่การควบคุมแบบ PID (Proportional-Integral-Derivative) เลยนะ รุ่นต่อไปเราจะใช้ความเร็วของ Uno มาคำนวณ derivative เพื่อลดการ "สั่นโคลง" ที่มักเจอในงานทรงตัวแบบเซนเซอร์เดียว
สรุป
ตอนนี้เรายังทรงตัวสามเหลี่ยมไม่ได้เต็มที่ แต่ไม่เป็นไร! เราจะกลับไปปรับปรุงต่อ เพื่อให้รุ่นหน้าได้สมดุลสมบูรณ์แบบ
Equilibrium-Tri คือหลักฐานชิ้นสำคัญของปรัชญา "ล้มเร็ว เรียนรู้เร็วกว่า" ในโลกหุ่นยนต์ ถ้าเข้าใจความสัมพันธ์ระหว่าง แรงบิดจากความเฉื่อย (Inertial Torque) กับ การตอบสนองเชิงเสียง (Acoustic Feedback) ได้ล่ะก็ น้องจะเริ่มเห็นคณิตศาสตร์ซับซ้อนที่ใช้ควบคุมระบบไม่เสถียรให้ทรงตัวได้อย่างสมบูรณ์แบบ
สู้งานนะน้อง!
วิดีโอสาธิตเต็ม