หุ่นยนต์หลบหลีกสิ่งกีดขวางและตรวจหาโลหะด้วย Arduino



1. บทนำ แนวคิด ความสำคัญ และความเป็นมาของโครงการ

– โปรเจคเป็นการสร้างหุ่นหลบหลีกและตรวจสอบวัตถุโลหะ ซึ่งเราได้สร้างมันขึ้นเพื่อเข้าถึงพื้นที่ที่สลับซับซ้อน ด้วยเป็นหุ่นที่มีประสิทธิภาพใช้ได้ในพื้นที่ที่อันตรายโดยไม่ทำให้มนุษย์มีความเสี่ยงแต่อย่างใด หุ่นสามารถตรวจสอบในพื้นที่ที่เข้าถึงได้ยากๆ และคับแคบได้อย่างมีประสิทธิภาพปัจจุบันนี้ความก้าวหน้าทางอุตสาหกรรมพัฒนาไปรวดเร็ว มีการติดตั้งเครื่องจักรที่สลับซับซ้อนที่ยากแก่การตรวจและตรวจสอบวัตถุของของมนุษย์ และงานสำรวจในบางประเภทที่มนุษย์ไม่สามารถเข้าไปสำรวจหรือตรวจสอบได้ เช่น การตรวจสอบในโรงงานไฟฟ้านิวเคลียร์   ทางเราปฏิบัติการพัฒนาหุ่นยนต์ภาคสนาม (FIBO) ได้ เล็งเห็นถึงปัญหานี้ซึ่งดำเนินการวิจัยและพัฒนาหุ่นยนต์ตรวจสอบ (Inspection Robot) ขึ้นมา เพื่อให้เป็นเครื่องมือในการตรวจสอบวัตถุอันตรายแก่มนุษย์

2.วัตถุประสงค์และเป้าหมาย

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

3.รายละเอียดของการพัฒนา



3.1  เนื้อเรื่องย่อ  ภาพประกอบ แบบจำลอง

–  แบบจำลองที่ใช่ในการพัฒนาหุ่นต้นแบบระบบการตรวจสอบหาวัตถุโลหะนั้นมีความจำเป็นอย่างยิ่งสำหรับการหาตรวจสอบวัตถุโลหะ

แบบจำลอง   

             

                           



 ทฤษฎีที่เกี่ยวข้อง ตัวอย่างโปรแกรม

 

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

3.3 เครื่องมือในการพัฒนา

  1. Arduino R3
  2. Motor Driver shield มอเมอร์
  3. Wheel (4x)
  4. TT Gear Motor (4x)
  5. Servo motor
  6. Battery Panasonic Alkaline 1.5V (6x)
  7. Battery Panasonic neo 9V
  8. Male and female jumpe wire
  9. Switch
  10. Micro servo

3.4  แสดงการต่อวงจรของ Arduino และ Sensors พร้อมคำอธิบาย

VCC เข้า 5V               Trigger เข้า PIN A4

Echo เข้า PIN A5        GND เข้า GND

Motor 1 เข้า M1          Motor 2 เข้า M2

Motor 3 เข้า M3          Motor 4 เข้า M4

ภาพงานประกอบเสร็จสมบูรณ์



3.5  รายละเอียดโปรแกรมที่พัฒนาในเชิงเทคนิค ให้เป็นส่วนๆ การทำงาน โดยให้แสดง

3.5.1 Flowchart

https://drive.google.com/drive/folders/1gEygiPqhXXhCfFS3kF4uwtS5Ws-x6EkI?usp=sharing

3.5.2

https://drive.google.com/drive/folders/1gEygiPqhXXhCfFS3kF4uwtS5Ws-x6EkI?usp=sharing

3.5.3  Source Code ที่นำมาพัฒนา

http://www.mertarduino.com/arduino-obstacle-avoiding-robot-car-4wd/2018/11/22/

3.6  ขอบเขตและข้อจำกัดของโปรแกรมที่พัฒนา

-โปรแกรมหุ่นมีระยะขอบเขตของการตรวจสอบวัตถุโลหะเพียงในระยะของตัวหุ่นซึ่งมีระยะประมาณ 10 cm. เมื่อหุ่นไปอยู่ในระยะวัตถุตรวจจพบจะส่งสัญญานการเตือนในตัวหุ่น ภายระยะขอบเขตนั้น ๆ โดยเป็นข้อจำกัดของตัวหุ่นและโปรแกรมบอร์ด

  1. กลุ่มผู้ใช้โปรแกรม พร้อมผลการประเมินจากผู้ใช้

