



ตอนนั้นพี่กำลังเตรียมตัวไปร่วมทีมเล็กๆ ทำกิจกรรม Maker Experience ให้กับนักเรียนมัธยมปลายที่ Oakland, CA เนี่ยแหละ คำว่า Maker มันกว้างมาก แต่สำหรับเรา มันคือการโฟกัสไปที่การคิดแก้ปัญหาจริงๆ ที่สามารถจำลองหรือแก้ไขได้ด้วย Arduino พร้อมเซ็นเซอร์และแอคชูเอเตอร์ เราตั้งใจจะใช้ Arduino 101 กับ Grove Starter Kit for Arduino เป็นแพลตฟอร์มหลัก และกำลังมองหาโปรเจคสุดท้าย (capstone project) ที่จะรวบรวมทุกอย่างที่สอนไปให้มันสนุกและจำฝังใจ พอดีพี่มีสายสัมพันธ์ (network) เล็กๆ ก็เลยเจอชุดโรเวอร์ (Rover kits) สุดเจ๋งที่เดิมทีใช้ Edison และ Wi-Fi นั่นคือ Seeedstudio Skeleton Bot แพลตฟอร์มหุ่นยนต์เคลื่อนที่ 4 ล้อ แม้มันจะออกมานานแล้ว แต่ประสิทธิภาพยังเทพและเท่มาก พี่เลยตัดสินใจดัดแปลงชุดโรเวอร์พวกนี้ให้ใช้ Arduino 101 และสื่อสารผ่าน Bluetooth Low Energy แทน ผลลัพธ์คือเราได้โปรเจคที่เจ๋งมากสำหรับ Maker Experience ของเรา! บทความนี้พี่จะเล่าถึงการประกอบ/ดัดแปลงชุด 4WD ที่ใช้ Edison นี่แหละ ให้มาใช้กับ Arduino 101
ในเน็ตมีโรเวอร์ที่ใช้ Arduino เต็มไปหมด – แล้วบทความนี้พี่จะเพิ่มอะไรให้?
1. **ตัวอย่างจริงจังของการใช้ Arduino 101** ด้วยฟีเจอร์ Bluetooth Low Energy (BLE) และ IMU 6 แกนในตัว – รู้สึกเหมือน Arduino 101 ถูกสร้างมาเพื่อการเคลื่อนไหวโดยเฉพาะ! แต่พี่หาโปรเจคที่ใช้ความสามารถใหม่ๆ พวกนี้จริงๆ จังๆ ไม่ค่อยเจอ บทความนี้จะใช้ทั้ง BLE และ IMU ของ Arduino 101 ให้เป็นประโยชน์
2. **พี่จะเน้นการใช้ Grove Starter Kit for Arduino** เพราะมันช่วยให้เพิ่มเซ็นเซอร์และแอคชูเอเตอร์ได้เร็วมาก (จากแคตตาล็อกเซ็นเซอร์ราคาถูก) โดยไม่ต้องมานั่งต่อเบรดบอร์ด ซึ่งสำหรับพี่แล้วมันยากกว่าและใช้เวลามากกว่า นี่เป็นความชอบส่วนตัวนะ ไม่ได้จะด่าคนที่เก่งต่อเบรดบอร์ดเลย
3. **โค้ด Arduino ของพี่เขียนให้เป็นโมดูลมาก** – หวังว่ามันจะยังใช้ได้แม้น้องจะใช้มอเตอร์, มอเตอร์คอนโทรลเลอร์ หรือชุด Grove ไม่เหมือนพี่เลย
ซอฟต์แวร์และแผนผังวงจรทั้งหมดมีให้ พี่จะเริ่มจากอธิบายการสร้างโรเวอร์ 4 ล้อพื้นฐาน – ควบคุมมอเตอร์ด้วย Arduino โดยรับคำสั่งผ่าน BLE จากสมาร์ทโฟน (Android หรือ IOS) ตอนทดลองขับ พี่ชนโรเวอร์หลายรอบ แล้วพบว่าการพยายามหยิบมันขึ้นมาหลังจากมันคว่ำ (turtled) ขณะที่ยางมันยังหมุนติ้วๆ อยู่เนี่ยไม่ปลอดภัยเลย พี่เลยเพิ่มฟังก์ชันตรวจจับการชนและปิดมอเตอร์อัตโนมัติตอนชนด้วย พี่ยังมีไอเดียปรับปรุงโรเวอร์อีกนิดหน่อย จะเล่าให้ฟังตอนท้าย
ระหว่างการสร้าง พี่ได้ประโยชน์จากโค้ดตัวอย่างและเคล็ดลับจากคนอื่นๆ มากมาย พี่เลยอยากแบ่งปันสิ่งที่พี่เรียนรู้ หวังว่าจะเป็นประโยชน์กับคนอื่นบ้าง
ขั้นตอนหลักๆ ของบทความนี้มีดังนี้:
1. ประกอบ "โครงล้อยาง" (Rolling Chassis) ของโรเวอร์ 2. ประกอบส่วนไฟฟ้า 3. ทดสอบการควบคุมมอเตอร์ด้วย Arduino 101 4. สร้างรีโมทคอนโทรล BLE – อธิบายในบทความแยก 5. โปรแกรม Arduino 101 สำหรับโรเวอร์รุ่น "พื้นฐาน" (Base Model) 6. เพิ่มฟีเจอร์ความปลอดภัย "ตรวจจับการชน" (Crash Detect) 7. สรุปและแนวทางพัฒนาต่อ
**รายการอุปกรณ์ฮาร์ดแวร์แบบละเอียด:**
1. บอร์ด Arduino 101 2. Grove Starter Kit for Arduino * Grove Base Shield v2.0 * Grove I2C RGB LCD Backlight Display v2.0 * Grove Button * Grove LED Socket v1.3 พร้อม LED สีน้ำเงิน * สาย Grove (4 เส้น) 3. Skeleton Bot – แพลตฟอร์มหุ่นยนต์เคลื่อนที่ 4 ล้อ * โครงอลูมิเนียมและแผ่นอะคริลิคเจาะรู – เป็นส่วนหนึ่งของชุด * มอเตอร์ DC 25GA-370 (4 ตัว) พร้อมสายไฟสำหรับขั้ว + และ - * บอร์ดขับมอเตอร์ Grove I2C พร้อมสแตนด์ออฟ 0.25 นิ้ว, สกรู * ล้อขนาด 85mm, เพลา, สกรู (4 ชุด) * สแตนด์ออฟอลูมิเนียม 1 นิ้ว, สกรูสำหรับติดตั้ง Arduino * Dean’s male pigtail สำหรับเชื่อมต่อกับมอเตอร์ไดรเวอร์ * Dean’s “T” – ขั้วต่อตัวเมีย 2 ตัวต่อกับขั้วต่อตัวผู้ 1 ตัว * Dean’s male กับหัวต่อบาร์เรลแจ็คของ Arduino * Dean’s female ไปยังขั้วต่อ Traxxas * แบตเตอรี่ Li-Po Traxxas 30C 5000mAh 2S 7.4V
ขั้นตอนที่ 1: ประกอบ "โครงล้อยาง" (Rolling Chassis) ของโรเวอร์



