



จัดไปวัยรุ่น! นี่คือไลบรารี Arduino สำหรับควบคุมมอเตอร์ DC ตัวนี้จัดเต็มทั้งฟังก์ชันและความยืดหยุ่น ควบคุมมอเตอร์ DC แบบไหนก็ได้ตามใจสั่ง ออกแบบมาให้ตอบโจทย์การควบคุมการเคลื่อนที่แบบ industrial motion control เลยทีเดียว ไลบรารีตัวนี้มีฟังก์ชันให้ใช้ถึง 16 แบบ ควบคุมมอเตอร์ได้แบบจัดเต็มสุดๆ มาดูกันว่ามีอะไรบ้าง
1. ควบคุมทิศทางการหมุนของมอเตอร์
2. ควบคุมความเร็วมอเตอร์ได้ตั้งแต่ 0-100%
3. ให้มอเตอร์เริ่มทำงานแบบ soft start ในเวลาที่กำหนด – คือความเร็วจะค่อยๆ เพิ่มจาก 0% ไปถึงระดับที่ต้องการในเวลาที่เราตั้ง
4. ให้มอเตอร์หยุดแบบ smooth stop ในเวลาที่กำหนด – ความเร็วจะค่อยๆ ลดจากระดับปัจจุบันลงมาถึง 0% ในเวลาที่ตั้ง
5. ใช้การควบคุมแบบ jog control กับมอเตอร์ได้ทั้งสองทิศทาง – คือให้มอเตอร์กระตุกในทิศทางที่กำหนด
6. ใช้ DC BREAK (หยุดฉุกเฉินทันที) กับมอเตอร์ได้
รายละเอียดคร่าวๆ ของฟังก์ชันทั้งหมดในไลบรารีมีให้ดูที่นี่ ตามด้วยตัวอย่างที่อธิบายวิธีควบคุมมอเตอร์ด้วยไลบรารีนี้ มีวิดีโอสาธิต 3 คลิปให้ดูด้วย สุดท้ายมีวงจรตัวอย่างที่ใช้ H-Bridge ซึ่งเป็นวงจรยอดฮิตสำหรับควบคุมมอเตอร์ DC มาแนะนำ
วิธีใช้ไลบรารีนี้ในสเก็ตช์ Arduino ของน้องก็ง่ายๆ แค่คัดลอกโฟลเดอร์ DC_Motor ไปวางในไดเรกทอรีหลักของโฟลเดอร์ไลบรารี Arduino เช่น C:\\arduino-1.6.7\\libraries
โครงสร้างโค้ด: ไลบรารีควบคุมมอเตอร์ DC
การเขียนโค้ดควบคุมมอเตอร์ดิบๆ ใน loop() หลักเนี่ย มันจะกลายเป็นกองโค้ดรกๆ อ่านยากเต็มไปด้วยคำสั่ง analogWrite(pin5, 255) โปรเจกต์ DC Motor Library นี้จะสอนให้น้องรู้จักจัดระเบียบโค้ดให้เป็นโครงสร้าง โดยใช้แนวคิด Object-Oriented Programming (OOP) ใน Arduino IDE
แนะนำการเขียนโปรแกรมเชิงวัตถุสำหรับหุ่นยนต์
แทนที่จะต้องพิมพ์โค้ด 6 บรรทัดเพื่อให้รถเลี้ยวซ้าย น้องสามารถสร้างไลบรารีของตัวเองขึ้นมา แล้วแค่พิมพ์ myCar.TurnLeft(100); เท่านั้น
- ไฟล์เฮดเดอร์
DCMotor.h: น้องสร้างไฟล์ใหม่เพื่อกำหนด "คลาส" ขึ้นมา มันจะเก็บตัวแปรต่างๆ เช่นPinFwd,PinBwd, และPWM_Pin - ไฟล์อิมพลีเมนต์
DCMotor.cpp: น้องเขียนฟังก์ชันหลักๆ ที่ทำงานหนักๆ ไว้ในนี้
void DCMotor::setSpeed(int speed) {
if (speed > 0) {
digitalWrite(PinFwd, HIGH); // เดินหน้า
analogWrite(PWM_Pin, speed);
}
}
loop()ที่สะอาดตา: ในไฟล์สเก็ตช์หลักของน้อง โค้ดจะกลายเป็นสิ่งที่สวยงามและอ่านง่ายมาก น้องแทบจะแค่เขียนว่า:LeftMotor.setSpeed(200); RightMotor.setSpeed(200);
ทำไมต้องสนใจเรื่อง Architecture ของ L298N
ถ้าน้องกำลังจะสร้างหุ่นยนต์ Omni-Wheel หรือ Mecanum-wheel ที่ต้องใช้มอเตอร์เป๊ะๆ 4 ตัว (พินควบคุมทิศ 8 พิน + PWM 4 พิน) เรื่องนี้เป็นเรื่องบังคับเลยนะตัวนี้
- ถ้าใช้ L298N Motor Driver แบบคลาสสิก น้องต้องคอยจับตาดู
IN1, IN2, ENAแค่สำหรับมอเตอร์ตัวเดียวก็ปวดหัวแล้ว - การรวมพินทั้งสามให้เป็น "Object" เดียวในโค้ด จะช่วยป้องกันไม่ให้น้องเผลอสั่งให้
IN1กับIN2เป็น HIGH พร้อมกัน ซึ่งถ้าเกิดเหตุการณ์นั้นขึ้น... ตามหลักคณิตศาสตร์แล้ว บอร์ดขับมอเตอร์ของน้องจะช็อตแน่นอน! (ห้ามช็อตนะตัวนี้)
สิ่งที่ต้องรู้/มี ก่อนเริ่ม
- Arduino Uno/Mega: สภาพแวดล้อมสำหรับคอมไพล์
- มอเตอร์ DC 2 ตัว & โครงรถหุ่นยนต์ (Chassis) มาตรฐาน
- L298N Dual H-Bridge Motor Driver
- ความเข้าใจพื้นฐานเกี่ยวกับคลาสและเมธอดใน C++
คำอธิบายฟังก์ชันในไลบรารี:
1. DC_Motor(int pin1, int pin2): ฟังก์ชันนี้ใช้ประกาศพินของ Arduino ที่จะใช้ขับมอเตอร์ DC
2. DC_Motor(int pin1, int pin2, int speed_flag): ฟังก์ชันนี้ใช้ประกาศพินเอาต์พุตแบบอนาล็อกของ Arduino ที่จะใช้ขับมอเตอร์ DC
3. start_motor(int dir): ฟังก์ชันนี้ใช้เริ่มหมุนมอเตอร์ในทิศทางที่กำหนด ถ้า direction เป็น 1 – มอเตอร์จะหมุนไปข้างหน้า และในทางกลับกัน
4. forward():ฟังก์ชันนี้จะเริ่มหมุนมอเตอร์ในทิศทางไปข้างหน้า
5. reverse():ฟังก์ชันนี้จะเริ่มหมุนมอเตอร์ในทิศทางถอยหลัง
6. dc_break():ฟังก์ชันนี้จะหยุดการหมุนของมอเตอร์ทันที*
7. stop_motor(): ฟังก์ชันนี้จะหยุดการหมุนของมอเตอร์
8. jogg_full_speed(int dir) : ฟังก์ชันนี้จะกระตุก (jerk) มอเตอร์เป็นเวลา 5 วินาทีที่ความเร็วเต็มในทิศทางที่ต้องการ
*หมายเหตุ: - ฟังก์ชันนี้จะทำงานได้ก็ต่อเมื่อมอเตอร์ DC มีวงจรภายในรองรับการเบรกแบบ DC นี้เท่านั้น และต้องออกแบบวงจรขับมอเตอร์ที่เหมาะสม พร้อมกับตัวต้านทานเบรกไดนามิก (DBR) และต้องระวังอย่างมากเพื่อไม่ให้มอเตอร์หรือวงจรเสียหาย
ฟังก์ชันทั้งหมดข้างต้นให้การควบคุมมอเตอร์ DC แบบพื้นฐาน ไม่ได้ควบคุมความเร็วของมอเตอร์ ฟังก์ชัน 8 ข้อต่อไปนี้จะควบคุมทั้งความเร็วและทิศทางของมอเตอร์ แต่จำเป็นต้องเลือกใช้พินเอาต์พุตแบบอนาล็อกของ Arduino เพื่อใช้ฟังก์ชันเหล่านี้ โดยต้องเริ่มต้นใช้งานมอเตอร์ DC ด้วยฟังก์ชันที่ 2 พร้อมกับตั้งค่า speed_flag เป็น 1
9. set_speed(int speed): ฟังก์ชันนี้จะตั้งค่าความเร็วของมอเตอร์ DC ระหว่าง 0 ถึง 100%
10. forward_with_set_speed(): ฟังก์ชันนี้จะเริ่มหมุนมอเตอร์ DC ไปข้างหน้าด้วยความเร็วที่ตั้งไว้
11. reverse_with_set_speed(): ฟังก์ชันนี้จะเริ่มหมุนมอเตอร์ DC ถอยหลังด้วยความเร็วที่ตั้งไว้
12. run_motor(int dir, int speed): ฟังก์ชันนี้จะหมุนมอเตอร์ DC ในทิศทางใดก็ได้ด้วยความเร็วที่ตั้งไว้
13. jogg_set_speed(int dir, int speed): ฟังก์ชันนี้จะกระตุก (jerk) มอเตอร์ในทิศทางใดก็ได้ด้วยความเร็วที่ตั้งไว้
14. motor_speed_zero()*: ฟังก์ชันนี้จะลดความเร็วของมอเตอร์ลงเหลือ 0 – หมายถึงหยุดมอเตอร์
15. soft_start(int dir, int speed, inttime_in_sec) :ฟังก์ชันนี้จะเพิ่มความเร็วของมอเตอร์จาก 0 ไปถึงระดับที่ต้องการภายในเวลาที่กำหนด ในทิศทางใดก็ได้ โดยต้องเลือกเวลาเป็นหน่วยวินาที
16. smooth_stop(int time_in_sec): ฟังก์ชันนี้จะลดความเร็วของมอเตอร์จากความเร็วที่กำลังทำงานอยู่ลงเหลือ 0 ภายในเวลาที่กำหนด โดยต้องเลือกเวลาเป็นหน่วยวินาที
*หมายเหตุ: เราไม่สามารถใช้ฟังก์ชัน stop_motor() ที่นี่ได้ เพราะมันให้เอาต์พุตแบบดิจิทัล ในขณะที่ฟังก์ชันนี้ให้เอาต์พุตแบบอนาล็อกขั้นต่ำเพื่อทำให้ความเร็วของมอเตอร์ DC เป็นศูนย์ เมื่อควบคุมมอเตอร์ DC ด้วยความเร็ว อย่าแค่สั่งหยุดมอเตอร์ แต่ให้ทำให้ความเร็วของมันเป็นศูนย์
ตัวอย่าง:
1) หมุนมอเตอร์ DC หน้า-หลัง แบบเต็มสปีด (ไม่ควบคุมความเร็ว)
/* โปรแกรมนี้จะหมุนมอเตอร์ DC ไปข้างหน้า 5 วินาที แล้วหยุด 2 วินาที จากนั้นหมุนกลับหลัง 5 วินาที หยุดอีก 2 วินาที แล้ววนลูปแบบนี้ไปเรื่อยๆ เขียนโดย A M Bhatt, Gujarat, INDIA เมื่อ 12/10/2016 */
#include<DC_Motor.h>
DC_Motormotor(8, 12);
voidsetup() { }
void loop() { motor.forward(); delay(5000); motor.stop_motor(); delay(2000); motor.reverse(); delay(5000); motor.stop_motor(); delay(2000); }
2) หมุนมอเตอร์ DC หน้า-หลัง ด้วยความเร็วที่ตั้งค่า (ควบคุมความเร็วได้)
/* โปรแกรมนี้จะหมุนมอเตอร์ DC ไปข้างหน้า 5 วินาที ที่ความเร็ว 40% แล้วหยุด 2 วินาที จากนั้นหมุนกลับหลัง 5 วินาทีที่ความเร็ว 80% แล้ววนลูปไปเรื่อยๆ เขียนโดย A M Bhatt, Gujarat, INDIA เมื่อ 12/10/2016 */
#include<DC_Motor.h>
DC_Motor motor2(9, 10, 1);
voidsetup() { }
void loop() { motor2.set_speed(40); motor2.forward_with_set_speed(); delay(5000); motor2.motor_speed_zero(); delay(2000); motor2.set_speed(80); motor2.reverse_with_set_speed(); delay(5000); motor2.motor_speed_zero(); delay(2000); }
3) จ็อกมอเตอร์ทั้งสองทิศทาง แบบควบคุมและไม่ควบคุมความเร็ว
/* โปรแกรมนี้สั่งจ็อกให้มอเตอร์ DC สองตัว * มอเตอร์ตัวแรกจ็อกแบบเต็มสปีดทั้งสองทิศทาง * ส่วนมอเตอร์ตัวที่สองจ็อกแบบตั้งความเร็ว โดยถอยหลังที่ 80% * และเดินหน้าที่ 30% * เขียนโดย Ashutosh M Bhatt, Gujarat (INDIA) * เมื่อ 22/10/2016 */
#include<DC_Motor.h>
DC_Motor motor(8, 12);
DC_Motor motor2(9, 10, 1);
voidsetup() { }
voidloop() { motor.jogg_full_speed(1); motor.jogg_full_speed(0); motor2.jogg_set_speed(0, 80); motor2.jogg_set_speed(1, 30); }
4) สตาร์ทมอเตอร์แบบนิ่มนวล และหยุดแบบลื่นไหล
/* โปรแกรมนี้จะสตาร์ทมอเตอร์แบบนิ่มนวล โดยเพิ่มความเร็ว จาก 0 ไปถึง 90% ใน 10 วินาที ทิศทางเดินหน้า จากนั้นหยุดแบบลื่นไหลจาก 90% ลงมา 0 ใน 5 วินาที แล้วสตาร์ทนิ่มนวลอีกครั้งจาก 0 ไป 50% ใน 6 วินาที ทิศทางถอยหลัง และสุดท้ายหยุดลื่นไหลจาก 50% ลงมา 0 ใน 3 วินาที เขียนโดย A M Bhatt, Gujarat, INDIA เมื่อ 12/10/2016 */
#include<DC_Motor.h>
DC_Motor motor2(9, 10, 1);
voidsetup() { }
voidloop() { motor2.soft_start(1, 90, 10); delay(3000); motor2.smooth_stop(5); motor2.soft_start(0, 50, 6); delay(3000); motor2.smooth_stop(3); }