– ต่อการเรียนรู้ ทำให้ผู้เรียนเกิดทักษะและได้รับประสบการณ์ที่ใกล้เคียงกับงานจริง เมื่อเวลาประสบปัญหา

จริงจะทำให้สามารถแก้ไขและป้องกันความเสียหายอันเกิดจากข้อผิดพลาดในการทำงาน

การศึกษาซอฟต์แวร์ที่ใช้จำลองการทำงานของหุ่นยนต์ โดยผู้ใช้มีปฏิสัมพันธ์ต่อโปรแกรมขณะ

เรียนรู้และเป็นโปรแกรมแบบ Open Source ที่อนุญาตให้ผู้ใช้เพิ่มเติมได้โดยไม่มีลิขสิทธิ์ พบว่า

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



  1. ผลของการทดสอบโปรแกรม ให้ใส่รูปแสดงการทำงานของชิ้นงาน และใส่ตารางผลการทดลอง

           

  

สรุปผลการทดลอง

  • สามารถ Compile code และ Born เข้า Board ได้สำเร็จ เมื่อการทำงานของบอร์ด Arduino ทำงาน Sensor และชิ้นส่วนต่าง ๆ ก็ทำงานเป็นไปตามปกติ แต่ต้องปรับแก้โปรแกรมโค้ดของตัวหุ่นนิดหน่อยจึงจะสมบูรณ์
  1. ปัญหาอุปสรรค

– การหาอุปกรณ์เป็นไปได้ยากลำบาก

-หุ่นยนต์ไม่มีความเสถียรในการทำงานตามคำสั่ง

  1. แนวทางในการพัฒนาต่อในอนาคต สามารถประยุกต์ใช้ร่วมกับงานอื่น ๆ ได้อย่างไร

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

– การพัฒนาต่ออาจจะใช้ในการตรวจสอบพื้นที่ที่อันตรายหรือวัตถุนิวเคลียร์

– สามารถพัฒนาแผงวงจรได้วอีก เพื่อเพิ่มขอบเขตในการตรวจสอบเพิ่มขึ้นในบริเวณนั้นได้

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

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

– การทำงานของเซ็นเซอร์ไม่เป็นไปตามที่ต้องการซึ่งเซ็นเซอร์ทำงานช้า ควรจะพัฒนาให้เซ็นเซอร์พร้อมกับการทำงานของตัวดปรแกรม

  1. แหล่งที่มาอ้างอิง

–  http://www.mertarduino.com/arduino-obstacle-avoiding-robot-car-4wd/2018/11/22/



Clip D.I.Y

Clip การทดลอง

https://youtu.be/04CF9YjGovM

Code Arduino

#include <AFMotor.h>
#include <Servo.h>
#include <NewPing.h>

#define TRIG_PIN A4
#define ECHO_PIN A5
#define MAX_DISTANCE 500
#define MAX_SPEED 200
#define MAX_SPEED_OFFSET 40
#define COLL_DIST 30
#define TURN_DIST COLL_DIST+20
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);

AF_DCMotor leftMotor1(1, MOTOR12_1KHZ);
AF_DCMotor leftMotor2(2, MOTOR12_1KHZ);
AF_DCMotor rightMotor1(3, MOTOR34_1KHZ);
AF_DCMotor rightMotor2(4, MOTOR34_1KHZ);
Servo myservo;

int leftDistance, rightDistance;
int curDist = 0;
String motorSet = “”;
int speedSet = 0;

void setup() {
myservo.attach(10);
myservo.write(90);
delay(1000);
}

void loop() {
myservo.write(90);
delay(90);
curDist = readPing();
if (curDist < COLL_DIST) {changePath();}
moveForward();
delay(500);
}

void changePath() {
moveStop();
myservo.write(36);
delay(500);
rightDistance = readPing();
delay(500);
myservo.write(144);
delay(700);
leftDistance = readPing();
delay(500);
myservo.write(90);
delay(100);
compareDistance();
}
void compareDistance()
{
if (leftDistance>rightDistance)
{
turnLeft();
}
else if (rightDistance>leftDistance)
{
turnRight();
}
else
{
turnAround();
}
}
int readPing() {
delay(70);
unsigned int uS = sonar.ping();
int cm = uS/US_ROUNDTRIP_CM;
return cm;
}

