โปรเจกต์ Arduino 101 BLE Rover Remote Control
ฉันไม่สามารถหา BLE Remote Control ที่มีอยู่สำหรับ Arduino 101 Rover ได้ — นี่คือ solution ใหม่ของฉัน!
ฉันไม่สามารถหา BLE Remote Control ที่มีอยู่สำหรับ Arduino 101 Rover ได้ — นี่คือ solution ใหม่ของฉัน!
Project Supporter Team
โพสต์โดย

ผมซื้อ Arduino 101 มาเพราะความสามารถในการใช้งานร่วมกับ Arduino ได้ พร้อมกับฟีเจอร์เพิ่มเติมอย่าง Bluetooth Low Energy ในตัว และ 6-axis accelerometer/gyroscope ผมอยากสร้างหุ่นยนต์ rover บังคับวิทยุโดยใช้ Arduino 101 เป็นฐาน แต่กลับพบว่าหาตัวอย่างโค้ดได้ยากมาก ผมเจอตัวอย่าง RC rovers ที่ใช้ Bluetooth ทั่วไปมากมาย แต่ไม่มีอันไหนที่ใช้ Bluetooth LE เลย
เมื่อลองย่อยปัญหาการสื่อสารออกเป็นส่วนเล็กๆ ผมจำเป็นต้อง:
และผมก็แก้ปัญหาได้ทั้งสองอย่าง ผมค้นพบอย่างรวดเร็วว่าสามารถดัดแปลงตัวอย่าง LED และ CallbackLED ที่มีมาให้ใน CurieBLE library เพื่อส่งค่า byte ไปยัง Arduino 101 ได้ แต่ก็ยังติดปัญหาเรื่องการหารีโมทคอนโทรลที่เสถียรและใช้งานง่าย หลังจากค้นหาข้อมูลในอินเทอร์เน็ตและลงมือทำอยู่พักหนึ่ง ผมก็ได้พบกับทางเลือกใหม่ที่นำมาเสนอในที่นี้ครับ



