การพัฒนาหุ่นยนต์ที่สามารถหลบหลีกสิ่งกีดขวางได้เป็นหนึ่งในความท้าทายที่น่าสนใจในวงการหุ่นยนต์ในปัจจุบัน โดยหุ่นยนต์ที่สามารถหลบหลีกสิ่งกีดขวางจะต้องสามารถรับรู้และประมวลผลข้อมูลจากต่างๆ ในสภาพแวดล้อม เช่น การตรวจจับสิ่งกีดขวาง และการคำนวณเส้นทางที่เหมาะสมในการหลีกเลี่ยงหรือวิ่งหนี
ในบทความนี้ เราจะพูดถึงหลักการและกระบวนการสร้างหุ่นยนต์ที่ใช้ ESP32 (ESP-WROOM-32) โปรโตคอลพร้อมการใช้ Arduino IDE เพื่อความสะดวกและความสามารถในการพัฒนาที่ยืดหยุ่นมากขึ้น
หลักการ
- ESP32 (ESP-WROOM-32): ESP32 เป็นโมดูล Wi-Fi และ Bluetooth ที่มีประสิทธิภาพสูง มีความสามารถในการประมวลผลที่มากขึ้นเมื่อเปรียบเทียบกับ ESP8266 ทำให้เหมาะสำหรับการใช้ในงานหุ่นยนต์ที่ต้องการประมวลผลหนักๆ
- Arduino IDE: Arduino IDE เป็นเครื่องมือพัฒนาที่นิยมใช้สำหรับโปรแกรมหุ่นยนต์และอุปกรณ์อิเล็กทรอนิกส์อื่นๆ ด้วยภาษาโปรแกรมที่ใช้ง่าย และมีบทเรียนและไลบรารีมากมายที่ช่วยให้การพัฒนาง่ายขึ้น
- เซนเซอร์: การใช้เซนเซอร์เพื่อตรวจจับสิ่งกีดขวางเป็นสิ่งสำคัญในการสร้างหุ่นยนต์หลบสิ่งกีดขวาง สำหรับตัวอย่างนี้ เราสามารถใช้เซนเซอร์อินฟราเรด (Infrared sensor) หรือเซนเซอร์อัลตราโซนิก (Ultrasonic sensor) เพื่อตรวจจับสิ่งกีดขวางได้
- การควบคุมการเคลื่อนที่: หลักการพื้นฐานสำหรับหุ่นยนต์หลบสิ่งกีดขวางคือการควบคุมการเคลื่อนที่โดยใช้มอเตอร์ (DC motor) ในการทำงานนี้ได้
อุปกรณ์ที่ใช้
1. RB-0024 4WD Smart Robot Car Chassis Kits
2. RB-0173 DevKitC V4 ESP32 Development Board
3. RB-0272 ESP32 Expansion Board 38Pins
4. RB-0003 Motor Driver Module L298N
5. RB-0019 รางถ่าน 18650 – 2 ก้อน
6. RB-0025 เสารองแผ่นพีซีบีโลหะแบบเหลี่ยม 8 mm
7. RB-0049 แจ๊กขั้วถ่าน 9 โวลต์ สำหรับ Ardiuno
8. RB-0042 เพาเวอร์สวิตซ์สำหรับเปิดปิด (ON / OFF Rocker Switch)
9. RB-0015 Jumper (F2M) cable wire 20cm Female to Male
10. RB-0021 ถ่านชาร์จ 18650 NCR18650B 3.7v 3400mAh 2 ก้อน
11. RB-0017 Jumper (F2F) cable wire 20cm Female to Female
12. RB-0106 Micro USB Cable Wire 1m for NodeMCU
13. RB-123 HY-SRF05 SRF05 Ultrasonic Distance Sensor Module
14. RB-0121 Jumper (F2F) cable wire 30cm Female to Female
15. RB-0007 Mounting Bracket for HC-SR04 แบบยาว
16. RB-0026 สกรูหัวกลม+น็อตตัวเมีย ขนาด 3มม ยาว 12มม 10ตัว
การสร้าง หุ่นยนต์หลบสิ่งกีดขวาง ESP32
- เตรียมฮาร์ดแวร์: ทำการเชื่อมต่อ ESP32 กับเซนเซอร์ที่เลือกใช้ (เช่น เซนเซอร์อินฟราเรดหรืออัลตราโซนิก) และมอเตอร์ (DC motor) ตามการออกแบบและความต้องการของโปรเจค
- เขียนโค้ด: เริ่มต้นโครงสร้างโค้ดใน Arduino IDE โดยการกำหนดการทำงานของเซนเซอร์ในการตรวจจับสิ่งกีดขวาง และการควบคุมมอเตอร์ในการเคลื่อนที่เพื่อหลบหลีก
เซนเซอร์อัลตราโซนิก (Ultrasonic sensor) เป็นเซนเซอร์ที่ใช้ในการวัดระยะทางโดยใช้คลื่นเสียงอัลตราโซนิก เป็นหลักการทำงานที่มีความคล้ายคลึงกับการใช้เสียงเป็นตัวบ่งชี้ในการวัดระยะทาง โดยเซนเซอร์อัลตราโซนิกประกอบด้วยสองส่วนหลัก คือ ส่วนส่งคลื่นเสียง (Transmitter) และส่วนรับคลื่นเสียง (Receiver) ซึ่งมีหลักการทำงานดังนี้:
- การส่งคลื่นเสียง: เซนเซอร์อัลตราโซนิกจะเริ่มการทำงานโดยการส่งคลื่นเสียงจากส่วนส่งคลื่นเสียงออกไปในสิ่งแวดล้อม โดยคลื่นเสียงที่ส่งออกจะมีความถี่สูงกว่าคลื่นเสียงที่มนุษย์สามารถได้ยินได้ (ทั่วไปอยู่ในช่วง 40 kHz)
- การสะท้อนและการรับคลื่นเสียง: เมื่อคลื่นเสียงที่ส่งออกชนกับวัตถุที่อยู่ในสิ่งแวดล้อม คลื่นเสียงจะถูกสะท้อนกลับมาสู่เซนเซอร์ และส่วนรับคลื่นเสียงจะตรวจจับคลื่นเสียงที่ถูกส่งกลับมา
- การคำนวณระยะทาง: เมื่อเซนเซอร์ได้รับคลื่นเสียงที่ถูกส่งกลับมา ระยะทางจะถูกคำนวณโดยการวัดเวลาที่ใช้ในการส่งคลื่นเสียงไปและกลับมา โดยใช้สูตรเวลาที่ใช้ = ระยะทาง x ความเร็วของเสียง ซึ่งในอากาศความเร็วของเสียงประมาณ 343 เมตรต่อวินาที
- การแปลงข้อมูลและการอ่าน: ระยะทางที่คำนวณได้จากขั้นตอนก่อนหน้านี้จะถูกแปลงเป็นสัญญาณดิจิตอล หรืออาจถูกแปลงเป็นระยะทางที่แสดงผลบนหน้าจอหรืออุปกรณ์คอมพิวเตอร์
- การควบคุมการทำงาน: ข้อมูลระยะทางที่ได้จากการวัดจะถูกนำไปใช้ในการควบคุมการทำงานของหุ่นยนต์ คือ เมื่อ หุ่นยนต์พบสิ่งกีดขวาง ระยะทางใกล้กว่า 20 เซนติเมตร จะถอยหลัง แล้ว เลี้ยวหลบไปทางซ้าย
- ด้วยหลักการทำงานข้างต้น เซนเซอร์อัลตราโซนิกสามารถใช้งานได้ในหลากหลายแอปพลิเคชัน เช่น หุ่นยนต์หลบสิ่งกีดขวาง การหมุนเข็มกล้องอัตโนมัติ เครื่องวัดระยะทางในรถยนต์เพื่อช่วยในการจอดรถ และอื่นๆ อีกมากมาย ทำให้เซนเซอร์อัลตราโซนิกเป็นเครื่องมือที่สำคัญในการพัฒนาและสร้างงานอัจฉริยะในยุคปัจจุบัน
1.ประกอบหุ่นยนต์และเชื่อมต่อวงจร
บัดกรีสายมอเตอร์ โดย สายสีแดงอยู่ด้านบน และ สายสีดำอยู่ด้านล่าง ทั้ง 4 ตัว
ยึดมอเตอร์เข้ากับโครงหุ่นยนต์ (ด้านล่าง)
ยึดเสา 6 ต้น สำหรับใส่โครงหุ่นยนต์ด้านบน
การต่อวงจร
ยึด Expansion Board (บอร์ดขยายขา ESP32) , โมดูลขับมอเตอร์ และ รางถ่าน เข้ากับโครงหุ่นยนต์ด้านบน
ใส่บอร์ด ESP32 เข้ากับ บอร์ดขยายขา ESP32
ต่อสายไฟ จากรางถ่าน กับ แจ๊กขั้วถ่าน โดย สายสีแดง ต่อ ผ่านสวิตช์ปิดเปิด แล้ว เสียบแจ๊กขั้วถ่าน เข้ากับ DC 6.5 – 16V ของ บอร์ดขยายขา ESP32
ใส่ถ่าน 18650 จำนวน 2 ก้อน และ เมื่อเปิดไฟเข้า ต้องมีไฟติดทั้ง 3 บอร์ด คือ บอร์ดขยายขา ESP32 , บอร์ด ESP32 และ โมดูลขับมอเตอร์
เชื่อมต่อวงจร ระหว่าง บอร์ดขยายขา ESP32 กับ โมดูลขับมอเตอร์
(ใช้ Jumper (F2F) ความยาว 20 cm ในการเชื่อมต่อ)
เชื่อมต่อ มอเตอร์ ทั้ง 4 ตัวเข้ากับ โมดูลขับมอเตอร์ (ตรวจสอบการต่อสายและสีของสาย)
ใส่ล้อและยึดน็อตโครงหุ่นยนต์ชั้นบนกับชั้นล่างเข้าด้วยกัน
ภาพรวมการต่อหุ่นยนต์
2.ติดตั้ง Arduino IDE
สิ่งแรกคือการติดตั้ง Arduino IDE เพื่อให้คุณสามารถค้นหา Arduino IDE ใน Google
จากนั้นคุณมีสองทางเลือก
หนึ่งคือการติดตั้งเวอร์ชัน1 หรือเพื่อติดตั้งเวอร์ชัน 2
เราจะติดตั้งเวอร์ชัน 2 เพราะมีคุณสมบัติเพิ่มเติมบางอย่าง แต่ไม่ว่าคุณจะเลือกอะไรมันจะทำงานเช่นกัน ดังนั้นคุณสามารถเลือกอย่างใดอย่างหนึ่ง
ดาวน์โหลด Arduino IDE จากที่นี่
https://www.arduino.cc/en/software
กำหนดค่าให้ รองรับบอร์ด ESP32
ไปที่ File > Preferences
คัดลอกและวางบรรทัดต่อไปนี้ลงในฟิลด์ Boards Manager URLs
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
คลิกไอคอนตัวจัดการบอร์ดที่มุมด้านซ้าย ค้นหา ESP32 และกดปุ่มติดตั้งสำหรับ esp32 โดย Espressif Systems
3. ทดสอบ การเคลื่อนที่ของหุ่นยนต์
การทดสอบนี้ เป็นการตรวจสอบการต่อสายต่างๆ เช่น การเชื่อมต่อสายของมอเตอร์ ทั้ง 4 ตัว รวมทั้งสายอื่นๆ ของหุ่นยนต์ที่เราสร้าง ว่าถูกต้องหรือไม่ ถ้าถูกต้องหุ่นยนต์จะดำเนินการดังนี้
คือ เดินหน้า -> ถอยหลัง -> เลี้ยวซ้าย -> เลี้ยวขวา
และนี่คือโค้ดที่ใช้ทดสอบ
int MA1 = 27; // Motor A1
int MA2 = 26; // Motor A2
int PWM_A = 14; // Speed Motor A
int MB1 = 17; // Motor B1
int MB2 = 16; // Motor B2
int PWM_B = 4; // Speed Motor B
int SPEED = 255; // Speed PWM สามารถปรับความเร็วได้ถึง 0 - 255
void setup() {
//Setup Channel A
pinMode(MA1, OUTPUT); //Motor A1
pinMode(MA2, OUTPUT); //Motor A2
pinMode(PWM_A, OUTPUT); //Speed PWM Motor A
//Setup Channel B
pinMode(MB1, OUTPUT); //Motor B1
pinMode(MB2, OUTPUT); //Motor B2
pinMode(PWM_B, OUTPUT); //Speed PWM Motor B
}
void loop() {
Stop(5000);
Forward(600);
Stop(200);
Backward(600);
Stop(200);
turnLeft(600);
Stop(200);
turnRight(600);
}
void Backward(int time)
{
digitalWrite(MA1, LOW);
digitalWrite(MA2, HIGH);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, HIGH);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, SPEED);
delay(time);
}
void Forward (int time)
{
digitalWrite(MA1, HIGH);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, LOW);
digitalWrite(MB2, HIGH);
analogWrite(PWM_B, SPEED);
delay(time);
}
void turnLeft(int time)
{
digitalWrite(MA1, HIGH);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, LOW);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, 0);
delay(time);
}
void turnRight(int time)
{
digitalWrite(MA1, LOW);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, 0);
digitalWrite(MB1, LOW);
digitalWrite(MB2, HIGH);
analogWrite(PWM_B, SPEED);
delay(time);
}
void Stop(int time)
{
digitalWrite(MA1, LOW);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, 0);
digitalWrite(MB1, LOW);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, 0);
delay(time);
}
ลิงค์โค้ด https://lungmaker.com/code/test-motor-esp32.ino
เชื่อมต่อสาย Micro USB ระหว่าง คอมพิวเตอร์ กับ ESP32 และ ต้องเปิดสวิตช์เพื่อจ่ายไฟจากรางถ่านให้กับหุ่นยนต์ด้วย
เลือกบอร์ด ESP32 ตามรุ่นที่ใช้ เป็น ESP32 Dev Module
เลือก Port โดยไปที่ Tools -> Port -> COM5
(โดย COM5 แต่ละเครื่องจะไม่เหมือนกัน ให้เลือกตามที่ปรากฎ)
คลิกที่ Upload
แสดงการ Upload สำเร็จ
วิดีโอผลลัพธ์การทำงาน การเคลื่อนที่ของหุ่นยนต์ ESP32
ถ้ายังทำงานไม่ถูกต้อง คือ เดินหน้า -> ถอยหลัง -> เลี้ยวซ้าย -> เลี้ยวขวา ให้กลับไปแก้ไขการต่อวงจร การต่อสายต่างๆ เช่น การต่อสายมอเตอร์ จนกว่าจะทำงานถูกต้อง ถึงจะสามารถไปทำงานในขั้นตอนต่อไป
4. เชื่อมต่อวงจร ระหว่าง บอร์ดขยายขา ESP32 กับ เซ็นเซอร์ HY-SRF05
(ใช้ Jumper (F2F) ความยาว 30 cm ในการเชื่อมต่อ)
และนี่คือโค้ดที่ใช้ทดสอบ
const unsigned int TRIG_PIN=15;
const unsigned int ECHO_PIN=2;
const unsigned int BAUD_RATE=115200;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(BAUD_RATE);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
const unsigned long duration= pulseIn(ECHO_PIN, HIGH);
int distance= duration/29/2;
if(duration==0){
Serial.println("Warning: no pulse from sensor");
}
else{
Serial.print("distance to nearest object:");
Serial.println(distance);
Serial.println(" cm");
}
delay(100);
}
ลิงค์โค้ด https://lungmaker.com/code/test-srf05-esp32.ino
Upload Code
แล้วไปที่ Tools -> Serial Monitor
เลือก Both NL & CR และ เลือก 115200 baud
Serial Monitor จะแสดง ระยะทางที่ห่าง จาก สิ่งกีดขวาง มีหน่วยเป็น cm (เซนติเมตร)
แสดงว่า การเชื่อมต่อ เซ็นเซอร์ HY-SRF05 ของเรานั้นถูกต้อง และ พร้อมใช้งานแล้ว
5. ทดสอบ หุ่นยนต์หลบสิ่งกีดขวาง ESP32
โค้ด หุ่นยนต์หลบสิ่งกีดขวาง
int MA1 = 27; // Motor A1
int MA2 = 26; // Motor A2
int PWM_A = 14; // Speed Motor A
int MB1 = 17; // Motor B1
int MB2 = 16; // Motor B2
int PWM_B = 4; // Speed Motor B
int SPEED = 200; // Speed PWM สามารถปรับความเร็วได้ถึง 0 - 255
const unsigned int TRIG_PIN = 15;
const unsigned int ECHO_PIN = 2;
//long x;
int x;
void setup() {
//Setup Channel A
pinMode(MA1, OUTPUT); //Motor A1
pinMode(MA2, OUTPUT); //Motor A2
pinMode(PWM_A, OUTPUT); //Speed PWM Motor A
//Setup Channel B
pinMode(MB1, OUTPUT); //Motor B1
pinMode(MB2, OUTPUT); //Motor B2
pinMode(PWM_B, OUTPUT); //Speed PWM Motor B
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
const unsigned long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 29 / 2;
x = (distance);
if (distance < 20) {
Backward(400);
turnLeft(1000);
} else {
Forward(1);
}
delay(100);
}
void Backward(int time) {
digitalWrite(MA1, LOW);
digitalWrite(MA2, HIGH);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, HIGH);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, SPEED);
delay(time);
}
void Forward(int time) {
digitalWrite(MA1, HIGH);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, LOW);
digitalWrite(MB2, HIGH);
analogWrite(PWM_B, SPEED);
delay(time);
}
void turnLeft(int time) {
digitalWrite(MA1, HIGH);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, SPEED);
digitalWrite(MB1, LOW);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, 0);
delay(time);
}
void turnRight(int time) {
digitalWrite(MA1, LOW);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, 0);
digitalWrite(MB1, LOW);
digitalWrite(MB2, HIGH);
analogWrite(PWM_B, SPEED);
delay(time);
}
void Stop(int time) {
digitalWrite(MA1, LOW);
digitalWrite(MA2, LOW);
analogWrite(PWM_A, 0);
digitalWrite(MB1, LOW);
digitalWrite(MB2, LOW);
analogWrite(PWM_B, 0);
delay(time);
}
ลิงค์โค้ด https://lungmaker.com/code/esp32-obstacle-robot.ino
วิดีโอผลลัพธ์การทำงาน หุ่นยนต์เดินตามเส้น ESP32
สรุป
การได้ทดลองสร้างหุ่นยนต์หลบสิ่งกีดขวางโดยใช้ ESP32 และเซ็นเซอร์อัลตราโซนิกนั้นมีข้อดีมากมายดังนี้:
- เรียนรู้และปรับปรุงทักษะ: การสร้างหุ่นยนต์ด้วยตัวเองช่วยให้คุณได้ฝึกทักษะการพัฒนาซอฟต์แวร์และฮาร์ดแวร์ที่สำคัญ ซึ่งเป็นประโยชน์สำหรับนักพัฒนาที่ต้องการพัฒนาทักษะในด้านนี้หรือนักศึกษาทางวิศวกรรม.
- นวัตกรรมและความคิดสร้างสรรค์: การทดลองสร้างหุ่นยนต์ให้หลบสิ่งกีดขวางเป็นโอกาสที่ดีในการนำเสนอความคิดสร้างสรรค์และนวัตกรรมใหม่ๆ โดยสามารถนำไปใช้ในงานวิจัยหรือการพัฒนาผลิตภัณฑ์ใหม่ได้.
- เพิ่มความยืดหยุ่นในการทำงาน: หุ่นยนต์ที่สามารถหลบสิ่งกีดขวางได้สามารถใช้ในหลายสถานการณ์ เช่น การใช้ในงานอุตสาหกรรม, การตรวจสอบสภาพแวดล้อม, หรือใช้ในงานที่ต้องการการเคลื่อนไหวอัตโนมัติที่ถูกแขวนกับสภาพแวดล้อม.
- เสถียรภาพและประสิทธิภาพ: การใช้ ESP32 และเซ็นเซอร์อัลตราโซนิกช่วยให้หุ่นยนต์มีความเสถียรและประสิทธิภาพในการตรวจจับและหลบสิ่งกีดขวางได้ดี เนื่องจาก ESP32 เป็นไมโครคอนโทรลเลอร์ที่มีประสิทธิภาพและมีความสามารถในการประมวลผลข้อมูลได้อย่างมีประสิทธิภาพ และเซ็นเซอร์อัลตราโซนิกมีความแม่นยำในการตรวจจับสิ่งกีดขวาง.
- การพัฒนาต่อเนื่อง: การทดลองสร้างหุ่นยนต์หลบสิ่งกีดขวางนี้เป็นพื้นฐานที่ดีสำหรับการพัฒนาต่อเนื่อง คุณสามารถเพิ่มฟีเจอร์เพิ่มเติมหรือปรับปรุงโปรแกรมเพื่อให้หุ่นยนต์ทำงานได้ดียิ่งขึ้นตามความต้องการของคุณได้อย่างอิสระ.