void moveStop() {leftMotor1.run(RELEASE); leftMotor2.run(RELEASE); rightMotor1.run(RELEASE); rightMotor2.run(RELEASE);}

void moveForward() { //Mert Arduino https://bit.ly/MertArduino
motorSet = “FORWARD”;
leftMotor1.run(FORWARD);
leftMotor2.run(FORWARD);
rightMotor1.run(FORWARD);
rightMotor2.run(FORWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2)
{
leftMotor1.setSpeed(speedSet);
leftMotor2.setSpeed(speedSet);
rightMotor1.setSpeed(speedSet);
rightMotor2.setSpeed(speedSet);
delay(5);
}
}

void moveBackward() {
motorSet = “BACKWARD”;
leftMotor1.run(BACKWARD);
leftMotor2.run(BACKWARD);
rightMotor1.run(BACKWARD);
rightMotor2.run(BACKWARD);
for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2)
{
leftMotor1.setSpeed(speedSet);
leftMotor2.setSpeed(speedSet);
rightMotor1.setSpeed(speedSet);
rightMotor2.setSpeed(speedSet);
delay(5);
}
}
void turnRight() {
motorSet = “RIGHT”;
leftMotor1.run(FORWARD);
leftMotor2.run(FORWARD);
rightMotor1.run(BACKWARD);
rightMotor2.run(BACKWARD);
rightMotor1.setSpeed(speedSet+MAX_SPEED_OFFSET);
rightMotor2.setSpeed(speedSet+MAX_SPEED_OFFSET);
delay(1500);
motorSet = “FORWARD”;
leftMotor1.run(FORWARD);
leftMotor2.run(FORWARD);
rightMotor1.run(FORWARD);
rightMotor2.run(FORWARD);
}
void turnLeft() {
motorSet = “LEFT”;
leftMotor1.run(BACKWARD);
leftMotor2.run(BACKWARD);
leftMotor1.setSpeed(speedSet+MAX_SPEED_OFFSET);
leftMotor2.setSpeed(speedSet+MAX_SPEED_OFFSET);
rightMotor1.run(FORWARD);
rightMotor2.run(FORWARD);
delay(1500);
motorSet = “FORWARD”;
leftMotor1.run(FORWARD);
leftMotor2.run(FORWARD);
rightMotor1.run(FORWARD);
rightMotor2.run(FORWARD);
}

void turnAround() {
motorSet = “RIGHT”;
leftMotor1.run(FORWARD);
leftMotor2.run(FORWARD);
rightMotor1.run(BACKWARD);
rightMotor2.run(BACKWARD);
rightMotor1.setSpeed(speedSet+MAX_SPEED_OFFSET);
rightMotor2.setSpeed(speedSet+MAX_SPEED_OFFSET);
delay(1700);
motorSet = “FORWARD”;
leftMotor1.run(FORWARD);
leftMotor2.run(FORWARD);
rightMotor1.run(FORWARD);
rightMotor2.run(FORWARD);
}



Downloads Library

Library ทั้งหมด

https://drive.google.com/drive/folders/1sFt8By-Y76emMHy1JQ8BXG9WRJjTNJLl?usp=sharing

Adafruit-Motor-Shield-library-master

https://drive.google.com/drive/folders/1we6jvaMpmXeZULF8TTrBDSavEugY4qFT?usp=sharing

Arduino-NewPing-master

https://drive.google.com/drive/folders/1rEGXbh7gE1h6X51oHN13uaBt-iR_9lyE?usp=sharing

Ultrasonic

https://drive.google.com/drive/folders/1N5oFj9R3ajawe_bU81GKaSgeCPBLBSkZ?usp=sharing

เรื่อง หุ่นหลบหลีกสิ่งกรีดขวางตรวจหาวัตถุโลหะ

จัดทำโดย

นาย ปฏิพล ยูนุช

นาย ธณุวัฒน์ ปั้นเอม

นาย จิราธิวัฒน์ อาบสุวรรณ



PATIPOL YOONUCH
at GlurGeek.Com
กำลังศึกษา คณะวิศวกรรมศาสตร์ สาขาวิศวกรรมไฟฟ้า มหาวิทยาลัยกรุงเทพ
งานอดิเรกที่ชอบ ชอบถ่ายภาพวิน หรือในสถานที่ที่ไม่เคยไปมาก่อน

Leave a Reply

© 2022 GlurGeek.Com