บทเรียน 25/31: รถอัจฉริยะ Car-3 หลบหลีกสิ่งกีดขวางโดยใช้เซนเซอร์อินฟราเรด | SunFounder Robojax
โปรเจกต์นี้จะเปลี่ยนรถอัจฉริยะ Arduino 3-in-1 ของ SunFounder ของคุณให้เป็นรถหลบหลีกสิ่งกีดขวางอัตโนมัติ โดยการติดตั้งเซ็นเซอร์อินฟราเรด (IR) สองตัว—หนึ่งตัวทางซ้ายและหนึ่งตัวทางขวา—รถสามารถตรวจจับวัตถุที่อยู่ข้างหน้าและตัดสินใจได้ในเสี้ยววินาทีเพื่อเลี้ยวหลบ นี่คือขั้นตอนพื้นฐานในวิทยาการหุ่นยนต์ ที่จะสอนคุณถึงการผสานข้อมูลจากเซ็นเซอร์เข้ากับตรรกะการควบคุมมอเตอร์เพื่อสร้างเครื่องจักรที่ตอบสนองและขับเคลื่อนได้เอง หลักการที่คุณจะได้เรียนรู้ที่นี่สามารถนำไปประยุกต์ใช้ได้กับงานจริงหลากหลายประเภท รวมถึง:
- การสร้างหุ่นยนต์ดูดฝุ่น ที่สามารถนำทางในห้องได้โดยไม่ชนเฟอร์นิเจอร์
- การสร้างหุ่นยนต์เดินตามเส้นหรือแก้เขาวงกต สำหรับการแข่งขันหรือโปรเจกต์การศึกษา
- การพัฒนาหุ่นยนต์ลาดตระเวนรักษาความปลอดภัยอัตโนมัติ ที่สามารถเดินวนรอบพื้นที่และหลบกำแพงได้
- การออกแบบรถของเล่นอัจฉริยะ ที่สามารถเล่นได้อย่างอิสระโดยไม่ติดขัด
คำแนะนำนี้ต่อยอดโดยตรงจากบทเรียนก่อนหน้าที่คุณได้เรียนรู้การควบคุมมอเตอร์ของรถและเข้าใจวิธีการทำงานของเซ็นเซอร์ IR ในที่นี้ เราจะรวมทักษะเหล่านั้นเพื่อใช้อัลกอริทึมการหลบหลีกสิ่งกีดขวางที่เรียบง่ายแต่มีประสิทธิภาพ
ตรรกะการหลบหลีกสิ่งกีดขวางทำงานอย่างไร
แนวคิดหลักนั้นง่ายมาก: รถใช้เซ็นเซอร์ IR สองตัวเพื่อตรวจสอบสิ่งกีดขวางทางซ้ายและขวา เซ็นเซอร์แต่ละตัวจะส่งสัญญาณดิจิทัล: LOW (0) เมื่อตรวจพบวัตถุภายในระยะ (ประมาณ 20 ซม.) และ HIGH (1) เมื่อเส้นทางโล่ง ตรรกะจะกำหนดการทำงานของรถตามสถานะของเซ็นเซอร์ (ในวิดีโอที่ 02:35):
- มีสิ่งกีดขวางทางซ้าย ทางขวาโล่ง: รถเลี้ยวขวาเพื่อหลบ
- มีสิ่งกีดขวางทางขวา ทางซ้ายโล่ง: รถเลี้ยวซ้าย
- มีสิ่งกีดขวางทั้งสองด้าน: รรถถอยหลังเพื่อหนีจากทางตันที่อาจเกิดขึ้น
- ไม่มีสิ่งกีดขวาง: รถขับไปข้างหน้า
วิธีการตอบสนองนี้เป็นตัวอย่างคลาสสิกของเครื่องสถานะจำกัด (finite-state machine) ที่พฤติกรรมของรถเป็นการตอบสนองโดยตรงต่อข้อมูลจากเซ็นเซอร์ในขณะนั้น
ส่วนประกอบฮาร์ดแวร์
เพื่อให้โปรเจกต์นี้สำเร็จ คุณจะต้องมีส่วนประกอบต่อไปนี้ ซึ่งทั้งหมดมีอยู่ในชุด Arduino 3-in-1 ของ SunFounder:
- 1x ชุดรถอัจฉริยะ Arduino 3-in-1 ของ SunFounder (หรือชิ้นส่วนที่เทียบเท่า)
- 2x เซ็นเซอร์หลบหลีกสิ่งกีดขวางอินฟราเรด
- 1x Arduino Uno (หรือบอร์ดที่เข้ากันได้)
- 1x Motor Driver Shield/Board
- สายจัมเปอร์
คู่มือการเดินสายไฟ
การจัดตำแหน่งเซ็นเซอร์อย่างถูกต้องเป็นสิ่งสำคัญสำหรับโปรเจกต์นี้ เซ็นเซอร์ IR ต้องหันไปข้างหน้าและเอียงออกด้านนอกเล็กน้อย เนื่องจากจะใช้ตรวจจับสิ่งกีดขวางที่ด้านข้างของรถ (ในวิดีโอที่ 02:07) แผนผังการเดินสายไฟต่อไปนี้แสดงวิธีการเชื่อมต่อเซ็นเซอร์เข้ากับ Arduino โปรดทราบว่าผู้สอนใช้จุดจ่ายไฟเฉพาะบนเบรดบอร์ดของรถ แต่การเชื่อมต่อกับ Arduino คือสิ่งที่สำคัญ
การเชื่อมต่อสายไฟมีดังนี้ (ในวิดีโอที่ 03:47):
- ไฟเลี้ยง (VCC): เชื่อมต่อพิน VCC ของเซ็นเซอร์ IR ทั้งสองตัวเข้ากับเอาต์พุต 5V บน Arduino หรือรางไฟของรถ
- กราวด์ (GND): เชื่อมต่อพิน GND ของเซ็นเซอร์ IR ทั้งสองตัวเข้ากับกราวด์ร่วมบน Arduino หรือรางกราวด์ของรถ
- เอาต์พุตเซ็นเซอร์ขวา (OUT): เชื่อมต่อพินเอาต์พุตดิจิทัลของเซ็นเซอร์ IR ด้านขวาเข้ากับพินดิจิทัล 7 บน Arduino
- เอาต์พุตเซ็นเซอร์ซ้าย (OUT): เชื่อมต่อพินเอาต์พุตดิจิทัลของเซ็นเซอร์ IR ด้านซ้ายเข้ากับพินดิจิทัล 8 บน Arduino
การเชื่อมต่อมอเตอร์ไดรเวอร์สำหรับมอเตอร์ซ้ายและขวาจะเหมือนกับการเชื่อมต่อที่ตั้งไว้ในบทเรียนก่อนหน้าเกี่ยวกับการควบคุมมอเตอร์
คำอธิบายโค้ด
โค้ดสำหรับโปรเจกต์นี้ตรงไปตรงมา โปรแกรมหลักสามารถดาวน์โหลดได้ด้านล่างบทความนี้ ในที่นี้ เราจะเน้นที่ส่วนที่ผู้ใช้สามารถปรับแต่งได้ ซึ่งคุณสามารถปรับเปลี่ยนได้ตามรถของคุณ
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int rightIR = 7;
const int leftIR = 8;
บรรทัดเหล่านี้กำหนดพินที่ใช้สำหรับมอเตอร์ไดรเวอร์และเซ็นเซอร์ IR พินมอเตอร์ (A_1B, A_1A, B_1B, B_1A) ควบคุมความเร็วและทิศทางของมอเตอร์ทั้งสองตัว พิน rightIR และ leftIR คือจุดที่คุณเชื่อมต่อสายสัญญาณจากเซ็นเซอร์ของคุณ หากคุณใช้พินอื่น คุณจะต้องเปลี่ยนค่าเหล่านี้ที่นี่
int speed = 150;
ตัวแปรนี้กำหนดความเร็วพื้นฐานของรถ ค่าสามารถอยู่ระหว่าง 0 ถึง 255 โดยที่ 255 คือความเร็วสูงสุด ค่า 150 เป็นจุดเริ่มต้นที่ดีสำหรับการเรียนรู้ เพราะเร็วพอที่จะน่าสนใจแต่ช้าพอที่จะให้เวลาตอบสนอง (ในวิดีโอที่ 07:10) คุณสามารถปรับค่านี้เพื่อทำให้รถของคุณเร็วขึ้นหรือช้าลงได้
โค้ดส่วนที่เหลือจะกำหนดลอจิกในฟังก์ชัน loop() โดยจะอ่านสถานะของเซนเซอร์ซ้ายและขวา จากนั้นเรียกใช้ฟังก์ชันการเคลื่อนที่ที่เหมาะสม (moveForward(), moveBackward(), backLeft(), backRight()) ฟังก์ชันเหล่านี้ถูกกำหนดไว้ล่วงหน้าและควบคุมมอเตอร์ไดรเวอร์เพื่อให้ได้การเคลื่อนที่ตามต้องการ ผู้สอนยังได้เพิ่มฟังก์ชัน stop() ในการแก้ไขภายหลังเพื่อหยุดรถชั่วคราวหลังจากหลบหลีกสิ่งกีดขวาง ทำให้การเคลื่อนที่ดูมีความตั้งใจมากขึ้น (ในวิดีโอที่ 10:29)
การสาธิตโปรเจกต์จริง
ในวิดีโอ ผู้สอนสาธิตลอจิกโดยใช้ Serial Monitor ก่อน โดยวางกล่องใกล้กับเซนเซอร์ คุณจะเห็นข้อความที่เกี่ยวข้อง เช่น "Go Left", "Go Right" หรือ "Go Backward" ปรากฏบนหน้าจอ ซึ่งยืนยันว่าการอ่านค่าเซนเซอร์และลอจิกถูกต้อง (ในวิดีโอที่ 09:11)
หลังจากตรวจสอบลอจิกแล้ว ผู้สอนได้เพิ่มการปรับปรุงที่สำคัญ: ฟังก์ชัน stop() ฟังก์ชันนี้จะทำให้รถหยุดสนิทเป็นระยะเวลาที่กำหนด (เช่น 1 วินาที) หลังจากที่รถเลี้ยวหรือถอยหลัง เพื่อป้องกันการเคลื่อนที่กระตุกและให้รถประเมินสภาพแวดล้อมรอบข้างใหม่ (ในวิดีโอที่ 10:29)
สุดท้าย รถถูกทดสอบบนพื้นพร้อมกับสิ่งกีดขวางหลายชิ้น วิดีโอแสดงให้เห็นว่ารถสามารถนำทางผ่านกล่องได้สำเร็จ เลี้ยวซ้าย เลี้ยวขวา และถอยหลังตามความจำเป็นเพื่อหาเส้นทางที่ชัดเจน ซึ่งแสดงให้เห็นถึงการประยุกต์ใช้จริงของอัลกอริทึมการหลบหลีกสิ่งกีดขวางนี้ (ในวิดีโอที่ 12:13)
บทต่างๆ
- [00:00] แนะนำการหลบหลีกสิ่งกีดขวางด้วยเซนเซอร์อินฟราเรด
- [01:24] สิ่งที่ต้องเตรียมและภาพรวมของโปรเจกต์
- [02:35] หลักการทำงานของลอจิกการหลบหลีกสิ่งกีดขวาง
- [03:47] การเชื่อมต่อเซนเซอร์อินฟราเรดและมอเตอร์
- [05:40] การเปิดและอธิบายโค้ด
- [09:11] การทดสอบลอจิกด้วย Serial Monitor
- [10:29] การเพิ่มฟังก์ชันหยุดเพื่อการนำทางที่นุ่มนวลขึ้น
- [11:42] การทดสอบฟังก์ชันหยุด
- [12:13] การทดสอบจริงครั้งสุดท้ายบนพื้น
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int rightIR = 7;
const int leftIR = 8;
void setup() {
Serial.begin(9600);
//motor
pinMode(A_1B, OUTPUT);
pinMode(A_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
//IR obstacle
pinMode(leftIR, INPUT);
pinMode(rightIR, INPUT);
}
void loop() {
int left = digitalRead(leftIR); // 0: Obstructed 1: Empty
int right = digitalRead(rightIR);
int speed = 150;
if (!left && right) {
backLeft(speed);
} else if (left && !right) {
backRight(speed);
} else if (!left && !right) {
moveBackward(speed);
} else {
moveForward(speed);
}
}
void moveForward(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, speed);
analogWrite(B_1B, speed);
analogWrite(B_1A, 0);
}
void moveBackward(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
void backLeft(int speed) {
analogWrite(A_1B, speed);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
void backRight(int speed) {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, speed);
}
Common Course Links
Common Course Files
แหล่งข้อมูลและเอกสารอ้างอิง
-
เอกสารDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
ภายนอกPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
ไฟล์📁
ไลบรารี Arduino (zip)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB