กลับไปหน้ารวมไฟล์
dc-motor-controlling-library-c784c8.md

จัดไปวัยรุ่น! นี่คือไลบรารี 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); เท่านั้น

  1. ไฟล์เฮดเดอร์ DCMotor.h: น้องสร้างไฟล์ใหม่เพื่อกำหนด "คลาส" ขึ้นมา มันจะเก็บตัวแปรต่างๆ เช่น PinFwd, PinBwd, และ PWM_Pin
  2. ไฟล์อิมพลีเมนต์ DCMotor.cpp: น้องเขียนฟังก์ชันหลักๆ ที่ทำงานหนักๆ ไว้ในนี้
void DCMotor::setSpeed(int speed) {
  if (speed > 0) {
    digitalWrite(PinFwd, HIGH); // เดินหน้า
    analogWrite(PWM_Pin, speed);
  }
}
  1. 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); }

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "ambhatt"
category: "Motors & Robotics"
components:
  - "1x Arduino UNO"
  - "4x 1N4007 – High Voltage, High Current Rated Diode"
  - "2x Resistor 1k ohm"
  - "2x General Purpose Transistor PNP"
  - "2x General Purpose Transistor NPN"
description: "Streamline your kinematics! Instead of dealing with messy analogWrite commands spread across your code, build or install a custom C++ library to handle complex motor maneuvers perfectly."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/512c6b59-2538-4bbe-a9bf-77da6e8071c9.zip"
  - "https://projects.arduinocontent.cc/512c6b59-2538-4bbe-a9bf-77da6e8071c9.zip"
encryptedPayload: "U2FsdGVkX1+O+w7B+aHAjrmafyYkkIkV9MNbAGJIpfp58dhIZ4cisMEtUP285lRcPCdmY9+tKq7+uD/cla529sXB/t+f3uMkr1rOeraQGu8="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/dc-motor-controlling-library-c784c8_cover.jpg"
lang: "en"
likes: 55
passwordHash: "f7a7ced4df7b395c40ec43600c64ad9e03d8ccadd42bd6c9f5317dd7e343505b"
price: 1
seoDescription: "Efficient DC motor controlling library for all DC motor types, specifically designed for industrial motion control applications."
tags:
  - "dc motor"
  - "dc motor driver"
  - "h-bridge circuit"
title: "ไลบรารีควบคุมมอเตอร์ DC งานง่ายแต่หล่อ เอาไปใช้ได้ทุกแบบ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/kQR_PKKye54"
  - "https://www.youtube.com/embed/p6jDclkEJC4"
views: 99360