Search Code

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

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

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

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

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009

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

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

คำแนะนำนี้จัดทำขึ้นจากชุดอุปกรณ์ SunFounder 3-in-1 Arduino และโปรเจกต์ "Play with Ultrasonic Module" เราจะอธิบายการเดินสายไฟ อธิบายโค้ดการตัดสินใจ และสาธิตการทำงานของรถ

26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146

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

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

  • หากระยะทาง > 25 ซม.: เส้นทางโล่ง รถจึงเคลื่อนที่ไปข้างหน้า
  • หาก 10 ซม. < ระยะทาง <= 25 ซม.: ตรวจพบวัตถุใน "เขตเตือน" รถจึงหยุดเพื่อหลีกเลี่ยงการชน
  • หาก 2 ซม. < ระยะทาง <= 10 ซม.: วัตถุอยู่ใกล้ในระดับอันตราย รถจะถอยหลังเพื่อสร้างระยะห่างเพิ่มขึ้น
  • หากระยะทาง <= 2 ซม.: ค่าที่อ่านได้น่าจะเป็นข้อผิดพลาด (ใกล้เกินไปที่จะวัดได้อย่างแม่นยำ) รถจึงหยุดเป็นมาตรการด้านความปลอดภัย

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

ในการสร้างโปรเจกต์นี้ คุณจะต้องใช้ส่วนประกอบต่อไปนี้ ซึ่งทั้งหมดมีอยู่ในชุดอุปกรณ์ SunFounder 3-in-1

  • Arduino Uno 1 ตัว (หรือบอร์ดที่เข้ากันได้)
  • โครงรถอัจฉริยะพร้อมมอเตอร์เกียร์ 2 ตัว
  • โมดูลขับมอเตอร์ L298N 1 ตัว
  • เซนเซอร์วัดระยะอัลตราโซนิก HC-SR04 1 ตัว
  • เบรดบอร์ด 1 ตัว
  • สายจัมเปอร์
  • แหล่งจ่ายไฟสำหรับรถ (เช่น ชุดแบตเตอรี่)
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000

คู่มือการเดินสายไฟ

การเดินสายไฟเชื่อมต่อโมดูลขับมอเตอร์ เซนเซอร์อัลตราโซนิก และ 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] การสาธิตการหลบหลีกอุปสรรคแบบสด

ภาพ

27-SunFounder-Car-5-Follow-Hand
27-SunFounder-Car-5-Follow-Hand
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.09.009
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_02.26.146
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000
26-SunFounder-Car-4-Ultrasonic.mp4_snapshot_00.00.000
899-Lesson 26/31: Avoiding Obstacle Using Ultrasonic Sensor
ภาษา: C++
/*
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);
}

สิ่งที่คุณอาจต้องการ

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

ไฟล์📁

ไลบรารี Arduino (zip)