ฉันสงสัยมาตลอดว่าการสร้างรถยนต์ไร้คนขับนั้นต้องทำอย่างไร ดังนั้นสำหรับโปรแกรมแรกของฉัน ฉันจึงตัดสินใจลองทำดู รถจะวิ่งตามเส้นสีน้ำเงิน และเมื่อเซ็นเซอร์ตัวใดตัวหนึ่งตรวจจับสีแดงได้ รถก็จะเลี้ยวไปในทิศทางตรงกันข้าม
แผ่นด้านหลังรถเป็นที่ที่ฉันติดตั้งแบตเตอรี่พร้อมกับวงจรป้องกันแบตเตอรี่
ตัวถัง (Chassis) ซื้อมาจากอินเทอร์เน็ต แต่ไม่จำเป็นต้องเป็นรุ่นนี้
คำอธิบายโปรแกรม:
1. การกำหนดค่า:
1.1 มอเตอร์:
#include<AFMotor.h>
AF_DCMotormotor1(1, MOTOR12_1KHZ);
AF_DCMotormotor2(3, MOTOR34_1KHZ);
AF_DCMotormotor3(2, MOTOR12_1KHZ);
AF_DCMotormotor4(4, MOTOR34_1KHZ);
บรรทัดแรกคือการ Include ไลบรารี AFMotor บรรทัดที่ 2-4 คือการกำหนดค่ามอเตอร์ต่าง ๆ
1.2 เซ็นเซอร์สี:
const int s0 = A8; //Conection for Sensor
const int s1 = A9;
const int s2L = A11; //Left Sensor
const int s3L = A10;
const int outL = A12;
int redL =0;
int greenL= 0;
int blueL =0;
const int s2R = A14; //Right Sensor
const int s3R = A13;
const int outR = A15;
int redR =0;
int greenR= 0;
int blueR =0;
"A9" และ "A8" เป็นเอาต์พุตสำหรับแสงทั่วไปของ Color Sensor
"s2" และ "s3" คืออินพุตของเซ็นเซอร์ โดยแต่ละเซ็นเซอร์จะมีพอร์ตดังกล่าว ตัวอักษรที่อยู่ท้ายสุดใช้ระบุตำแหน่ง โดย L คือ Left (ซ้าย) และ R คือ Right (ขวา)
out คือเอาต์พุตความถี่ของเซ็นเซอร์เช่นกัน โดยมีทั้ง Left และ Right ดูข้อมูลเพิ่มเติม ที่นี่.
ตัวแปรสำหรับสี Red (แดง), Blue (น้ำเงิน) และ Green (เขียว) ก็มีสองชุดเช่นกัน โดยความแตกต่างคือตัวอักษรสุดท้าย L และ R
1.3 การตรวจจับ:
int sensor_left = 0;
int sensor_right = 0;
ตัวแปรสองตัวนี้ใช้สำหรับกรณีที่รถตรวจจับสีที่ควรติดตามได้ รายละเอียดเพิ่มเติมจะกล่าวถึงภายหลัง
2. การตั้งค่า:
ต่อไปคือ `void Setup()`
2.1 การสื่อสารแบบ Serial
สิ่งแรกคือเราเปิดใช้งานการสื่อสารแบบ Serial
Serial.begin(9600); //Serielle Kommunikation
2.2 เซ็นเซอร์สี:
Color Sensor มีเอาต์พุตหลายตัว เอาต์พุตทั่วไปคือ "s0" และ "s1"
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
สองบรรทัดแรกตั้งค่าขา "s1" และ "s0" เป็นโหมดเอาต์พุต (OUTPUT)
สองบรรทัดสุดท้ายตั้งค่าเอาต์พุตเป็น HIGH เพื่อให้ LED เปิดอยู่ตลอดเวลา
pinMode(s2L, OUTPUT);
pinMode(s3L, OUTPUT);
pinMode(outL, INPUT);
pinMode(s2R, OUTPUT);
pinMode(s3R, OUTPUT);
pinMode(outR, INPUT);
ตอนนี้เราตั้งค่าขาอื่น ๆ โดยขา "s2" และ "s3" ต้องตั้งค่าเป็นโหมดเอาต์พุต (OUTPUT) และขา "out" ต้องตั้งค่าเป็นโหมดอินพุต (INPUT)
3. โปรแกรมหลัก
ตอนนี้มาถึงส่วนหลักแล้ว
3.1 การเรียกใช้ฟังก์ชัน Color
สิ่งแรกคือการเรียกใช้ฟังก์ชัน `color()` ฟังก์ชันนี้จะถูกกำหนดไว้ท้ายโปรแกรม
color();
3.2 การตรวจจับถนน
ในส่วนนี้ เราจะเขียนโปรแกรมสำหรับการตรวจจับถนน เป็นส่วนที่ตรวจสอบว่าถนนอยู่ใต้รถหรือไม่ เราจะทำสิ่งนี้ด้วยฟังก์ชัน `If` ง่ายๆ
if(blueL <= 10 && redL >=11 && greenL >= 11 && blueL < redL && blueL <greenL)
{
sensor_left = 1;
}
else
{
sensor_left = 0;
}
}
เพื่อให้ตัวแปร "sensor_left" เปลี่ยนเป็นสัญญาณ HIGH เงื่อนไขต่อไปนี้ต้องเป็นจริง:
- ตัวแปร "blueL" ต้องมีค่าน้อยกว่าหรือเท่ากับ 10
- ตัวแปร "redL" และ "greenL" ต้องมีค่ามากกว่าหรือเท่ากับ 11
- และ "blueL" ต้องมีค่าน้อยกว่า "redL" และ "greenL"
มิฉะนั้น ตัวแปร "sensor_left" จะมีค่าเป็น 0
โค้ดสำหรับเซ็นเซอร์ Right (ขวา) เหมือนกันทุกประการ ความแตกต่างเพียงอย่างเดียวคือตัว "L" และ "left" จะต้องเปลี่ยนเป็น "R" และ "right" สำหรับเซ็นเซอร์อีกตัวหนึ่ง
3.3 การขับเคลื่อน
ตอนนี้มาถึงส่วนที่สำคัญที่สุดของโปรแกรม นั่นคือส่วนของการขับเคลื่อน
รถถูกตั้งโปรแกรมให้ขับเคลื่อนตรงไปข้างหน้า หากเซ็นเซอร์ทั้งสองตัวที่ด้านหน้าตรวจจับสีน้ำเงินได้ และเมื่อมีเพียงเซ็นเซอร์ตัวเดียวตรวจจับสีน้ำเงินได้ รถจะเลี้ยวไปในทิศทางตรงกันข้าม แต่ถ้ามีเพียงเซ็นเซอร์ด้านหลังเท่านั้นที่ตรวจจับสีน้ำเงินได้ รถจะถอยหลัง
รายละเอียดทางเทคนิคเพิ่มเติม
ระบบการกำหนดเป้าหมายด้วยภาพ
หุ่นยนต์นี้ใช้สีเป็นสัญญาณนำทางหลัก
- เซ็นเซอร์ตรวจจับ: โดยทั่วไปจะใช้ TCS3200 หรือ TCS34725 Color Sensor เซ็นเซอร์จะแปลงแสงเป็นความถี่ ทำให้ Arduino สามารถระบุสีที่โดดเด่นที่อยู่หน้ารถได้
- ตรรกะการไล่ตาม: Arduino จะคำนวณความแตกต่างระหว่าง "สีเป้าหมาย" (เช่น Red) กับค่าที่อ่านได้ในปัจจุบัน หากตรงกัน รถจะเคลื่อนที่ไปข้างหน้าโดยใช้ L298N motor driver
อัลกอริทึมการนำทาง
- โหมดค้นหา: หากสีเป้าหมายหายไป รถจะทำการหมุน 360 องศา จนกว่าเซ็นเซอร์จะตรวจจับสัญญาณได้อีกครั้ง
- การสอบเทียบ (Calibration): เมื่อเริ่มต้น ผู้ใช้จะ "สอน" รถว่าควรติดตามสีใดโดยการวางการ์ดสีไว้หน้าเซ็นเซอร์ ซึ่งทำให้โปรเจกต์นี้มีการโต้ตอบสูงและแสดงให้เห็นถึงพื้นฐานของการติดตามเป้าหมายในวิทยาการหุ่นยนต์