โปรเจกต์ หุ่นยนต์ Obstacle Avoiding Robot แบบ Rotating Head ที่ใช้ Arduino
หุ่นยนต์ Autonomous นี้ถูกสร้างขึ้นบน Arduino UNO และสามารถตรวจจับสภาพแวดล้อมได้ด้วยความช่วยเหลือของ Ultrasonic Sensor
หุ่นยนต์ Autonomous นี้ถูกสร้างขึ้นบน Arduino UNO และสามารถตรวจจับสภาพแวดล้อมได้ด้วยความช่วยเหลือของ Ultrasonic Sensor
หุ่นยนต์อัตโนมัติ (Autonomous robot) คือหุ่นยนต์ที่สามารถเคลื่อนที่ได้ด้วยตัวเองในสภาพแวดล้อมที่ไม่คุ้นเคยและไม่มีโครงสร้างแน่นอน หุ่นยนต์อัตโนมัติจะถูกติดตั้งซอฟต์แวร์อัจฉริยะเพื่อ Sensor สภาพแวดล้อม ตรวจจับสิ่งกีดขวางในเส้นทาง และเคลื่อนที่ไปรอบๆ เพื่อหลบหลีกสิ่งกีดขวางเหล่านั้น มีการออกแบบหุ่นยนต์มากมายที่นำมาใช้ในการสร้างหุ่นยนต์อัตโนมัติ ซึ่งการออกแบบเหล่านี้มักจะพัฒนาขึ้นโดยคำนึงถึงสภาพแวดล้อมทางกายภาพที่หุ่นยนต์ต้องลงไปปฏิบัติงาน มีหุ่นยนต์อัตโนมัติหลายประเภท เช่น หุ่นยนต์งู หุ่นยนต์เดินได้ โดรนอัตโนมัติ และรถหุ่นยนต์หรือ Rover อัตโนมัติ
ในบทช่วยสอนนี้ เราจะออกแบบรถหุ่นยนต์อัตโนมัติ โดยรถหุ่นยนต์จะใช้ Ultrasonic sensor เพื่อ Sensor สภาพแวดล้อมและตรวจจับสิ่งกีดขวาง หุ่นยนต์สามารถหมุน Ultrasonic sensor จาก 0 องศาไปจนถึง 180 องศาได้ด้วยความช่วยเหลือของ Servo motor และค้นหาเส้นทางหลบหนีโดยการวัดระยะทางทางด้านซ้ายและขวา หุ่นยนต์จะเลี้ยวซ้ายหรือขวาโดยอัตโนมัติขึ้นอยู่กับด้านที่ไม่มีสิ่งกีดขวางหรือด้านที่สิ่งกีดขวางอยู่ไกลกว่า หุ่นยนต์ถูกออกแบบมาให้เคลื่อนที่หลบหลีกสิ่งกีดขวางที่ตรวจพบด้านหน้า รถหุ่นยนต์ที่ออกแบบในโปรเจกต์นี้ทำงานด้วย Geared DC motors สองตัวและใช้พลังงานจากแบตเตอรี่
วงจรควบคุมของหุ่นยนต์สร้างขึ้นบน Arduino UNO โดยมีการเชื่อมต่อ Ultrasonic sensor, Servo motor และ Motor driver IC เข้ากับ Geared DC motors สองตัวผ่านบอร์ด Arduino สำหรับ Arduino sketch จะทำหน้าที่เริ่มต้นให้หุ่นยนต์เคลื่อนที่ไปข้างหน้าและจัดการตรวจจับสิ่งกีดขวางที่อยู่ข้างหน้า สั่งหมุน Ultrasonic sensor ด้วย Servo motor เพื่อวัดระยะทางด้านซ้ายและด้านขวา แล้วจึงสั่งให้หุ่นยนต์เลี้ยวซ้ายหรือขวาตามระยะทางที่ว่างพอจะเคลื่อนที่ไปได้ Arduino sketch นี้เขียนและคอมพิวต์โดยใช้ Arduino IDE ส่วนวงจรควบคุมจะถูกประกอบและติดตั้งบนหุ่นยนต์แบบสองล้อพร้อมล้อแคสเตอร์ (Castor wheel)
Circuit Connections
วงจรควบคุมของหุ่นยนต์อัตโนมัตินี้สร้างขึ้นโดยใช้ Arduino UNO ซึ่งมีการเชื่อมต่อ Ultrasonic sensor, Servo motor และ Motor driver IC เข้ากับ Geared DC motors สองตัวผ่านบอร์ด Arduino โดยวงจรควบคุมประกอบด้วยส่วนประกอบและการเชื่อมต่อดังนี้ -
Arduino based Autonomous Robot Circuit Mounted on Robot
Power Supply - ในวงจรนี้ Arduino UNO, Servo motor และ Ultrasonic sensor ต้องการไฟ DC 5V ที่ผ่านการควบคุมแรงดัน (Regulated) เพื่อทำงาน ในขณะที่ Motor driver IC ต้องการไฟ DC 12V โดยใช้แบตเตอรี่ NIMH 12V เป็นแหล่งพลังงานหลัก ไฟจากแบตเตอรี่จะถูกควบคุมแรงดันเป็น 5V และ 12V โดยใช้ IC 7805 และ 7812 ตามลำดับ Pin 1 ของ IC ควบคุมแรงดันทั้งสองจะเชื่อมต่อกับขั้วบวกของแบตเตอรี่ และ Pin 2 เชื่อมต่อกับ Ground ส่วนเอาต์พุตแรงดันจะดึงมาจาก Pin 3 ของ IC แต่ละตัว มีการเชื่อมต่อ LED พร้อมกับตัวต้านทาน Pull-up ขนาด 10K Ω ระหว่าง Ground ร่วมและ Pin เอาต์พุตเพื่อแสดงสถานะการจ่ายไฟ แม้จะใช้แบตเตอรี่ 12V แต่ก็ยังใช้ 7812 เพื่อให้แหล่งจ่ายไฟไปยัง Motor driver IC มีความเสถียรและสม่ำเสมอ
Arduino UNO - Arduino UNO เป็นหนึ่งในบอร์ด Prototyping ที่ได้รับความนิยมมากที่สุด มักใช้ในแอปพลิเคชันด้านหุ่นยนต์เนื่องจากมีขนาดเล็กและมีฟีเจอร์ครบครัน บอร์ดมาพร้อมกับ Arduino boot loader ในตัว เป็นบอร์ดควบคุมที่ใช้ชิป Atmega 328 ซึ่งมี 14 GPIO pins, 6 PWM pins, 6 Analog inputs และมีอินเตอร์เฟซ UART, SPI และ TWI บนบอร์ด ในโปรเจกต์นี้มีการใช้ 6 GPIO pins เพื่อเชื่อมต่อกับ Motor driver IC, 1 GPIO pin สำหรับ Servo motor และ 2 GPIO pins สำหรับ Ultrasonic sensor
HC-SR04 Ultrasonic Sensor - HC-SR04 Ultrasonic sensor ใช้คลื่นโซนาร์ในการระบุระยะทางไปยังวัตถุเช่นเดียวกับค้างคาวหรือโลมา มีประสิทธิภาพในการตรวจจับระยะแบบไม่สัมผัสที่ยอดเยี่ยม ให้ค่าที่แม่นยำและเสถียรในช่วงระยะ 2 ซม. ถึง 400 ซม.
ในวงจรมีการติดตั้ง Ultrasonic sensor ไว้ที่ด้านหน้าของหุ่นยนต์ โดยเชื่อมต่อกับ Pin A0 และ A1 ของบอร์ด Arduino ตัว Sensor มีสี่ Pin ได้แก่ Ground (Pin 1), Echo (Pin 2), Trigger (Pin 3) และ VCC โดย Pin VCC และ Ground จะเชื่อมต่อกับ VCC และ Ground ส่วนกลางตามลำดับ Pin Echo ของ Sensor เชื่อมต่อกับ Pin A1 และ Pin Trigger เชื่อมต่อกับ Pin A0 ของบอร์ด Arduino
Ultrasonic sensor ทำงานบนหลักการสะท้อนของคลื่นเสียง เมื่อมีการส่ง Pulse ระดับ HIGH ขนาด 10 u sec ไปยัง Trigger pin ของ Sensor มันจะส่งคลื่น Sonic Pulse ระดับ HIGH ความถี่ 40 KHz ออกไป 8 ครั้งต่อเนื่องกัน สัญญาณ High pulse จะถูกส่งออกจาก Echo pin เมื่อคลื่น Ultrasonic ถูกส่งออกไป เมื่อคลื่นนี้กระทบกับสิ่งกีดขวาง มันจะสะท้อนกลับมาและถูกตรวจจับโดย Sensor
เมื่อตรวจพบคลื่นที่สะท้อนกลับมา สัญญาณ High pulse จาก Echo pin จะสิ้นสุดลง สัญญาณที่ได้รับจาก Echo pin จะมีลักษณะเป็น Analog ระยะทางจากสิ่งกีดขวางสามารถวัดได้โดยการคำนวณระยะเวลาช่วงที่เป็น High ของ Echo pin ซึ่งเป็นเวลาระหว่างการส่งและการสะท้อนกลับของคลื่นโซนาร์ โดยมีสูตรคำนวณดังนี้ -
Test distance = (high level time × velocity of sound (340M/S)) / 2
เวลานำมาคูณกับความเร็วแล้วหารด้วย 2 เนื่องจากเวลาที่วัดได้คือเวลาที่คลื่นเดินทางไปถึงสิ่งกีดขวางและเดินทางกลับมา ดังนั้นการวัดระยะทางในหน่วย ซม. จึงใช้สูตรดังนี้ -
Test distance = (high level time × velocity of sound (340M/S)) / 2
= (high level time(microsecond) × velocity of sound (340M/S)) / 2
= high level time x 340/2000000 m
= high level time x 34000/2000000 cm
= high level time x 34/2000 cm
Ultrasonic sensor จะส่ง High pulse ออกมาจาก Pin 2 ซึ่งจะถูกตรวจจับที่ Pin A1 ของบอร์ด Arduino ส่วน Code ของโปรแกรมจะวัดระยะเวลาของ Pulse และแปลงเป็นค่า Digital เพื่อคำนวณหาระยะทางตามสูตรข้างต้น
ในตอนเริ่มต้น หุ่นยนต์จะหัน Ultrasonic sensor ไปทางด้านหน้า เมื่อตรวจพบสิ่งกีดขวาง มันจะหมุน Sensor ไปทางซ้ายและขวาเพื่อวัดระยะทางทั้งสองด้าน ค่าระยะทางเหล่านี้จะถูกนำมาใช้เพื่อตัดสินใจว่าหุ่นยนต์ควรเลี้ยวซ้ายหรือขวาเพื่อหาเส้นทางหลบหลีก
Ultrasonic sensor mounted over Servo Motor
Servo motor - Servo motor ถูกนำมาใช้เพื่อหมุน Ultrasonic sensor จากด้านหน้าไปทางซ้าย จากนั้นไปทางขวา และกลับมาที่ด้านหน้าอีกครั้ง Servo motor มีสามขั้ว ได้แก่ VCC, Ground และ Control โดย VCC และ Ground เชื่อมต่อกับแหล่งจ่ายร่วม สัญญาณ Pulse width modulated (PWM) จะถูกส่งไปยังขั้ว Control ของมอเตอร์เพื่อสั่งหมุนระหว่างมุม 0 ถึง 180 องศา ด้วยเหตุนี้เราจึงเลือกใช้ Servo motor รุ่น SG-90 ที่สามารถหมุนได้ระหว่าง 0 ถึง 180 องศา
L293D DC Motor Driver IC - L293D เป็น IC ขับมอเตอร์แบบ Dual H-bridge ซึ่งทำหน้าที่เป็นตัวขยายกระแส เนื่องจากรับสัญญาณควบคุมที่มีกระแสต่ำและจ่ายสัญญาณที่มีกระแสสูงกว่าออกมาเพื่อขับเคลื่อนมอเตอร์ มีทั้งหมด 16 Pin พร้อมการกำหนดค่า Pin ดังนี้:
เราใช้ DC motors สองตัวในการสร้างรถหุ่นยนต์ โดยเชื่อมต่อมอเตอร์ระหว่าง Pin 3 กับ 6 และ Pin 14 กับ 11 ของ Motor driver IC
IC L293D จะควบคุม DC Motors ตามตารางความจริง (Truth tables) ต่อไปนี้:
Pin 4, 5, 13 และ 12 ของ L293D จะเชื่อมต่อลง Ground ขณะที่ Pin 1, 16 และ 9 เชื่อมต่อกับไฟ DC 5V และ Pin 8 เชื่อมต่อกับไฟ DC 12V ส่วน Pin 15, 2, 7 และ 10 ของ Motor driver IC เชื่อมต่อกับ Pin 5, 2, 3 และ 4 ของบอร์ด Arduino ตามลำดับ สำหรับ DC motor ล้อขวาเชื่อมต่อกับ Pin 11 และ 14 ส่วนมอเตอร์ล้อซ้ายเชื่อมต่อกับ Pin 3 และ 6 ของ Motor driver IC และ Enable pins 1 และ 9 เชื่อมต่อกับ Pin 9 และ 10 ของ Arduino UNO
Geared DC Motors - ในหุ่นยนต์ตัวนี้ Geared DC motors ขนาด 12V จะถูกติดตั้งเข้ากับล้อ โดยมอเตอร์ประเภทนี้มีให้เลือกหลายช่วง RPM และ Torque ซึ่งช่วยให้หุ่นยนต์เคลื่อนที่ได้ตามสัญญาณควบคุมที่ได้รับจาก Motor driver IC
หุ่นยนต์อัตโนมัตินี้มีฟังก์ชันการทำงานที่เรียบง่ายมาก เมื่อเชื่อมต่อแบตเตอรี่แล้ว หุ่นยนต์จะเริ่มทำงานและตรวจจับสิ่งกีดขวางด้านหน้า หากไม่มีสิ่งกีดขวาง หุ่นยนต์จะเคลื่อนที่ไปข้างหน้า แต่เมื่อเจอสิ่งกีดขวาง มันจะหยุดอยู่กับที่และ Servo motor จะหมุนไปที่ 0 องศาเพื่อหัน Ultrasonic sensor ไปทางซ้าย หุ่นยนต์จะวัดระยะทางด้านซ้ายหลังจาก Servo หมุนเสร็จสิ้น
จากนั้นหุ่นยนต์จะหมุน Servo ไปที่ 180 องศาเพื่อหัน Ultrasonic sensor ไปทางขวา และวัดระยะทางด้านขวา ระยะทางทั้งสองด้านจะถูกเปรียบเทียบโดยโปรแกรม Arduino และหุ่นยนต์จะเลี้ยวไปในทิศทางที่มีระยะทางว่างมากกว่า หุ่นยนต์จะเลี้ยวซ้ายหรือขวาเพื่อข้ามผ่านสิ่งกีดขวางด้านหน้า และจะเลี้ยวในทิศทางตรงกันข้ามอีกครั้งเพื่อกลับมาเคลื่อนที่ไปข้างหน้าตามปกติ
หุ่นยนต์จะเคลื่อนที่ไปข้างหน้า, ถอยหลัง, เลี้ยวซ้าย หรือเลี้ยวขวา โดยการกำหนดลอจิกอินพุตที่ Pin ของ Motor driver ดังนี้ -
หุ่นยนต์สามารถชะลอความเร็วหรือเร่งความเร็วในระหว่างการหลบหลีกสิ่งกีดขวางได้โดยการใช้ PWM ที่เหมาะสมที่ Enable pins ของ Motor driver IC สำหรับ DC motors แต่ละตัว การทำงานของหุ่นยนต์สรุปได้ใน Flowchart ต่อไปนี้ -
Autonomous Robot Programming Algorithm
การตรวจจับสิ่งกีดขวาง, การหยุดหุ่นยนต์, การหมุน Servo motor เพื่อหัน Ultrasonic sensor, การวัดระยะทางด้านซ้ายและขวา และการเลี้ยวหลบหลีก ทั้งหมดนี้ถูกจัดการโดย Arduino sketch ซึ่งมีเงื่อนไข (Conditionals) ในการตรวจจับและตอบสนองต่อสภาพแวดล้อม สามารถศึกษาคู่มือการเขียนโปรแกรมและ Code ฉบับเต็มเพื่อเรียนรู้เกี่ยวกับโค้ดที่ทำให้หุ่นยนต์ตัวนี้เป็นนักสำรวจอัตโนมัติ
Arduino sketch เริ่มต้นด้วยการนำเข้า Library ที่จำเป็น โดยมีการนำเข้า New ping library สำหรับ Ultrasonic sensor (สามารถศึกษารายละเอียดเพิ่มเติมได้ที่เว็บไซต์ทางการของ Arduino และดาวน์โหลดได้จาก NewPing.h) และนำเข้า Servo.h library เพื่อควบคุม Servo motor
#include
มีการประกาศตัวแปรเพื่อกำหนด Pin ของ Microcontroller ตามการเชื่อมต่อกับ Ultrasonic sensor, Servo และ L293D motor driver IC
Initialization in Arduino Sketch
มีการเรียกใช้ฟังก์ชัน setup() เพื่อกำหนดให้ Pin ที่เชื่อมต่อกับ Echo pin ของ Ultrasonic sensor เป็น Input และกำหนดให้ Pin ที่เชื่อมต่อกับ Motor driver IC และ Trigger pin เป็น Output โดยใช้ฟังก์ชัน pinMode() ซึ่งฟังก์ชัน setup() จะทำงานเพียงครั้งเดียวเมื่อเริ่มต้น Sketch
ฟังก์ชัน loop() จะถูกเรียกใช้เพื่อทำงานซ้ำไปเรื่อยๆ โดยในฟังก์ชันนี้ จะมีการอ่านค่าจาก Ultrasonic sensor ผ่านฟังก์ชัน readsensor()
Loop Function implementing main logic in Arduino Sketch
ฟังก์ชัน decidepath() ใช้เพื่อสั่งหมุน Servo และวัดระยะทางด้านซ้ายและขวาของหุ่นยนต์ ส่วนฟังก์ชัน checkdistance() ใช้เพื่อระบุเส้นทางที่ไม่มีสิ่งกีดขวาง และตัดสินใจว่าหุ่นยนต์ควรเลี้ยวซ้าย, ขวา หรือกลับตัว
Functions used in Arduino Sketch
สามารถศึกษา Code Arduino ฉบับเต็มเพื่อความเข้าใจที่ลึกซึ้งยิ่งขึ้น จากนั้นให้นำ Code ลงบอร์ด Arduino ประกอบวงจร และทดสอบการทำงานของหุ่นยนต์อัตโนมัติ นี่คือคู่มือการเขียนโปรแกรมสำหรับหุ่นยนต์อัตโนมัติที่ใช้ Arduino UNO
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้