2 เม.ย. 2020 เวลา 12:57
การควบคุม DC มอเตอร์
บทความนี้จะสอนใช้งาน Arduino ควบคุม DC มอเตอร์หมุนตามเข็มนาฬิกา(CW) และหมุนทวนเข็มนาฬิกา(CCW) โดยใช้ Arduino ควบคู่กับตัวไอซีขับมอเตอร์ L293D
เพื่อให้สามารถควบคุมมอเตอร์ DC ได้อย่างสมบูรณ์เราต้องควบคุมความเร็วและทิศทางการหมุน สามารถทำได้โดยการใช้สองเทคนิคนี้ร่วมกัน
PWM - สำหรับการควบคุมความเร็ว
H-Bridge - สำหรับควบคุมทิศทางการหมุน
PWM - สำหรับการควบคุมความเร็ว
ความเร็วของมอเตอร์กระแสตรงสามารถควบคุมได้โดยการเปลี่ยนแปลงแรงดันไฟฟ้าอินพุต
เทคนิคที่ใช้กันแพร่หลายคือการใช้ PWM (Pulse Width Modulation)
PWM เป็นเทคนิคที่ปรับค่าเฉลี่ยของแรงดันไฟฟ้าอินพุตโดยส่งชุดสัญญาณพัลส์ ON-OFF
แรงดันไฟฟ้าเฉลี่ยนั้นแปรผันตามความกว้างของพัลส์ที่รู้จักในชื่อ Duty Cycle
ยิ่งรอบการทำงานสูงขึ้นเท่าใดแรงดันไฟฟ้าเฉลี่ยที่ถูกนำไปใช้กับมอเตอร์ DC ส่งผลให้มอเตอร์หมุนด้วยความเร็วสูง
และรอบการทำงานที่ต่ำลงก็จะยิ่งใช้แรงดันไฟฟ้าเฉลี่ยกับมอเตอร์กระแสตรงน้อยลง ซึ่งจะส่งผลให้มอเตอร์หมุนด้วยความเร็วต่ำ)
ภาพด้านล่างแสดงให้เห็นถึงเทคนิค PWM พร้อมวัฏจักรหน้าที่และแรงดันไฟฟ้าเฉลี่ย
ควบคุมทิศทางการหมุนด้วย H-Bridge
ทิศทางการหมุนของมอเตอร์ DC สามารถควบคุมได้โดยการเปลี่ยนขั้วของแรงดันไฟฟ้า เทคนิคทั่วไปสำหรับการทำเช่นนี้คือการใช้ H-Bridge
วงจร H-Bridge ประกอบด้วยสวิตช์สี่ตัวพร้อมมอเตอร์ที่กึ่งกลางเพื่อจัดเรียงคล้าย H
การปิดสวิทช์พิเศษสองตัวในเวลาเดียวกันนั้นจะกลับขั้วของแรงดันไฟฟ้าที่ใช้กับมอเตอร์ สิ่งนี้ทำให้เกิดการเปลี่ยนแปลงในทิศทางการหมุนของมอเตอร์
ภาพด้านล่างแสดงวงจร และการทำงานของ H-Bridge
โดยใช้อุปกรณ์สารกึ่งตัวนำเช่น MOSFET
หรือ IGBT หรืออื่นๆ แล้วแต่ความเหมาะสม เช่นขนาดกระแสแรงดันที่ต้องการควบคุม
หากต้องการให้หมุนตามเข็ม (Clockwise :CW) สวิตช์ของวงจร H-Bridge จะเป็นไปตามรูปด้านซ้ายมือ และจะเป็นไปตามรูปขวามือหากต้องการให้หมุนทวนเข็ม (Counter Clockwise :CCW)
ซึ่งหากต้องการให้หมุนตามเข็ม (Clockwise :CW) สวิตช์ของวงจร H-Bridge จะต้องทำงานดังนี้
S1 และ S4 ปิดวงจร
และ S2 และ S3 เปิดวงจร
สามารถดูภาพเคลื่อนไหวแสดงการทำงานของวงจร H-Bridge ได้ที่ลิงค์ด้านล่าง
การทำให้มอเตอร์หมุนซ้ายและหมุนขวากลับทางได้นั้น เราต้องสลับขั้วการจ่ายไฟ โดยใช้ไอซี L293D ควบคุมการจ่ายไฟสลับทางให้กับมอเตอร์
ไอซี L293D (Motor Driver IC)
L293D (Motor Driver IC)
ไอซีคือเป็นอุปกรณ์สารกึ่งตัวนำที่ได้รับความนิยมนำมาใช้ควบคุมมอเตอร์มากที่สุด เนื่องจากมีขนาดเล็ก ง่ายต่อการออกแบบวงจร เพียงเลือกไอซีที่ตรงสเปคที่จะใช้งาน ก็ต่อสายจากวงจรควบคุมเข้ามาที่ไอซีแล้วสั่งให้มอเตอร์หมุนได้เลย (อ่านเพิ่มเติมได้ที่ลิ้งค์ด้านล่าง)
1. L293D
L293D เป็นไดรเวอร์มอเตอร์ H-Bridge แบบดูอัลแชนแนลที่สามารถขับมอเตอร์ DC ได้หนึ่งคู่ หรือสเต็ปมอเตอร์ได้หนึ่งตัว
นั่นหมายความว่าไอซีหนึ่งตัวสามารถขับมอเตอร์ได้สูงสุดสองตัว ทำให้เหมาะสำหรับการสร้างแพลตฟอร์มหุ่นยนต์สองล้อ
Power Supply
IC ขับมอเตอร์ L293D มีอินพุตสองขา ได้แก่ ‘Vcc1’ และ ‘Vcc2’
Vcc1 ใช้สำหรับการขับวงจรลอจิกภายในไอซี ซึ่งค่าแรงดันมาตรฐานควรเป็น 5V
Vcc2 ใช้สำหรับวงจร H-Bridge เพื่อป้อนพลังงานในการขับเคลื่อนมอเตอร์ซึ่งสามารถป้อนค่าแรงดันได้ตั้งแต่ 4.5V ถึง 36V
GND ต่อลง ground เพื่อ sink กระแสไฟ
Output Terminals
ช่อง ouput ของไดรเวอร์มอเตอร์ L293D
สำหรับมอเตอร์ A ถูกนำออกไปที่ขา OUT1, OUT2
และมอเตอร์ B ถูกนำออกไปที่ขา OUT3, OUT4 ตามลำดับ
เราสามารถเชื่อมต่อมอเตอร์ DC สองตัวที่มีแรงดันไฟฟ้าระหว่าง 4.5 ถึง 36V เข้ากับขั้วต่อเหล่านี้
แต่ละช่องสัญญาณบน IC สามารถป้อนกระแสตรงกับสูงสุด 600mA ซึ่งจำนวนกระแสไฟฟ้าที่จ่ายให้กับมอเตอร์ขึ้นอยู่กับแหล่งจ่ายไฟของระบบ
Control Pins
สำหรับแต่ละช่องของ L293D มีขาควบคุมสองประเภทซึ่งช่วยให้เราสามารถควบคุม -ความเร็ว -ทิศทางการหมุนของมอเตอร์กระแสตรงในเวลาเดียวกัน ด้วยขาควบคุมทิศทางและหมุดควบคุมความเร็ว
Direction Control Pins
การใช้ pin ควบคุมทิศทางเราสามารถควบคุมว่ามอเตอร์หมุนไปข้างหน้าหรือข้างหลัง Pin เหล่านี้ควบคุมสวิตช์ของวงจร H-Bridge ภายใน L293D IC ที่ได้กล่าวไว้ข้างต้น
IC มี Pin ควบคุมสองทิศทางสำหรับแต่ละช่อง
Pin IN1, IN2 ควบคุมทิศทางการหมุนของมอเตอร์ A
ในขณะที่ Pin IN3, IN4 ควบคุมมอเตอร์ B
ทิศทางการหมุนของมอเตอร์สามารถควบคุมได้โดยใช้โลจิก HIGH (5 Volts) หรือ โลจิก LOW (Ground) กับPinเหล่านี้
ตารางด้านล่างสรุปการควบคุมมอเตอร์ดังต่อไปนี้
Speed Control Pins
พินควบคุมความเร็ว ได้แก่ ENA และ ENB ใช้สำหรับเปิดปิดและควบคุมความเร็วของมอเตอร์ A และมอเตอร์ B ตามลำดับ
การ Pull-up พินเหล่านี้จะทำให้มอเตอร์หมุนได้ และการ Pull-down จะทำให้หยุด
แต่ด้วยการปรับความกว้างพัลส์ (PWM) เราสามารถควบคุมความเร็วของมอเตอร์ได้
การ Wiring IC ขับมอเตอร์เข้ากับ Arduino UNO
ตอนนี้เรารู้ทุกอย่างเกี่ยวกับ IC แล้วเราสามารถเริ่มเชื่อมต่อกับ Arduino ของเราได้ เริ่มต้นด้วยการเชื่อมต่อแหล่งจ่ายไฟกับมอเตอร์
ในการทดลองของเราเราใช้มอเตอร์ DC Gearbox ซึ่งมักพบในหุ่นยนต์ขับเคลื่อนสองล้อ ขับเคลื่อนด้วยไฟแรงดัน 3 ถึง 9V
ดังนั้นเราจะเชื่อมต่อแหล่งจ่ายไฟ 9V ภายนอกกับขา Vcc2
ขั้นตอนถัดไปเราต้องจัดเตรียมไฟ 5 โวลต์สำหรับวงจรลอจิกของ L293D เชื่อมต่อ Vcc1 pin ไปยังเอาต์พุต 5V บน Arduino
ตรวจสอบให้แน่ใจว่าต่อ Ground ครบทั้งหมดในวงจร
ตอนนี้อินพุตและเปิดใช้งานพิน (ENA, IN1, IN2, IN3, IN4 และ ENB) ของ L293D IC เชื่อมต่อกับ Arduino
ขา Ouput ดิจิตอลหกขา (9, 8, 7, 5, 4 และ 3) ซึ่งขาOutput ของ Arduino ที่ 9 และ 3 สำหรับเปิดใช้งาน PWM
ขั้นตอนสุดท้ายเชื่อมต่อมอเตอร์ตัวแรกกับ OUT1 & OUT2
และเชื่อต่อมอเตอร์อีกอันกับ OUT3 & OUT4 ซึ่งสามารถเปลี่ยนการเชื่อมต่อมอเตอร์ได้โดยอิสระ ไม่มีการต่อที่ตายตัวทางเทคนิค
เมื่อเสร็จแล้ววงจรจะมีลักษณะคล้ายกับภาพประกอบที่แสดงด้านล่าง
ตัวอย่าง Arduino Code – Controlling a DC Motor
ตัวอย่างต่อไปนี้จะช่วยให้คุณเข้าใจอย่างถ่องแท้เกี่ยวกับวิธีควบคุมความเร็วและทิศทางการหมุนของมอเตอร์ DC ด้วย IC ไดรเวอร์มอเตอร์ L293D และสามารถใช้เป็นพื้นฐานสำหรับการทดลองและโครงงานที่เป็นประโยชน์มากขึ้นต่อไป
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
 
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
// This function lets you control spinning direction of motors
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
 
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
 
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
 
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
 
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
 
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
การอธิบายโค้ดเบื้องต้น
Code Arduino นั้นค่อนเข้าใจง่าย ไม่ต้องใช้ไลบรารีใด ๆ เพื่อให้ทำงานได้ เริ่มต้นด้วยการประกาศพินของ Arduino สำหรับควบคุมการเชื่อมต่อ L293D
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
ในส่วนการตั้งค่าพินควบคุมมอเตอร์ทั้งหมด จะถูกประกาศเป็นดิจิตอลเอาท์พุทและให้ค่า LOW เพื่อปิดมอเตอร์
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
 
// Turn off motors - Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
ในส่วน Loop เรียกสองฟังก์ชั่นที่ผู้ใช้กำหนดการหน่วงเวลาไว้
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
ซึ่งสองฟังก์ชั่นนี้ประกอบไปด้วย
directionControl() – ฟังก์ชั่นนี้หมุนมอเตอร์ทั้งสองไปข้างหน้าด้วยความเร็วสูงสุดเป็นเวลาสองวินาที จากนั้นกลับทิศทางการหมุนของมอเตอร์และหมุนเป็นเวลาอีกสองวินาที และสุดท้ายก็ปิดมอเตอร์
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
 
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
 
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
speedControl () - ฟังก์ชั่นนี้จะเร่งความเร็วมอเตอร์จากศูนย์ถึงความเร็วสูงสุดโดยการสร้างสัญญาณ PWM โดยใช้ฟังก์ชั่น analogWrite ()
จากนั้นจะชะลอความเร็วลงเป็นศูนย์ จนกระทั่งมอเตอร์หยุดไปในที่สุด
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
 
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
 
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; --i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
 
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
โฆษณา