การสร้าง "โครงล้อยาง" จากชุด Skeleton Bot – 4WD Mobile Robotic Platform – แนะนำให้ทำตามคู่มือประกอบจาก Seeedstudio.com นะ พี่ได้รับชุดโรเวอร์มาพร้อมตัวโครงหลักที่ประกอบไว้แล้ว ขั้นตอนนี้สามารถทำตามคำแนะนำโดยละเอียดได้จากเว็บไซต์ของผู้ผลิต
พี่ได้แนบรูปภาพหลายรูปของชุดโรเวอร์หลังจากทำขั้นตอนนี้เสร็จแล้ว การติดล้อในขั้นตอนนี้หรือทีหลังขึ้นอยู่กับความชอบส่วนตัว พี่ว่าการทดลองโดยที่ยังไม่ได้ติดล้อจะง่ายกว่า แต่ถ้าติดล้อแล้ว โรเวอร์สามารถวางบนบล็อกหรือกล่องได้ – ให้ล้อหมุนฟรีๆ – ก็ใช้ได้เหมือนกัน
ขั้นตอนที่ 2: ประกอบส่วนไฟฟ้า




มอเตอร์ DC ของพี่มาพร้อมสายไฟที่ต่อไว้แล้วดังที่เห็นในขั้นตอนก่อนหน้า พี่ต่อสายไฟจากมอเตอร์ด้านซ้ายไปที่ Motor Driver 1 และจากมอเตอร์ด้านขวาไปที่ Motor Driver 2 ตามที่เห็นในแผนผังและรูปภาพ การยึดสายไฟสองชุดเข้ากับขั้วต่อสกรูเล็กๆ นี่ท้าทายพอสมควร
ต่อไปพี่ประกอบสายไฟสำหรับจ่ายไฟ ชิ้นส่วนต่างๆ ของสายไฟจ่ายไฟมากับชุดและเป็นวิธีที่ฉลาดมากในการเชื่อมต่อแบตเตอรี่รถ RC เข้ากับโรเวอร์ พี่ประกอบตามที่แสดงไว้
อย่างที่บอก แบตเตอรี่ Lithium Polymer ที่ใช้เป็นแบตเตอรี่รถบังคับทั่วไป มันเป็นแบตเตอรี่แบบ 2S – หมายความว่ามันต่อเซลล์แบตเตอรี่ 18650 สองเซลล์แบบอนุกรม เซลล์ 18650 มีแรงดัน 3.7 โวลต์ ดังนั้นการต่อสองเซลล์แบบอนุกรมจะได้แรงดันเข้า 7.4 โวลต์สำหรับมอเตอร์ไดรเวอร์
ในแง่ของเอาต์พุต บอร์ดขับมอเตอร์ Grove I2C ใช้ L298P dual H-bridge ที่สามารถจ่ายกระแสได้ 2A ต่อมอเตอร์ไดรเวอร์ มันยังสามารถขับมอเตอร์ DC ได้ทั้งสองทิศทาง และควบคุมความเร็วและทิศทางของมอเตอร์แต่ละตัวได้อย่างอิสระ ฟีเจอร์เพิ่มเติมของบอร์ดขับมอเตอร์ Grove I2C คือมันมีเรกูเลเตอร์ 5V ในตัว ซึ่งสามารถใช้จ่ายไฟให้ Arduino ผ่านบัส I2C ได้ พี่ลองแล้วพบว่ามันทำงานได้ดี – Arduino ไม่จำเป็นต้องใช้ไฟจากหัวบาร์เรลแจ็ค (หรือสาย USB) เมื่อต่อแบตเตอรี่เข้ากับบอร์ดขับมอเตอร์แล้ว สำหรับข้อมูลเพิ่มเติมเกี่ยวกับมอเตอร์ไดรเวอร์ตัวนี้ สามารถหาอ่านได้จากวิกิของผู้ผลิต
พี่แน่ใจว่าได้ต่อสาย Grove และร้อยขั้วต่อแบตเตอรี่ผ่านช่องบนแผ่นอะคริลิคด้านบนก่อนที่จะขันสกรูยึดให้แน่น
ขั้นตอนที่ 3: ทดสอบการควบคุมมอเตอร์

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

