สร้างหุ่นยนต์เดินตามเส้น Delivery Robot for Society



  1. รายละเอียดโครงการ

1.1. ชื่อโครงการ

Delivery Robot for Society

1.2 ประเภทการแข่งขัน

โปรแกรมเพื่องานการพัฒนาด้านวิทยาศาสตร์และเทคโนโลยี

1.3 สมาชิกกลุ่ม

นางสาว เจียระไน ศรีชอบธรรม 

1.4 อาจารย์ที่ปรึกษาโครงการ

อาจารย์ ทศพล บ้านคลองสี่

  1. สาระสำคัญและคำสำคัญของโครงการ

2.1 สาระสำคัญของโครงการ

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

2.2 Keyword (คำสำคัญ)

– หุ่นยนต์เดินตามเส้น

– ระบบเซนเซอร์ ตรวจจับแสง (5 Ways TCRT5000 Tracking Sensor Module)

– มอเตอร์ไดร์ฟ (L298N Motor Driver)

 

  1. หลักการและเหตุผล

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

 

  1. วัตถุประสงค์ของโครงงาน

4.1 เพื่อใช้ความรู้ทางด้านเทคโนโลยีให้เกิดประโยขน์

4.2 เพื่อศึกษาระบบการทำงานของหุ่นยนต์

4.3 เพื่อเป็นแนวทางสำหรับผู้ที่ต้องการพัฒนา หรือต่อยอด

 

  1. ปัญหาหรือประโยชน์ที่เป็นเหตุผลให้ควรพัฒนาโปรแกรม

5.1 ช่วยให้ผู้ใช้ได้ความรู้เกี่ยวกับหุ่นยนต์เดินตามเส้นอย่างถูกต้อง

5.2 ช่วยให้ผู้ใช้มีกิจกรรมทำ

5.3 ช่วยให้ผู้ใช้ได้ใช้ความคิดเวลาที่หุ่นยนต์เดินตามเส้นที่ผิดพลาด

5.4 การเคลื่อนที่ของหุ่นยนต์ในบางเวลายังคงวิ่งบนเส้นได้ไม่ดีเท่าที่ควร

 

  1. ขอบเขตของโครงงาน



สำหรับโครงงานนี้มีขอบเขตโดยแบ่งการทำงานออกเป็น 2 ส่วน คือ

6.1 ส่วนของการรับข้อมูล

6.1.1 สามารถรับข้อมูลได้จากตัวเซนเซอร์ที่ติดโดยรับเป็นเลขดิจิตอล 0 และ 1

6.2 ส่วนของการแสดงผล

6.2.1 เมื่อรับข้อมูลจากเซนเซอร์แล้วหุ่นยนต์จะไปตามทิศทางที่ทางเราได้กำหนดไว้ในโปรแกรม

 

  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 วิธีการทำงานของโปรแกรม

  1. เปิดเครื่องให้เซนเซอร์ทั้ง 5 ตัวรับข้อมูล โดยรับข้อมูลเป็นเลขดิจิตอล 0 และ 1 (0 = ขาว, 1 = ดำ)
  2. เมื่อเซนเซอร์ทั้ง 5 ตัวรับข้อมูลแล้วก็จะทำการเข้าลูป ทำให้หุ่นยนต์เดินหน้า เลี้ยวซ้าย เลี้ยวขวา และถอยหลัง ตามโลจิกที่กำหนดไว้ในโปรแกรม
  3. เมื่อหุ่นยนต์วิ่งตามเส้นจนพอใจ หรือเมื่อถึงเส้นที่เป็นขีดจะทำให้เซนเซอร์หยุดทำงาน และจบการทำงานของโปรแกรม (หุ่นยนต์หยุดวิ่ง)

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 อาจจะเกิดจากการปล่อยหุ่นยนต์ และส่วนประกอบต่างๆของหุ่นยนต์ยังทำออกมาได้ไม่ดีพอ)

– ส่วนประกอบต่างๆของหุ่นยนต์ยังทำออกมาได้ไม่ดีมากเท่าที่ควร จึงทำให้ใช้งานหุ่นยนต์ได้ไม่เต็มที่

 

  1. ผลการทดสอบโปรแกรม



โปรแกรม และหุ่นยนต์สามารถทำงานได้ดี อาจจะมีขัดข้องเล็กน้อยซึ่งเกิดจากการ Error ของโค้ดในบางครั้ง

  1. แนวทางการพัฒนาต่อในอนาคต

สามารถพัฒนาต่อยอดทำให้หุ่นยนต์ใหญ่ขึ้น บรรทุก หรือบรรจุสิ่งของให้ได้มากขึ้น ทำอัลกอริทึมให้ดีขึ้นหุ่นยนต์จะสามารถเคลื่อนที่ได้ดีขึ้น

  1. ข้อสรุปและข้อเสนอแนะ

ต้องระวังเครื่องขัดข้อง และคอยเช็คมอเตอร์อยู่ตลอดเวลา เพราะบางทีเกิดจากการ Error ของ Coding

  1. บรรณานุกรม

[1]. Arduino

แหล่งที่เข้าถึง : https://www.arduino.cc/

[2]. Flowchart

แหล่งที่เข้าถึง : https://drive.google.com/file/d/1KdEtT7_kojiTTVBS6Bvp6-6F9WpHhkRH/view?usp=sharing

[3]. Robotsiam

แหล่งที่เข้าถึง : 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

 

VDO ที่นำเสนอ : YouTube Preview Image



JEARANAI SRISHOBTHAM
at GlurGeek.Com

Leave a Reply

© 2022 GlurGeek.Com