- รายละเอียดโครงการ
1.1. ชื่อโครงการ
Delivery Robot for Society
1.2 ประเภทการแข่งขัน
โปรแกรมเพื่องานการพัฒนาด้านวิทยาศาสตร์และเทคโนโลยี
1.3 สมาชิกกลุ่ม
นางสาว เจียระไน ศรีชอบธรรม
1.4 อาจารย์ที่ปรึกษาโครงการ
อาจารย์ ทศพล บ้านคลองสี่
- สาระสำคัญและคำสำคัญของโครงการ
2.1 สาระสำคัญของโครงการ
เทคโนโลยีในปัจจุบันมีความก้าวหน้ามากสามารถใช้เทคโนโลยีมาทำงานแทนคนได้หลายรูปแบบ ทางผู้จัดทำจึงอยากที่จะสร้างหุ่นยนต์ โดยเริ่มจากการทำหุ่นยนต์เดินตามเส้น เพื่อนำมาศึกษาในส่วนต่างๆของอุปกรณ์ และพัฒนาให้ดีขึ้นในโอกาสต่อไป
2.2 Keyword (คำสำคัญ)
– หุ่นยนต์เดินตามเส้น
– ระบบเซนเซอร์ ตรวจจับแสง (5 Ways TCRT5000 Tracking Sensor Module)
– มอเตอร์ไดร์ฟ (L298N Motor Driver)
- หลักการและเหตุผล
ในปัจจุบันมนุษย์เราพัฒนาขึ้นมาก ทางผู้จัดทำจึงสนใจที่จะศึกษาหุ่นยนต์เดินตามเส้น และองค์ประกอบต่างๆของหุ่นยนต์เดินตามเส้น เพื่อนำไปใช้ประโยชน์ และพัฒนาประเทศชาติด้วยเทคโนโลยีที่ก้าวหน้าในโอกาสต่างๆต่อไป
- วัตถุประสงค์ของโครงงาน
4.1 เพื่อใช้ความรู้ทางด้านเทคโนโลยีให้เกิดประโยขน์
4.2 เพื่อศึกษาระบบการทำงานของหุ่นยนต์
4.3 เพื่อเป็นแนวทางสำหรับผู้ที่ต้องการพัฒนา หรือต่อยอด
- ปัญหาหรือประโยชน์ที่เป็นเหตุผลให้ควรพัฒนาโปรแกรม
5.1 ช่วยให้ผู้ใช้ได้ความรู้เกี่ยวกับหุ่นยนต์เดินตามเส้นอย่างถูกต้อง
5.2 ช่วยให้ผู้ใช้มีกิจกรรมทำ
5.3 ช่วยให้ผู้ใช้ได้ใช้ความคิดเวลาที่หุ่นยนต์เดินตามเส้นที่ผิดพลาด
5.4 การเคลื่อนที่ของหุ่นยนต์ในบางเวลายังคงวิ่งบนเส้นได้ไม่ดีเท่าที่ควร
- ขอบเขตของโครงงาน
สำหรับโครงงานนี้มีขอบเขตโดยแบ่งการทำงานออกเป็น 2 ส่วน คือ
6.1 ส่วนของการรับข้อมูล
6.1.1 สามารถรับข้อมูลได้จากตัวเซนเซอร์ที่ติดโดยรับเป็นเลขดิจิตอล 0 และ 1
6.2 ส่วนของการแสดงผล
6.2.1 เมื่อรับข้อมูลจากเซนเซอร์แล้วหุ่นยนต์จะไปตามทิศทางที่ทางเราได้กำหนดไว้ในโปรแกรม
- รายละเอียดของการพัฒนาโปรแกรม
7.1 ข้อมูลของการพัฒนาโปรแกรม
หุ่นยนต์ถูกออกแบบมาเพื่อเดินตามเส้น สีดำ หรือสีขาว โดยใช้เซนเซอร์ในการอ่านสีของเส้นที่สะท้อนแสงเข้าไปในเซนเซอร์
7.2 เทคนิค หรือเทคโนโลยีที่ใช้
7.2.1 บอร์ด Arduino Uno R3
เป็นตัวรับค่าและสั่งการ เป็นศูนย์รวมคำสั่งทั้ง Input และ Output
7.2.2 Motor Drive Module L298N
มอเตอร์ที่ใช้ในการขับหุ่นยนต์ในรายงานนี้คือ L298N มอเตอร์มีไว้แสดงผลเมื่อรับค่าจากเซนเซอร์และกำหนดทิศทาง
7.2.3 5-way Senser Infrared Line Tracking
เซนเซอร์ที่ใช้ในการทำรายงานนี้คือเซนเซอร์ 5-Way Infrared Line Tracking bfd-1000 เซนเซอร์จะมีหน้าที่ตรวจจับแสงที่สะท้อนเข้ามา รับค่าได้เป็นสีดำ และขาว ใช้เพื่อรับค่ามาเพื่อกำหนดทิศทางของหุ่นยนต์
7.2.4 โครงสร้างของหุ่นยนต์ (ด้านบน)
7.2.5 โครงสร้างของหุ่นยนต์ (ด้านล่าง)
7.3 เครื่องมือที่ใช้พัฒนา
7.3.1 Hardware – บอร์ด Ardduino Uno R3
7.3.2 Software – โปรแกรม Aduino
7.4 รายละเอียดโปรแกรมที่จะพัฒนา
7.4.1 การออกแบบโปรแกรมโดยรวม
เพื่อภาพที่ชัดเจนเข้าไปดู FlowChart ได้ที่ลิงค์ด้านล่างจ้า
https://drive.google.com/open?id=1FnY-RPSWCWFIluKUgjDAezhsvNhv7sGf
7.4.2 Source Code
// Motor A pins (enableA = enable motor, pinA1 = forward, pinA2 = backward)
int enableA = 10;
int pinA1 = 9;
int pinA2 = 8;
//Motor B pins (enabledB = enable motor, pinB2 = forward, pinB2 = backward)
int enableB = 5;
int pinB1 = 7;
int pinB2 = 6;
int sensor[5] = {0, 0, 0, 0, 0};
int Round=0;
int gate=0;
void setup()
{
pinMode(enableA, OUTPUT);
pinMode(pinA1, OUTPUT);
pinMode(pinA2, OUTPUT);
pinMode(enableB, OUTPUT);
pinMode(pinB1, OUTPUT);
pinMode(pinB2, OUTPUT);
Serial.begin(9600);
}
void loop()
{
enableMotors();
analogWrite(enableA, 120); // ปรับค่าความเร็วของหุ่นยนต์
analogWrite(enableB, 120); // ปรับค่าความเร็วของหุ่นยนต์
sensor[0] = digitalRead(A1);
sensor[1] = digitalRead(A2);
sensor[2] = digitalRead(A3);
sensor[3] = digitalRead(A4);
sensor[4] = digitalRead(A5);
Serial.print(“Round”); Serial.println(Round);
if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0) && (sensor[3] == 1) && (sensor[4] == 1))
forward(1);
else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 1) && (sensor[4] == 1))
forward(1);
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 1))
forward(1);
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 1))
forward(1);
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
turnRight(250);
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 0))
turnRight(250);
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 0) && (sensor[4] == 1))
turnRight(1);
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 0))
turnRight(300);
else if ((sensor[0] == 1) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
turnLeft(1);
else if ((sensor[0] == 0) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
turnLeft(300);
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 1) && (sensor[4] == 1))
turnLeft(250);
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
turnLeft(250);
else if ((sensor[0] == 1) && (sensor[1] == 1) && (sensor[2] == 1) && (sensor[3] == 1) && (sensor[4] == 1))
{
backward(1);
}
else if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0))
{
brake(1000);
delay(1000);
if ((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0) && (gate<1))
{
Round=Round+1;
gate=1;
}
if((sensor[0] == 0) && (sensor[1] == 0) && (sensor[2] == 0) && (sensor[3] == 0) && (sensor[4] == 0) && (Round==1))
{
turnLeft(800);
delay(200);
}
}
else
forward(1);
}
//Define high-level H-bridge commands
void enableMotors()
{
motorAOn();
motorBOn();
}
void disableMotors()
{
motorAOff();
motorBOff();
}
void forward(int time)
{
motorAForward();
motorBForward();
delay(time);
}
void backward(int time)
{
motorABackward();
motorBBackward();
delay(time);
}
void turnLeft(int time)
{
motorABackward();
motorBForward();
delay(time);
}
void turnRight(int time)
{
motorAForward();
motorBBackward();
delay(time);
}
void coast(int time)
{
motorACoast();
motorBCoast();
delay(time);
}
void brake(int time)
{
motorABrake();
motorBBrake();
delay(time);
}
void twist(int time)
{
motorABrake();
motorBForward();
delay(time);
}
//Define low-level H-bridge commands
//enable motors
void motorAOn()
{
digitalWrite(enableA, HIGH);
}
void motorBOn()
{
digitalWrite(enableB, HIGH);
}
//disable motors
void motorAOff()
{
digitalWrite(enableB, LOW);
}
void motorBOff()
{
digitalWrite(enableA, LOW);
}
//motor A controls
void motorAForward()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, LOW);
}
void motorABackward()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, HIGH);
}
//motor B controls
void motorBForward()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, LOW);
}
void motorBBackward()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, HIGH);
}
//coasting and braking
void motorACoast()
{
digitalWrite(pinA1, LOW);
digitalWrite(pinA2, LOW);
}
void motorABrake()
{
digitalWrite(pinA1, HIGH);
digitalWrite(pinA2, HIGH);
}
void motorBCoast()
{
digitalWrite(pinB1, LOW);
digitalWrite(pinB2, LOW);
}
void motorBBrake()
{
digitalWrite(pinB1, HIGH);
digitalWrite(pinB2, HIGH);
}
7.4.3 วิธีการทำงานของโปรแกรม
- เปิดเครื่องให้เซนเซอร์ทั้ง 5 ตัวรับข้อมูล โดยรับข้อมูลเป็นเลขดิจิตอล 0 และ 1 (0 = ขาว, 1 = ดำ)
- เมื่อเซนเซอร์ทั้ง 5 ตัวรับข้อมูลแล้วก็จะทำการเข้าลูป ทำให้หุ่นยนต์เดินหน้า เลี้ยวซ้าย เลี้ยวขวา และถอยหลัง ตามโลจิกที่กำหนดไว้ในโปรแกรม
- เมื่อหุ่นยนต์วิ่งตามเส้นจนพอใจ หรือเมื่อถึงเส้นที่เป็นขีดจะทำให้เซนเซอร์หยุดทำงาน และจบการทำงานของโปรแกรม (หุ่นยนต์หยุดวิ่ง)
7.4.4 แหล่งอ้างอิงโค้ด
http://www.robotsiam.com/article/18/%E0%B9%82%E0%B8%9B%E0%B8%A3%E0%B9%80%E0%B8%88%E0%B8%84-%E0%B8%AB%E0%B8%B8%E0%B9%88%E0%B8%99%E0%B8%A2%E0%B8%99%E0%B8%95%E0%B9%8C%E0%B9%80%E0%B8%94%E0%B8%B4%E0%B8%99%E0%B8%95%E0%B8%B2%E0%B8%A1%E0%B9%80%E0%B8%AA%E0%B9%89%E0%B8%99-5-%E0%B9%80%E0%B8%8B%E0%B9%87%E0%B8%99%E0%B9%80%E0%B8%8B%E0%B8%AD%E0%B8%A3%E0%B9%8C-bfd-1000
7.5 ขอบเขตและข้อจำกัดของโปรแกรมที่พัฒนา
– เวลาใช้งานหุ่นยนต์อาจจะยังมี Error อยู่ในบางครั้ง (Error อาจจะเกิดจากการปล่อยหุ่นยนต์ และส่วนประกอบต่างๆของหุ่นยนต์ยังทำออกมาได้ไม่ดีพอ)
– ส่วนประกอบต่างๆของหุ่นยนต์ยังทำออกมาได้ไม่ดีมากเท่าที่ควร จึงทำให้ใช้งานหุ่นยนต์ได้ไม่เต็มที่
- ผลการทดสอบโปรแกรม
โปรแกรม และหุ่นยนต์สามารถทำงานได้ดี อาจจะมีขัดข้องเล็กน้อยซึ่งเกิดจากการ Error ของโค้ดในบางครั้ง
- แนวทางการพัฒนาต่อในอนาคต
สามารถพัฒนาต่อยอดทำให้หุ่นยนต์ใหญ่ขึ้น บรรทุก หรือบรรจุสิ่งของให้ได้มากขึ้น ทำอัลกอริทึมให้ดีขึ้นหุ่นยนต์จะสามารถเคลื่อนที่ได้ดีขึ้น
- ข้อสรุปและข้อเสนอแนะ
ต้องระวังเครื่องขัดข้อง และคอยเช็คมอเตอร์อยู่ตลอดเวลา เพราะบางทีเกิดจากการ Error ของ Coding
- บรรณานุกรม
[1]. Arduino
แหล่งที่เข้าถึง : https://www.arduino.cc/
[2]. Flowchart
แหล่งที่เข้าถึง : https://drive.google.com/file/d/1KdEtT7_kojiTTVBS6Bvp6-6F9WpHhkRH/view?usp=sharing
[3]. Robotsiam