ค้นหาโค้ด

บทเรียน 25/31: รถอัจฉริยะ Car-3 หลบหลีกสิ่งกีดขวางโดยใช้เซนเซอร์อินฟราเรด | SunFounder Robojax

บทเรียนนี้เป็นส่วนหนึ่งของ: หลักสูตร Arduino ที่ใช้ชุดการเรียนรู้ 3-in-1 ของ SunFounder

บทเรียน 25/31: รถอัจฉริยะ Car-3 หลบหลีกสิ่งกีดขวางโดยใช้เซนเซอร์อินฟราเรด | SunFounder Robojax

โปรเจกต์นี้จะเปลี่ยนรถอัจฉริยะ Arduino 3-in-1 ของ SunFounder ของคุณให้เป็นรถหลบหลีกสิ่งกีดขวางอัตโนมัติ โดยการติดตั้งเซ็นเซอร์อินฟราเรด (IR) สองตัว—หนึ่งตัวทางซ้ายและหนึ่งตัวทางขวา—รถสามารถตรวจจับวัตถุที่อยู่ข้างหน้าและตัดสินใจได้ในเสี้ยววินาทีเพื่อเลี้ยวหลบ นี่คือขั้นตอนพื้นฐานในวิทยาการหุ่นยนต์ ที่จะสอนคุณถึงการผสานข้อมูลจากเซ็นเซอร์เข้ากับตรรกะการควบคุมมอเตอร์เพื่อสร้างเครื่องจักรที่ตอบสนองและขับเคลื่อนได้เอง หลักการที่คุณจะได้เรียนรู้ที่นี่สามารถนำไปประยุกต์ใช้ได้กับงานจริงหลากหลายประเภท รวมถึง:

  • การสร้างหุ่นยนต์ดูดฝุ่น ที่สามารถนำทางในห้องได้โดยไม่ชนเฟอร์นิเจอร์
  • การสร้างหุ่นยนต์เดินตามเส้นหรือแก้เขาวงกต สำหรับการแข่งขันหรือโปรเจกต์การศึกษา
  • การพัฒนาหุ่นยนต์ลาดตระเวนรักษาความปลอดภัยอัตโนมัติ ที่สามารถเดินวนรอบพื้นที่และหลบกำแพงได้
  • การออกแบบรถของเล่นอัจฉริยะ ที่สามารถเล่นได้อย่างอิสระโดยไม่ติดขัด

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

ตรรกะการหลบหลีกสิ่งกีดขวางทำงานอย่างไร

แนวคิดหลักนั้นง่ายมาก: รถใช้เซ็นเซอร์ IR สองตัวเพื่อตรวจสอบสิ่งกีดขวางทางซ้ายและขวา เซ็นเซอร์แต่ละตัวจะส่งสัญญาณดิจิทัล: LOW (0) เมื่อตรวจพบวัตถุภายในระยะ (ประมาณ 20 ซม.) และ HIGH (1) เมื่อเส้นทางโล่ง ตรรกะจะกำหนดการทำงานของรถตามสถานะของเซ็นเซอร์ (ในวิดีโอที่ 02:35):

  • มีสิ่งกีดขวางทางซ้าย ทางขวาโล่ง: รถเลี้ยวขวาเพื่อหลบ
  • มีสิ่งกีดขวางทางขวา ทางซ้ายโล่ง: รถเลี้ยวซ้าย
  • มีสิ่งกีดขวางทั้งสองด้าน: รรถถอยหลังเพื่อหนีจากทางตันที่อาจเกิดขึ้น
  • ไม่มีสิ่งกีดขวาง: รถขับไปข้างหน้า

วิธีการตอบสนองนี้เป็นตัวอย่างคลาสสิกของเครื่องสถานะจำกัด (finite-state machine) ที่พฤติกรรมของรถเป็นการตอบสนองโดยตรงต่อข้อมูลจากเซ็นเซอร์ในขณะนั้น

Sunfounder-Smartcar-Obstacle-avoideance-1

ส่วนประกอบฮาร์ดแวร์

เพื่อให้โปรเจกต์นี้สำเร็จ คุณจะต้องมีส่วนประกอบต่อไปนี้ ซึ่งทั้งหมดมีอยู่ในชุด 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 คือสิ่งที่สำคัญ

Sunfounder-Smartcar-Obstacle-avoideance-wiring

การเชื่อมต่อสายไฟมีดังนี้ (ในวิดีโอที่ 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] การทดสอบจริงครั้งสุดท้ายบนพื้น

ภาพ

Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance 1
Sunfounder smartcar obstacle avoidance wiring
Sunfounder smartcar obstacle avoidance wiring
894-Lesson 25: SunFounder's 3-in-1 Arduino kit Car-3 Smart Car Avoids Obstacle Using Infrared Sensors
ภาษา: C++
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);
}

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

ไลบรารี Arduino (zip)