การสร้าง Arduino 101 BLE Rover Remote Control อธิบายไว้ในบทความแยกต่างหาก
ขั้นตอนที่ 5: โปรแกรม Arduino 101 สำหรับโรเวอร์รุ่น "พื้นฐาน" (Base Model)
พี่เริ่มจากโค้ดโรเวอร์รุ่น "พื้นฐาน" – ไม่มีลูกเล่น, มีตัวเลือกน้อยที่สุด มันต้องประกอบด้วย:
- โค้ดควบคุมโรเวอร์สำหรับแปลงคำสั่งเป็นการกระทำของมอเตอร์
- โค้ดสื่อสาร BLE เพื่อเชื่อมต่อสมาร์ทโฟนกับ Arduino
พี่จัดโครงสร้างโค้ดแบบดั้งเดิม:
- Include libraries และประกาศตัวแปร global
- ฟังก์ชัน Setup() – สำหรับโค้ดที่เริ่มต้นฮาร์ดแวร์ – ต้องรันครั้งเดียว
- ฟังก์ชัน Loop() – สำหรับโค้ดที่รันซ้ำๆ
- ฟังก์ชันที่ผู้ใช้กำหนดเอง (User defined functions) – สำหรับโค้ดส่วนใดก็ตามที่ยาวกว่าสองสามบรรทัดในลูป
พี่พบว่าการสร้างฟังก์ชันที่กำหนดเองช่วยให้โค้ดอ่านง่ายและมีโครงสร้าง – โอกาสที่พี่จะเขียนโค้ดสปาเก็ตตี้ (spaghetti code) ที่เข้าใจยากและดีบักยากก็ลดลง
โค้ดรุ่นพื้นฐานเป็นการผสมผสานระหว่างฟังก์ชัน 2 ฟังก์ชันสำหรับควบคุมมอเตอร์ DC – MotorSpeedSetAB และ MotorDirectionSetAB ร่วมกับ state machine ของโรเวอร์จากบทความของ **deba168**: Smartphone Controlled Arduino Rover ซึ่งพี่ใส่ไว้ในฟังก์ชันที่ผู้ใช้กำหนดเองชื่อ RoverControl
สำหรับการสื่อสาร พี่ดัดแปลงจากตัวอย่าง CallbackLED ที่แสดงการใช้ Bluetooth LE บน Arduino 101 การปรับเปลี่ยนหลักคือการกำหนดโปรไฟล์ UART (BLE characteristics และ UUID เฉพาะ) ที่แอ