บทเรียน 26/31: รถอัจฉริยะ ตอนที่ 4: การหลบหลีกสิ่งกีดขวางโดยใช้เซนเซอร์อัลตราโซนิก | SunFounder Robojax
ในบทเรียนนี้ เราจะอัปเกรดรถอัจฉริยะของคุณให้สามารถมองเห็นและตอบสนองต่อสภาพแวดล้อมได้โดยใช้เซนเซอร์อัลตราโซนิก โดยการวัดระยะห่างจากวัตถุด้านหน้า รถสามารถตัดสินใจได้อย่างชาญฉลาด: มันจะเคลื่อนที่ไปข้างหน้าเมื่อเส้นทางโล่ง หยุดเมื่อมีวัตถุอยู่ในเขตเตือน และถอยหลังเมื่อมีสิ่งกีดขวางใกล้เกินไป โปรเจกต์นี้ต่อยอดจากพื้นฐานการควบคุมมอเตอร์และเซนเซอร์ที่คุณได้เรียนรู้ไปแล้ว ส่งผลให้ได้ยานพาหนะที่ทำงานอัตโนมัติอย่างแท้จริง
นี่ไม่ใช่แค่ของเล่น แต่เป็นก้าวพื้นฐานสู่การสร้างโปรเจกต์หุ่นยนต์ที่ซับซ้อนมากขึ้น ตรรกะที่คุณจะนำมาใช้ที่นี่—รับรู้ คิด ลงมือทำ—เป็นตรรกะเดียวกับที่ใช้ในทุกสิ่งตั้งแต่เครื่องดูดฝุ่นหุ่นยนต์ไปจนถึงระบบอัตโนมัติในอุตสาหกรรม นี่คือแนวคิดบางอย่างเพื่อสร้างแรงบันดาลใจให้คุณสร้างสรรค์ผลงานของตัวเอง:
- ยานสำรวจอัตโนมัติ: สร้างหุ่นยนต์ที่สามารถสำรวจห้องหรือทางเดินได้โดยไม่ชนกำแพงหรือเฟอร์นิเจอร์
- ระบบสัญญาณเตือนระยะใกล้: ติดตั้งเซนเซอร์อัลตราโซนิกบนเซอร์โวเพื่อสแกนพื้นที่และสั่งงานสัญญาณเตือนหรือไฟเมื่อมีผู้บุกรุกเข้ามาในเขตที่กำหนด
- ผู้ช่วยจอดรถอัจฉริยะ: สร้างระบบที่ใช้การอ่านค่าระยะเพื่อนำรถเข้าจอดในพื้นที่แคบ โดยให้ข้อมูลตอบกลับเป็นภาพหรือเสียง
คำแนะนำนี้จัดทำขึ้นจากชุดอุปกรณ์ SunFounder 3-in-1 Arduino และโปรเจกต์ "Play with Ultrasonic Module" เราจะอธิบายการเดินสายไฟ อธิบายโค้ดการตัดสินใจ และสาธิตการทำงานของรถ
ตรรกะการหลบหลีกสิ่งกีดขวางทำงานอย่างไร
แกนหลักของโปรเจกต์นี้คือแผนผังการตัดสินใจที่เรียบง่ายแต่ทรงพลัง เซนเซอร์อัลตราโซนิกจะวัดระยะห่างจากวัตถุที่อยู่ด้านหน้าโดยตรงอย่างต่อเนื่อง ค่าระยะนี้จะถูกนำไปใช้ควบคุมมอเตอร์ของรถ ดังแสดงในแผนภาพด้านล่าง
- หากระยะทาง > 25 ซม.: เส้นทางโล่ง รถจึงเคลื่อนที่ไปข้างหน้า
- หาก 10 ซม. < ระยะทาง <= 25 ซม.: ตรวจพบวัตถุใน "เขตเตือน" รถจึงหยุดเพื่อหลีกเลี่ยงการชน
- หาก 2 ซม. < ระยะทาง <= 10 ซม.: วัตถุอยู่ใกล้ในระดับอันตราย รถจะถอยหลังเพื่อสร้างระยะห่างเพิ่มขึ้น
- หากระยะทาง <= 2 ซม.: ค่าที่อ่านได้น่าจะเป็นข้อผิดพลาด (ใกล้เกินไปที่จะวัดได้อย่างแม่นยำ) รถจึงหยุดเป็นมาตรการด้านความปลอดภัย
ส่วนประกอบฮาร์ดแวร์
ในการสร้างโปรเจกต์นี้ คุณจะต้องใช้ส่วนประกอบต่อไปนี้ ซึ่งทั้งหมดมีอยู่ในชุดอุปกรณ์ SunFounder 3-in-1
- Arduino Uno 1 ตัว (หรือบอร์ดที่เข้ากันได้)
- โครงรถอัจฉริยะพร้อมมอเตอร์เกียร์ 2 ตัว
- โมดูลขับมอเตอร์ L298N 1 ตัว
- เซนเซอร์วัดระยะอัลตราโซนิก HC-SR04 1 ตัว
- เบรดบอร์ด 1 ตัว
- สายจัมเปอร์
- แหล่งจ่ายไฟสำหรับรถ (เช่น ชุดแบตเตอรี่)
คู่มือการเดินสายไฟ
การเดินสายไฟเชื่อมต่อโมดูลขับมอเตอร์ เซนเซอร์อัลตราโซนิก และ Arduino โมดูลขับมอเตอร์ควบคุมล้อของรถ ในขณะที่เซนเซอร์อัลตราโซนิกทำหน้าที่เป็น "ดวงตา" ของรถ
นี่คือแผนผังการเชื่อมต่อจากเอกสารของ SunFounder:
มาดูรายละเอียดการเชื่อมต่อกัน ขั้นแรก จ่ายไฟให้กับรางบวกและลบของเบรดบอร์ดจากพิน 5V และ GND ของ Arduino จากนั้นเชื่อมต่อเซนเซอร์อัลตราโซนิกดังนี้:
- VCC (ไฟเลี้ยง): เชื่อมต่อกับรางบวกบนเบรดบอร์ด
- GND (กราวด์): เชื่อมต่อกับรางลบบนเบรดบอร์ด
- Trig (ทริกเกอร์): เชื่อมต่อกับพินดิจิทัล 3 บน Arduino พินนี้ส่งพัลส์อัลตราโซนิก
- Echo (รับสัญญาณ): เชื่อมต่อกับพินดิจิทัล 4 บน Arduino พินนี้รับพัลส์ที่สะท้อนกลับ
การเชื่อมต่อโมดูลขับมอเตอร์เหมือนกับในบทเรียนก่อนหน้านี้ พินควบคุมสี่พิน (IN1, IN2, IN3, IN4) เชื่อมต่อกับพินดิจิทัล 5, 6, 9 และ 10 ของ Arduino พินเหล่านี้ควบคุมความเร็วและทิศทางของมอเตอร์สองตัว ตรวจสอบให้แน่ใจว่าไฟเลี้ยงและกราวด์ของโมดูลขับมอเตอร์เชื่อมต่อกับชุดแบตเตอรี่และกราวด์ของ Arduino อย่างถูกต้อง (ในวิดีโอที่ 02:24)
คำอธิบายโค้ด
โค้ดสำหรับโปรเจกต์นี้ควบคุมพฤติกรรมของรถตามค่าระยะที่อ่านได้จากเซนเซอร์อัลตราโซนิก ตรรกะตรงไปตรงมาและปรับแต่งได้ง่าย มาดูส่วนสำคัญที่ผู้ใช้สามารถกำหนดค่าได้
1. การกำหนดพิน
ที่ด้านบนของสเก็ตช์ มีการกำหนดพินสำหรับมอเตอร์และเซนเซอร์อัลตราโซนิก คุณสามารถเปลี่ยนได้หากเดินสายส่วนประกอบเข้ากับพิน Arduino ที่แตกต่างกัน
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int trigPin = 3;
const int echoPin = 4;
ที่นี่ A_1A, A_1B, B_1A และ B_1B ควบคุมมอเตอร์ซ้ายและขวาผ่านไดรเวอร์ L298N ส่วน trigPin และ echoPin ใช้สำหรับเซนเซอร์อัลตราโซนิก
2. ตัวแปรพฤติกรรมและตรรกะ
พฤติกรรมหลักถูกควบคุมภายในฟังก์ชัน loop() นี่คือจุดที่คุณสามารถปรับ "บุคลิก" ของรถได้
void loop() {
float distance = readSensorData();
if (distance > 25) {
moveForward(200);
}
else if (distance < 10 && distance > 2) {
moveBackward(200);
} else {
stopMove();
}
}
นี่คือวิธีปรับแต่ง:
- ระยะห่างที่กำหนด: ตัวเลข
25และ10กำหนดโซน "ปลอดภัย" และ "อันตราย" ในหน่วยเซนติเมตร เพิ่ม25เพื่อให้รถหยุดเร็วขึ้น หรือลดลงเพื่อให้รถเข้าใกล้อุปสรรคได้มากขึ้น ตัวเลข2คือระยะปลอดภัยเพื่อไม่สนใจค่าที่ผิดพลาดจากวัตถุที่อยู่ใกล้เกินไป - ความเร็วมอเตอร์: ค่า
200ที่ส่งไปยังmoveForward()และmoveBackward()กำหนดความเร็วของรถ ค่านี้สามารถอยู่ในช่วง 0 ถึง 255 ค่าที่ต่ำกว่า เช่น 150 จะทำให้รถเคลื่อนที่ช้าลงและระมัดระวังมากขึ้น
โค้ดที่เหลือประกอบด้วยฟังก์ชัน readSensorData() ซึ่งจัดการจังหวะเวลาของเซนเซอร์อัลตราโซนิกเพื่อคำนวณระยะทาง และฟังก์ชัน moveForward(), moveBackward() และ stopMove() ซึ่งควบคุมไดรเวอร์มอเตอร์เพื่อดำเนินการตามที่ต้องการ
การแก้ไขข้อผิดพลาดทั่วไป
คุณอาจพบข้อผิดพลาดเช่น 'moveForward' was not declared in this scope สิ่งนี้เกิดขึ้นเพราะ Arduino IDE อ่านโค้ดจากบนลงล่าง เมื่อถึงฟังก์ชัน loop() มันยังไม่รู้จักฟังก์ชันที่กำหนดไว้ด้านล่าง เพื่อแก้ไขนี้ คุณต้องเพิ่ม "ฟังก์ชันต้นแบบ" ก่อนฟังก์ชัน setup() ซึ่งเป็นการประกาศชื่อฟังก์ชันและชนิดค่าที่ส่งกลับ โดยลงท้ายด้วยเครื่องหมายอัฒภาค
void moveForward(int speed);
void moveBackward(int speed);
void stopMove();
float readSensorData();
การเพิ่มบรรทัดเหล่านี้บอกคอมไพเลอร์ว่า "ฟังก์ชันเหล่านี้มีอยู่และจะถูกกำหนดในภายหลัง" ซึ่งช่วยแก้ไขข้อผิดพลาดได้ (ในวิดีโอที่ 09:21)
การปรับปรุงความเสถียรของเซนเซอร์
ระหว่างการทดสอบ คุณอาจสังเกตเห็นว่ารถหยุดหรือกระตุกแม้เส้นทางจะโล่ง สาเหตุนี้มักเกิดจากลูปทำงานเร็วเกินไป และเซนเซอร์อัลตราโซนิกไม่มีเวลาเพียงพอที่จะรับสัญญาณสะท้อน ส่งผลให้อ่านค่าได้ 0 ซม. เพื่อแก้ไขนี้ ให้เพิ่มดีเลย์เล็กน้อยที่ส่วนท้ายของฟังก์ชัน loop() เพื่อให้เซนเซอร์มีเวลาทำงาน
void loop() {
float distance = readSensorData();
if (distance > 25) {
moveForward(200);
}
else if (distance < 10 && distance > 2) {
moveBackward(200);
} else {
stopMove();
}
delay(100); // เพิ่มดีเลย์ 100ms เพื่อการอ่านค่าที่เสถียร
}
ดีเลย์ 100 มิลลิวินาทีมักจะเพียงพอที่จะได้การอ่านค่าระยะทางที่เสถียรและสม่ำเสมอ (ในวิดีโอที่ 10:56)
การสาธิตโครงการจริง
เมื่ออัปโหลดโค้ดแล้ว ให้เปิด Serial Monitor คุณจะเห็นข้อความแสดงสถานะของรถ เช่น "Forward", "Reverse" หรือ "Stop"
ในการสาธิต รถถูกวางโดยหันหน้าเข้าหาอุปสรรค เมื่ออุปสรรคอยู่ห่างมากกว่า 25 ซม. รถจะเคลื่อนที่ไปข้างหน้า เมื่อคุณขยับมือเข้ามาใกล้ รถจะหยุดเมื่อระยะทางต่ำกว่า 25 ซม. หากคุณนำมือเข้ามาใกล้มาก ภายใน 10 ซม. รถจะถอยหลัง พฤติกรรมนี้เห็นได้ชัดเจนในวิดีโอและยืนยันว่าตรรกะการหลบหลีกอุปสรรคทำงานอย่างถูกต้อง (ในวิดีโอที่ 11:53)
บทสรุป
ยินดีด้วย! คุณได้สร้างรถอัจฉริยะที่สามารถนำทางในสภาพแวดล้อมและหลบหลีกอุปสรรคได้สำเร็จ โครงการนี้รวมการรับข้อมูลจากเซนเซอร์ ตรรกะการตัดสินใจ และการควบคุมมอเตอร์เข้าด้วยกันเป็นระบบที่ทำงานได้จริง คุณไม่เพียงแต่เรียนรู้วิธีใช้เซนเซอร์อัลตราโซนิก แต่ยังได้เรียนรู้วิธีใช้อัลกอริทึมควบคุมอย่างง่ายซึ่งเป็นพื้นฐานสำหรับหุ่นยนต์อัตโนมัติที่ซับซ้อนมากขึ้น
บทต่างๆ
- [00:00] บทนำสู่การหลบหลีกอุปสรรค
- [01:16] ภาพรวมโครงการและสิ่งที่ต้องเตรียม
- [02:24] การเชื่อมต่อเซนเซอร์อัลตราโซนิกและไดรเวอร์มอเตอร์
- [04:56] การเปิดโค้ดโครงการ
- [05:12] คำอธิบายโค้ด: ตรรกะและฟังก์ชัน
- [08:34] การอัปโหลดโค้ดและการทดสอบเบื้องต้น
- [09:21] การแก้ไขปัญหา: ฟังก์ชันต้นแบบ
- [10:56] การแก้ไขปัญหา: การเพิ่มดีเลย์เพื่อความเสถียร
- [11:53] การสาธิตการหลบหลีกอุปสรรคแบบสด
/*
Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
Get this code and watch video Download and resource page https://robojax.com/RJT609
YouTube video https://www.youtube.com/watch?v=uLBmRvaemxA
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
const int trigPin = 3;
const int echoPin = 4;
void setup() {
Serial.begin(9600);
//motor
pinMode(A_1B, OUTPUT);
pinMode(A_1A, OUTPUT);
pinMode(B_1B, OUTPUT);
pinMode(B_1A, OUTPUT);
//ultrasonic
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
}
void loop() {
float distance = readSensorData();
if (distance > 25) {
moveForward(200);
}
else if (distance < 10 && distance > 2) {
moveBackward(200);
} else {
stopMove();
}
}
float readSensorData() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
return distance;
}
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 stopMove() {
analogWrite(A_1B, 0);
analogWrite(A_1A, 0);
analogWrite(B_1B, 0);
analogWrite(B_1A, 0);
}
Common Course Links
Common Course Files
สิ่งที่คุณอาจต้องการ
-
อเมซอนSunFounder Arduino Learning kit on AliExpresss.click.aliexpress.com
-
อเมซอน
-
อเมซอน
-
อเมซอน
-
อเมซอน
แหล่งข้อมูลและเอกสารอ้างอิง
-
เอกสารDocumentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kit¶docs.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