บังคับรถ Arduino ด้วยมือถือ
นี่คือผลงานเล็กๆ ของพี่ที่อยากแบ่งปันให้วงการรถ Arduino บังคับไร้สาย งานนี้พี่สร้างรถขึ้นมาด้วย Arduino ONE ซอฟต์แวร์ควบคุม Arduino เขียนด้วย Arduino IDE ส่วนโค้ดรีโมทคอนโทรลเลอร์เขียนด้วย Qt Creator แอปมือถือก็สามารถสร้างและดาวน์โหลดลงมือถือ Android ได้ด้วย Qt Creator เช่นกัน
จุดเล็กๆ ที่ต่างจากโปรเจคอื่นคือ รถคันนี้สามารถรับคำสั่งความเร็วเป็นเมตรได้ และหุ่นยนต์ก็จะตอบกลับด้วยความเร็วปัจจุบันเป็นเมตรเหมือนกัน อีกอย่างคือ มันพยายามรักษาทิศทางที่กำหนดไว้ด้วยความช่วยเหลือของเข็มทิศ
เป้าหมายของโปรเจคนี้คือการสามารถควบคุมทิศทางและความเร็วของรถที่ใช้ Arduino จากมือถือ รถควรทำตามคำสั่งที่ได้รับจากมือถือและหลบหลีกสิ่งกีดขวาง; เมื่อใดก็ตามที่มีวัตถุเข้ามาใกล้เกินไป หุ่นยนต์จะเลี้ยวหลบมัน และดำเนินต่อด้วยความเร็วที่ตั้งไว้ก่อนหน้านี้ในทิศทางใหม่
การประกอบรถ
พี่ใช้โครงรถสำเร็จรูปที่มาพร้อมล้อและมอเตอร์ หุ่นยนต์ที่ประกอบและเดินสายเสร็จสมบูรณ์แล้วสามารถดูได้จากภาพต่อไปนี้


ฮาร์ดแวร์
ใช้เข็มทิศเพื่อประเมินทิศทางปัจจุบันให้สอดคล้องกับทิศทางที่ได้รับจากมือถือ ความเร็ววัดด้วยเซ็นเซอร์ IR ตามที่เห็นในภาพด้านบน
เซ็นเซอร์อัลตราซาวด์ช่วยตรวจจับสิ่งกีดขวางและหลบหลีกมัน ส่วนการสื่อสารกับมือถือ (หรือคอมพิวเตอร์) ทำผ่านโมดูลบลูทูธ HC-05 ใช้เข็มทิศเพื่อให้หุ่นยนต์รักษาทิศทางที่กำหนดไว้
แผนภาพต่อไปนี้แสดงวิธีการเชื่อมต่อองค์ประกอบทั้งหมดกับ Arduino

รายละเอียดเทคนิคแบบจัดเต็ม
รถบลูทูธตรวจจับการชน นี้รวมสองทฤษฎีพื้นฐานของหุ่นยนต์เข้าด้วยกัน: การควบคุมจากมนุษย์ (Human Teleoperation) และการแทรกแซงอัตโนมัติ (Autonomous Override) น้องจะเป็นคนขับโดยใช้มือถือ Android แต่ Arduino จะทำหน้าที่เป็นระบบความปลอดภัยแอคทีฟ
การขับกระแสสูง (L298N)
เพราะว่าโมดูลบลูทูธ, เซ็นเซอร์, และออด ใช้กระแสค่อนข้างมาก บอร์ดขับมอเตอร์ (Motor Driver) จึงเป็นตัวจัดการโหลดหนักนี้ โมดูล L298N ถูกติดตั้งระหว่างแบตเตอรี่กับมอเตอร์ตัวรถ ตามที่เห็นในแผนภาพเดินสายด้านบน
การแยกคำสั่งสาย Serial และตรรกะการชน
แอปมือถือจะส่งคำสั่งที่เป็นข้อความมาอย่างต่อเนื่อง
- การรับสัญญาณ: ตัวรับสัญญาณบลูทูธ HC-05 ถูกต่อสายเข้ากับพิน `RX` และ `TX` บน Arduino Uno
- การตรวจสอบการแทรกแซง: ก่อนที่ Arduino จะอ่านพิน `RX` ของบลูทูธ มันจะส่งสัญญาณไปยังเซ็นเซอร์อัลตราซาวด์ HC-SR04 ที่ด้านหน้า
- ตรรกะการเบรก:
- `if (distance > safe_threshold)`: อ่านบลูทูธและดำเนินการคำสั่งจากมือถือ
- `if (distance <= safe_threshold)`: Arduino จะขัดจังหวะคำสั่ง มันจะสั่งให้มอเตอร์ถอยหลังสั้นๆ เพื่อลดความเร็ว จากนั้นจึงหยุด
- เสียงเตือน: ออดพีโซ (Piezo Buzzer) จะส่งเสียงเตือน บอกผู้ใช้ว่ารถได้ยึดการควบคุมเพื่อป้องกันการชนแล้ว
พี่ทำการทดลองชุดนึงเพื่อประมาณค่าเส้นโค้งแปลงระหว่างเมตรต่อวินาทีและรอบการหมุนของล้อ ขึ้นอยู่กับค่า PWM ที่ตั้งให้แต่ละมอเตอร์ ด้วยวิธีนี้ เราสามารถประมาณความเร็วของแต่ละมอเตอร์แยกกันได้

โปรโตคอลการสื่อสาร (Communication Protocol)
รถกับมือถือคุยกันด้วยโปรโตคอลแบบสั่งงาน-ตอบกลับ (command–response protocol) โดยแต่ละคำสั่งและคำตอบจะถูกเข้ารหัสเป็นเฟรมหน้าตาแบบนี้:
< X p0 … pn >
โดยที่:
< → คือสัญลักษณ์เริ่มเฟรม
X → คือรหัสคำสั่งหรือการตอบกลับ
p0 … pn → คือพารามิเตอร์ของคำสั่งหรือค่าของคำตอบ
> → คือสัญลักษณ์จบเฟรม
พอแอปและหุ่นยนต์เริ่มทำงาน แอปต้องเชื่อมต่อกับหุ่นยนต์ก่อน โดยเปิดช่องสื่อสารบลูทูธ แล้วส่งคำสั่งเปิดใช้งาน (<A>) เพื่อบังคับให้หุ่นยนต์เริ่มเก็บข้อมูลสถานะของตัวเอง (ความเร็วและทิศทาง) และพร้อมรับคำสั่งต่อไป จัดไปวัยรุ่น!
การควบคุมรถ
โค้ดในรถจะถูกเขียนให้มี "พฤติกรรม (behaviours)" เพื่อตอบสนองต่อสถานการณ์ต่างๆ ที่หุ่นยนต์อาจเจอ โดยแต่ละพฤติกรรมจะควบคุมการทำงานเฉพาะส่วนแยกกัน การเปลี่ยนพฤติกรรมจะเกิดขึ้นเมื่อตรวจพบเงื่อนไขที่กำหนด สามารถอธิบายด้วยสเตทแมชชีน (State Machine) ได้แบบนี้:

จากสเตทแมชชีน จะเห็นว่ามีพฤติกรรมหลัก 2 แบบ:
- keepReference: พฤติกรรมนี้ หุ่นยนต์จะทำตามค่าอ้างอิง (reference) ที่ผู้ใช้กำหนด ในโค้ดเราใช้ PID (ตัดส่วน derivative ออก) มาควบคุมทิศทาง ส่วนความเร็วจะเอาไว้ค่อยควบคุมด้วย PID ในโปรเจคต่อๆ ไปนะน้อง
- avoidCrash: กรณีนี้หุ่นยนต์จะพยายามหลบการชนอัตโนมัติ โดยการหมุนล้อด้วยความเร็วที่กำหนดไว้ในทิศทางตรงข้ามกันเพื่อให้รถหมุนทวนเข็มนาฬิกา พร้อมกับเก็บทิศทางปัจจุบันไว้เป็นค่าอ้างอิง ห้ามช็อตนะตัวนี้!
แอปพลิเคชัน C++
พี่เขียนแอปด้วย C++ โดยใช้ไลบรารีและสภาพแวดล้อม Qt ส่วนอินเทอร์เฟซผู้ใช้เขียนด้วย QML และมีคลาส C++ คอยสนับสนุน
หน้าตาแอปเป็นแบบนี้:

กรอบ "User" ด้านซ้ายบนแสดงข้อมูลที่ผู้ใช้กำหนด (ความเร็วและทิศทางที่ต้องการ) ส่วนกรอบ "Robot" ด้านขวาแสดงข้อมูลจากหุ่นยนต์ (ความเร็วและทิศทางปัจจุบัน)
กล่องข้อความ "Log" แสดงบันทึก (log) จากหุ่นยนต์หรือจากแอป ไว้ช่วยดีบั๊กหรือดูสถานะการสื่อสารให้ชัดเจนขึ้น สุดท้ายปุ่มด้านล่างใช้สำหรับเชื่อมต่อ/ตัดการเชื่อมต่อกับหุ่นยนต์ แสดงการตั้งค่าระบบ หรือแสดง/ซ่อนกล่องข้อความล็อก เรียบร้อยชัดเจน
ส่วนวิดีโอแสดงการทำงานของระบบทั้งหมด สามารถดูได้ตามลิงก์นี้
ของที่ต้องใช้ (Requirements)
- Arduino Uno/Nano: คอมพิวเตอร์หลักสำหรับความปลอดภัย
- โมดูลบลูทูธ HC-05/06: ไว้คุยกับแอปในสมาร์ทโฟน
- เซ็นเซอร์อัลตราโซนิก HC-SR04: เรดาร์ตรวจจับการชน
- ชุดแชสซีรถอคริลิค 4WD หรือ 2WD
- ไดรเวอร์มอเตอร์ L298N Dual H-Bridge