กลับไปหน้ารวมไฟล์
car-controlled-over-bluetooth-with-crash-detection-3cccb4.md

บังคับรถ 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 และตรรกะการชน

แอปมือถือจะส่งคำสั่งที่เป็นข้อความมาอย่างต่อเนื่อง

  1. การรับสัญญาณ: ตัวรับสัญญาณบลูทูธ HC-05 ถูกต่อสายเข้ากับพิน `RX` และ `TX` บน Arduino Uno
  2. การตรวจสอบการแทรกแซง: ก่อนที่ Arduino จะอ่านพิน `RX` ของบลูทูธ มันจะส่งสัญญาณไปยังเซ็นเซอร์อัลตราซาวด์ HC-SR04 ที่ด้านหน้า
  3. ตรรกะการเบรก:
    • `if (distance > safe_threshold)`: อ่านบลูทูธและดำเนินการคำสั่งจากมือถือ
    • `if (distance <= safe_threshold)`: Arduino จะขัดจังหวะคำสั่ง มันจะสั่งให้มอเตอร์ถอยหลังสั้นๆ เพื่อลดความเร็ว จากนั้นจึงหยุด
  4. เสียงเตือน: ออดพีโซ (Piezo Buzzer) จะส่งเสียงเตือน บอกผู้ใช้ว่ารถได้ยึดการควบคุมเพื่อป้องกันการชนแล้ว

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

กราฟปรับเทียบ (Calibration curve) ของมอเตอร์ตัวหนึ่ง

โปรโตคอลการสื่อสาร (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

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Qt Creator"
  - "1x Arduino IDE 2.0 (beta)"
author: "juanrosell"
category: "Motors & Robotics"
components:
  - "2x 5v dc motors"
  - "1x Soldering kit"
  - "2x Keyes Infrared switch P00002425"
  - "1x Placa Arduino UNO R3"
  - "1x Ultrasound sensor HC-SR04"
  - "1x Arduino Motor Shield Rev3"
  - "1x HC-05 Bluetooth Module"
  - "4x wheels"
  - "1x Screwdrivers"
  - "1x Triple-axis Magnetometer - MMC5603"
description: "Active safety systems! Upgrade a standard Bluetooth driving chassis with bump-avoidance programming that automatically slams the brakes before a collision occurs."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/6f183b45-452f-4d1a-9f9d-03552b4971a1.ino"
  - "https://projects.arduinocontent.cc/db2a96d8-f242-4d86-be86-cb97e5ba0a7d.hpp"
  - "https://projects.arduinocontent.cc/e81d9e03-30ae-494e-bcf2-f40681dd75da.cpp"
encryptedPayload: "U2FsdGVkX1/SbpZkFr1IFNIL9mTNkCf3bkWXJ7z00K1rUidVfhnSJ8HyFSQPIX1dtLLk31m5D3V3YEPzv2WSxdqpwFpCP2Mx+bOH71PPzUP+VBQdUlCrPlkG3U7HcetR"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/car-controlled-over-bluetooth-with-crash-detection-3cccb4_cover.jpg"
lang: "en"
likes: 0
passwordHash: "14e947218325fb29dae1ff3c2989974de5aae44723e872004b3f3a738dd886cc"
price: 2450
seoDescription: "Build an Arduino robot car controlled via Bluetooth with an Android app and crash detection. A perfect DIY project for robotics enthusiasts."
tags:
  - "Cars"
  - "Embedded"
  - "Remote Control"
  - "Robots"
title: "Car controlled over Bluetooth with crash detection"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/2sJkWdXCk8Y"
views: 719