Posted in

โปรเจค Arduino หุ่นยนต์แก้เขาวงกต (Maze-Solving Robot)

โปรเจค Arduino หุ่นยนต์แก้เขาวงกต (Maze-Solving Robot)

โปรเจคนี้เป็นการสร้างหุ่นยนต์แก้เขาวงกต (Maze-Solving Robot) โดยใช้ Arduino Uno
ร่วมกับเซ็นเซอร์ IR จำนวน 3 ตัว และอัลกอริทึมที่เรียกว่า
Hand-on-Wall Rule สำหรับนำทาง

จุดเด่นของโปรเจคนี้คือใช้ “เส้นสี” แทนกำแพง ทำให้สามารถออกแบบและทดสอบเขาวงกตได้ง่าย
เหมาะสำหรับผู้เริ่มต้นและผู้ที่ต้องการศึกษา Robotics และ Logic การตัดสินใจ


อุปกรณ์ที่ใช้ (Devices & Components)


หลักการทำงาน (Working Principle)

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

อัลกอริทึมที่ใช้คือ Left-Hand Rule (หรือ Right-Hand Rule)
ซึ่งเป็นวิธีแก้เขาวงกตแบบง่ายแต่มีประสิทธิภาพ

  • หุ่นยนต์จะ “เกาะผนังด้านหนึ่ง” ตลอดเวลา
  • เมื่อเจอทางแยก → เลี้ยวตามกฎที่ตั้งไว้
  • เมื่อเจอทางตัน → กลับหลัง (U-turn)
  • ทำซ้ำจนกว่าจะออกจากเขาวงกตได้

แม้วิธีนี้จะไม่ใช่เส้นทางที่สั้นที่สุด แต่รับประกันว่าสามารถหาทางออกได้แน่นอน


การต่อวงจร (Circuit & Assembly)

  • IR Sensor 3 ตัว → ต่อที่ขา A0, A1, A2
  • มอเตอร์ → ต่อผ่าน Motor Shield ที่ M1 และ M2
  • แบตเตอรี่ → จ่ายไฟให้ Arduino และมอเตอร์

ตำแหน่งของเซ็นเซอร์สำคัญมาก หากวางไม่ถูกต้อง
หุ่นยนต์อาจตรวจจับทางเลี้ยวผิดพลาด จำเป็นต้องมีการปรับจูน (Calibration)


หลักการตัดสินใจของหุ่นยนต์

หุ่นยนต์จะอ่านค่าจากเซ็นเซอร์ทั้ง 3 ตัว (ซ้าย-หน้า-ขวา)
แล้วนำมารวมเป็นสถานะ (State) เพื่อตัดสินใจการเคลื่อนที่ เช่น:

  • ไม่มีเส้น → กลับหลัง (U-turn)
  • มีทางตรง → เดินหน้า
  • มีทางซ้าย → เลี้ยวซ้าย
  • มีทางขวา → เลี้ยวขวา

โค้ดโปรแกรม Arduino


#include <AFMotor.h>

// Motor
AF_DCMotor motorA(1);
AF_DCMotor motorB(2);

// Sensor
const int leftSensor = A0;
const int frontSensor = A1;
const int rightSensor = A2;

// Speed
const int forwardSpeed = 120;
const int TurningSpeed = 115;

void setup() {
  pinMode(leftSensor, INPUT);
  pinMode(frontSensor, INPUT);
  pinMode(rightSensor, INPUT);
  Serial.begin(9600);
}

void loop() {
  int leftValue = digitalRead(leftSensor);
  int frontValue = digitalRead(frontSensor);
  int rightValue = digitalRead(rightSensor);

  int sensorState = (leftValue << 2) | (frontValue << 1) | rightValue;

  switch (sensorState) {
    case 0b000:
      uTurn();
      break;
    case 0b010:
      moveForward();
      break;
    case 0b100:
      turnLeft();
      break;
    case 0b001:
      turnRight();
      break;
    default:
      stopMotors();
      break;
  }
}

void moveForward() {
  motorA.setSpeed(forwardSpeed);
  motorB.setSpeed(forwardSpeed);
  motorA.run(FORWARD);
  motorB.run(FORWARD);
}

void turnLeft() {
  motorA.run(BACKWARD);
  motorB.run(FORWARD);
}

void turnRight() {
  motorA.run(FORWARD);
  motorB.run(BACKWARD);
}

void stopMotors() {
  motorA.run(RELEASE);
  motorB.run(RELEASE);
}

void uTurn() {
  motorA.run(FORWARD);
  motorB.run(BACKWARD);
}

สรุป

โปรเจคหุ่นยนต์แก้เขาวงกต เป็นโปรเจคที่ช่วยฝึกทั้งด้าน
การเขียนโปรแกรม, การควบคุมมอเตอร์ และ Logic Algorithm

เหมาะสำหรับผู้เริ่มต้นไปจนถึงนักศึกษา และสามารถนำไปต่อยอดเป็น
หุ่นยนต์อัจฉริยะ หรือแข่งขัน Robotics ได้

ไม่ใช่แค่ให้หุ่นยนต์ “เดินได้” แต่คือการสอนให้มัน “คิดและตัดสินใจ”