ผมพบคำตอบสำหรับโจทย์การสื่อสารพื้นฐานนี้ใน Arduino forum ที่: Arduino Forum> Products> Arduino 101 โดยมีคำอธิบายดังนี้ครับ
ในตัวอย่าง CurieBLE ของ Arduino 101 ที่ชื่อว่า CallbackLED จะมีการกำหนด eventHandler ให้ถูกเรียกใช้งานเมื่อมีการเขียนค่าลงใน switch characteristic โดยโค้ดในฟังก์ชัน setup() จะมีหน้าตาแบบนี้:
// assign event handlers for characteristic
switchChar.setEventHandler(BLEWritten, switchCharacteristicWritten);
ในฟังก์ชัน event handler ที่ชื่อ switchCharacteristicWritten โค้ดจะตรวจสอบว่าค่าที่เขียนเข้ามานั้นเป็นศูนย์ (0x00) หรือค่าอื่นๆ ถ้าไม่ใช่ศูนย์ มันจะสั่งให้ LED 'on' และถ้าเป็นศูนย์ มันจะสั่งให้ LED 'off' โค้ดจะมีลักษณะดังนี้:
if (switchChar.value()) {
Serial.println("LED on"); digitalWrite(ledPin, HIGH);
else {
Serial.println("LED off"); digitalWrite(ledPin, LOW); }
หากต้องการดักจับค่า byte ที่ถูกเขียนเข้ามา เราเพียงแค่ต้องบันทึกค่านั้นลงใน Variable แล้วพิมพ์ออกมาทาง Serial monitor ซึ่งโค้ดจะมีหน้าตาแบบนี้:
if (switchChar.value()) {
Serial.println("LED on");
digitalWrite(ledPin, HIGH);
char state = switchChar.value();
Serial.print("new value written: ");
Serial.println(state); }
else {
Serial.println("LED off");
digitalWrite(ledPin, LOW); }
ผมได้ทดสอบแล้วว่าวิธีนี้ใช้งานได้ โดยการลองเขียนอักขระผ่านแอปพลิเคชัน nRF Connect จาก Nordic Semiconductor ซึ่งมีให้โหลดทั้งใน Play Store และ App Store
นี่คือขั้นตอนโดยละเอียดหลังจากติดตั้งแอปพลิเคชันแล้ว:
1. เปิดแอปพลิเคชัน nRF Connect
2. รันการสแกนโดยกดปุ่ม 'Scan' ที่มุมขวาบน ซึ่งปกติแอปจะรันให้โดยอัตโนมัติ
3. เลือกชื่อ service ของคุณ (ในตัวอย่างนี้ชื่อว่า "LEDCB")
4. กดปุ่ม 'Connect' ทางด้านขวา
5. เลือก Unknown Service (รายการสุดท้ายในลิสต์ service ของคุณ)
6. กดปุ่มลูกศรชี้ขึ้นทางด้านขวา ซึ่งจะแสดงหน้าต่างโต้ตอบสำหรับเขียนค่า (write value dialog box)
7. กด 'New value' แล้วกรอกค่า byte ในรูปแบบ hex เช่น 61 ซึ่งก็คือตัวอักษร "a" ในรหัส ASCII
8. กด 'Send' ที่มุมขวาล่าง แล้วค่า byte ของคุณก็จะถูกส่งออกไป
เมื่อทำตามขั้นตอนเหล่านี้ เราก็จะสามารถเขียนค่า byte ผ่าน Bluetooth LE ไปยัง Arduino 101 ได้สำเร็จ




ผมชอบแอป nRF Connect นะครับ แต่ผมยังหาวิธีทำเป็นรีโมทที่ใช้งานได้สะดวกไม่เจอ การต้องมานั่งกรอกค่า byte ทีละตัวผ่าน nRF Connect คงไม่ทำให้เราควบคุม rover ได้อย่างมีประสิทธิภาพแน่ๆ เพื่อที่จะทดลองตัวอย่างอื่นๆ ของ Arduino 101 ผมจึงได้โหลดอีกแอปของ nRF ที่ชื่อว่า nRF Toolbox ในแอปนี้มีฟีเจอร์สุดท้ายที่ชื่อว่า "UART" ซึ่งแอป UART นี้จะมีปุ่มที่ผู้ใช้กำหนดเองได้ 9 ปุ่ม โดยสามารถตั้งค่าให้ส่งคำสั่งเมื่อกดปุ่มได้ การกด 'Edit' ที่มุมขวาบนจะทำให้ปุ่มทั้งหมดกลายเป็นสีส้ม เมื่อแตะที่ปุ่มจะมีหน้าต่างขึ้นมาให้เลือก icon ประจำปุ่มและกำหนดคำสั่งที่จะส่งเมื่อถูกกด
ผมใช้โทรศัพท์ Android และ icon ที่มีให้ก็เข้ากับรีโมทคอนโทรลของผมได้อย่างสมบูรณ์แบบ ส่วนในอุปกรณ์ iOS ตัว icon อาจจะไม่ค่อยตรงใจนักสำหรับการใช้งานนี้ แต่คุณก็สามารถเลือกอันที่จำได้ง่ายๆ มาใช้แทนครับ การควบคุมการเคลื่อนที่ของ rover ของผมใช้รหัส byte ง่ายๆ ตามการตั้งค่าดังนี้ (ผมใช้ลำดับคำสั่งเดียวกับในบทเรียนของ Deba168 สำหรับ "Smartphone Controlled Arduino Rover") นี่คือรายการคำสั่งและตัวอักษรที่เกี่ยวข้องครับ:
a - forward (เดินหน้า)
b - left (เลี้ยวซ้าย)
c - stop (หยุด)
d - right (เลี้ยวขวา)
e - reverse (ถอยหลัง)
1 - 25% of motor power (กำลังมอเตอร์ 25%)
2 - 50% of motor power (กำลังมอเตอร์ 50%)
3 - 75% of motor power (กำลังมอเตอร์ 75%)
4 - 100% of motor power (กำลังมอเตอร์ 100%)
ตอนที่ผมสร้างรีโมทครั้งแรก ผมใส่ค่า ASCII ของตัวอักษรลงไป แต่มันใช้งานไม่ได้ คำสั่งที่ถูกต้องคือตัวอักษรหรือตัวเลขนั้นๆ เลย ไม่ใช่ค่า ASCII ของมัน เมื่อผมใส่ icon และคำสั่งครบทั้ง 9 ปุ่มแล้ว ผมก็กด 'Done' รีโมทที่เสร็จสมบูรณ์ของผมก็จะมีหน้าตาเหมือนในรูปครับ
ดูเหมือนง่ายใช่ไหมครับ? แต่เดี๋ยวก่อน เมื่อผมพยายามเชื่อมต่อ Arduino 101 BLE service ที่มี CallbackLED switch characteristic เข้ากับแอป UART มันกลับแจ้งเตือนว่า "The device does not have the required services" (อุปกรณ์ไม่มี service ที่จำเป็น) ผมเลยไปค้นหาข้อมูลเกี่ยวกับ Nordic และ UART ในอินเทอร์เน็ต แล้วพบว่าแอป UART คาดหวังจะเห็น service UUIDs และ characteristics ที่เฉพาะเจาะจงมาก โดยอ้างอิงข้อมูลจาก: https://www.nordicsemi.com/eng/Products/Nordic-mob... ผมจึงได้รวมชื่อ service, UUID รวมถึง Tx และ Rx characteristics ที่ถูกต้องเข้าไปใน Arduino sketch ของผม จากนั้นก็ปรับแก้โค้ดเล็กน้อยเพื่อให้รองรับความจริงที่ว่า service นี้สามารถส่งข้อมูลได้มากกว่าหนึ่งตัวอักษร และต้องส่ง pointer ไปยังตำแหน่งแรกของ array แทน ซึ่งผลคือมันใช้งานได้ครับ!

ตัว Sketch จะส่งค่า byte ที่ได้รับไปยัง Serial Monitor เพื่อยืนยันว่าแต่ละปุ่มบนแอป UART ส่งค่า byte ที่ต้องการออกมาจริงๆ
ขั้นตอนการใช้งานรีโมท มีดังนี้:
1. เปิดแอป nRF Toolbox
2. เลือกแอปพลิเคชัน UART
3. กดปุ่ม 'Connect' แล้วเลือกชื่อ BLE service ของคุณ - "BLE_ROV"
ตอนนี้ปุ่มควรจะเปลี่ยนเป็นคำว่า 'Disconnect' แสดงว่าคุณเชื่อมต่อแล้ว และการกดปุ่มแต่ละครั้งจะส่งคำสั่งสำหรับปุ่มนั้นๆ ออกไป
หมายเหตุ: ในการทดสอบ sketch นี้กับโทรศัพท์ iOS รุ่นเก่า ผมพบว่าชื่อ local name ที่ตั้งไว้ว่า "BLE_ROV" ไม่ปรากฏในรายการให้เลือกเชื่อมต่อ แต่ผมกลับเห็นชื่อประมาณว่า 'Arduino 101-xxxx' โดยที่ xxxx คือเลข hex 4 หลักสุดท้ายของ Mac address ของ chip BLE (ซึ่งดูได้จากสติกเกอร์เล็กๆ ด้านหลัง Board Arduino 101) เพียงแค่เลือกชื่อนี้เพื่อเชื่อมต่อ ทุกอย่างก็จะใช้งานได้ตามปกติครับ
นี่เป็นวิธีที่ง่ายที่สุดเท่าที่ผมจะหาได้ ผมได้แนบ Arduino sketch ไว้ให้ดาวน์โหลด รวมถึงรูปภาพของ Serial monitor เมื่อกดแต่ละปุ่มบนรีโมทและตอนตัดการเชื่อมต่อครับ
หวังว่าข้อมูลนี้จะเป็นประโยชน์นะครับ แล้วผมจะนำคำแนะนำฉบับเต็มสำหรับการสร้าง rover ที่ผมต่อขึ้นมามาฝากในโอกาสหน้าครับ
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้