ควบคุมมอเตอร์ DC ให้หมุนซ้าย–ขวา (Forward–Reverse)
โดยใช้โมดูล L298N ร่วมกับ Arduino จะใช้หลักการดังนี้ การใช้ Arduino ในการควบคุมมอเตอร์ ไม่สามารถต่อกับขา Arduino แล้วสั่งงานโดยตรงได้
เพราะขาของ Arduino Uno หรือไมโครคอนโทรเลอร์ทั่ว ๆ ไปจ่ายกระแสได้เพียงเล็กน้อย เช่นประมาณ 50mA เท่านั้น ส่วนมอเตอร์ตัวใหญ่ ๆ
ต้องการกระแสจ่ายให้ทำงานมากกว่าที่ Arduino จ่ายไฟให้ได้หลายเท่า
ดังนั้นจึงต้องมีวงจรขับมอเตอร์ โดยใช้ Arduino เป็นตัวสั่งงาน และให้บอร์ดขับเป็นตัวขับมอเตอร์ ในตัวอย่างนี้จะใช้บอร์ดขับมอเตอร์รุ่น L298N
ซึ่งสามารถสั่งให้มอเตอร์หมุนซ้าย หมุนขวา ปรับความเร็วมอเตอร์ได้
หลักการทำงานของโมดูล L298N คือ การใช้ วงจร H-Bridge เพื่อควบคุมทิศทางและความเร็วของมอเตอร์ DC โดยอิสระ 2 ตัว. L298N
ใช้พินอินพุตเพื่อสลับทรานซิสเตอร์ภายในวงจร ทำให้เกิดการกลับขั้วกระแสไฟฟ้าที่มอเตอร์ ทำให้มอเตอร์หมุนซ้ายหรือขวาได้. นอกจากนี้
ยังใช้เทคนิค PWM (Pulse Width Modulation) ผ่านพิน Enable เพื่อควบคุมความเร็วของมอเตอร์ โดยยิ่งพัลส์มีความกว้างมาก มอเตอร์ก็จะหมุนเร็วขึ้น
การควบคุมทิศทางวงจร H-Bridge
โมดูลนี้มีวงจร H-Bridge แบบดับเบิ้ลอยู่ภายใน ซึ่งประกอบด้วยสวิตช์ 4 ตัว (ทรานซิสเตอร์) จัดเรียงคล้ายตัว H โดยมอเตอร์อยู่ตรงกลาง
การสลับพินอินพุต
พินอินพุต (เช่น IN1, IN2 สำหรับมอเตอร์ A และ IN3, IN4 สำหรับมอเตอร์ B) จะสั่งเปิด-ปิดสวิตช์ใน H-Bridge. การกลับขั้ว
การตั้งค่าพินอินพุตให้มีค่าตรรกะต่างกัน (เช่น IN1 เป็น HIGH, IN2 เป็น LOW) จะทำให้กระแสไฟฟ้าไหลผ่านมอเตอร์ในทิศทางหนึ่ง ทำให้หมุนไปข้างหน้า. การตั้งค่ากลับกันจะทำให้มอเตอร์หมุนถอยหลัง
การควบคุมความเร็ว
พิน Enable (ENA, ENB)
พินเหล่านี้จะใช้สำหรับควบคุมความเร็วของมอเตอร์
สัญญาณ PWM
หากถอดจัมเปอร์ที่พิน Enable ออก (ซึ่งปกติจะต่อกับไฟ 5V ทำให้มอเตอร์หมุนเต็มความเร็ว) และต่อเข้ากับพิน PWM ของไมโครคอนโทรลเลอร์ (เช่น Arduino) จะสามารถควบคุมความเร็วได้.
การทำงานของ PWM
สัญญาณ PWM จะเป็นการเปิด-ปิดมอเตอร์อย่างรวดเร็ว (หลายครั้งต่อวินาที) ความเร็วของมอเตอร์จะขึ้นอยู่กับ รอบการทำงาน (Duty Cycle)
ของสัญญาณ PWM นั้น. พัลส์ที่กว้าง (ทำงานนานกว่า) จะทำให้มอเตอร์หมุนเร็วขึ้น.
คุณสมบัติเพิ่มเติม
ขับมอเตอร์ได้ 2 ตัว
L298N สามารถควบคุมมอเตอร์ DC 2 ตัวได้อย่างอิสระ
แหล่งจ่ายไฟ
รับแรงดันไฟได้ตั้งแต่ 7V ถึง 35V สำหรับมอเตอร์ และมีวงจรเรกูเลต 5V ในตัว
การป้องกัน
โมดูลมีไดโอดแบบฟรีวีลลิ่ง (Free-wheeling diodes) เพื่อปกป้องวงจรจากกระแสย้อนกลับของโหลดเหนี่ยวนำ
ควบคุมมอเตอร์ได้ถึง 2 ตัวพร้อมกัน
โมดูลไดรเวอร์มอเตอร์ DC L298N อินเทอร์เฟซพร้อม Arduino
ทำความเข้าใจพื้นฐานการควบคุมมอเตอร์
ก่อนที่จะเรียนรู้เกี่ยวกับไดรเวอร์มอเตอร์ L298N สิ่งสำคัญคือต้องเข้าใจแนวคิดหลักสองประการ
วงจร H-Bridge – ช่วยให้เราควบคุมทิศทางการหมุนของมอเตอร์ได้
PWM (Pulse Width Modulation) – ช่วยควบคุมความเร็วของมอเตอร์ DC
การควบคุมทิศทางด้วย H-Bridge
มอเตอร์ DC เป็นมอเตอร์ที่ใช้งานง่ายที่สุด! หากคุณต่อแบตเตอรี่เข้ากับมอเตอร์ DC มอเตอร์จะหมุนไปในทิศทางหนึ่ง
หากสลับสายไฟ มอเตอร์จะหมุนไปอีกทิศทางหนึ่ง แต่คุณไม่สามารถสลับสายไฟได้ทุกครั้งที่ต้องการเปลี่ยนทิศทาง H-bridge จึงมีประโยชน์
H-bridge คือวงจรพิเศษที่มีสวิตช์อิเล็กทรอนิกส์ 4 ตัวจัดเรียงเป็นรูปตัว "H" โดยมีมอเตอร์อยู่ตรงกลาง
การเปิดและปิดสวิตช์เหล่านี้ตามลำดับที่กำหนด จะทำให้กระแสไฟฟ้าไหลผ่านมอเตอร์ได้ทั้งทิศทางเดียวและทิศทางตรงกัน
การควบคุมความเร็วด้วย PWM (Pulse Width Modulation)
เมื่อจ่ายแรงดันไฟฟ้าคงที่ให้กับมอเตอร์กระแสตรง มอเตอร์จะหมุนด้วยความเร็วคงที่ หากต้องการเปลี่ยนความเร็ว จำเป็นต้องปรับแรงดันไฟฟ้า
แรงดันไฟฟ้าที่สูงขึ้นจะทำให้มอเตอร์หมุนเร็วขึ้น ในขณะที่แรงดันไฟฟ้าที่ต่ำกว่าจะทำให้มอเตอร์หมุนช้าลง
อย่างไรก็ตาม การเปลี่ยนแปลงแรงดันไฟฟ้าอยู่ตลอดเวลานั้นไม่สามารถทำได้จริง
ดังนั้นจึงมีการนำ PWM หรือ Pulse Width Modulation เข้ามาช่วย
PWM เป็นวิธีอัจฉริยะในการควบคุมปริมาณพลังงานเฉลี่ยที่ส่งไปยังมอเตอร์
แทนที่จะส่งแรงดันไฟฟ้าคงที่ PWM จะเปิดและปิดแรงดันไฟฟ้าอย่างรวดเร็วเป็นพัลส์ที่รวดเร็วมาก
“ ความกว้าง ” ของพัลส์เปิดแต่ละพัลส์ ซึ่งเรียกอีกอย่างว่ารอบหน้าที่ กำหนดว่าแรงดันไฟฟ้าจะ “ เปิด ” นานเท่าใดในแต่ละรอบ
หากแรงดันไฟฟ้าอยู่ที่ตำแหน่งเปิดเป็นส่วนใหญ่ (พัลส์ที่กว้างขึ้น) มอเตอร์จะได้รับแรงดันไฟฟ้าเฉลี่ยที่สูงขึ้นและหมุนเร็วขึ้น
หากแรงดันไฟฟ้าปิดอยู่เป็นส่วนใหญ่ (พัลส์แคบลง) มอเตอร์จะได้รับแรงดันไฟฟ้าเฉลี่ยที่ต่ำกว่าและหมุนช้าลง
ชิปไดรเวอร์มอเตอร์ L298N
ตรงกลางของโมดูลคือชิปสีดำขนาดใหญ่พร้อมแผงระบายความร้อนขนาดใหญ่ – L298N
เป็นไดรเวอร์ฟูลบริดจ์คู่แรงดันสูงและกระแสสูง ออกแบบมาเพื่อขับโหลดเหนี่ยวนำ
เช่น มอเตอร์กระแสตรง มอเตอร์สเต็ปเปอร์ รีเลย์ และโซลินอยด์เป็นหลัก ทำหน้าที่เป็นตัวขยายสัญญาณกระแส
หมายความว่ามันรับสัญญาณควบคุมกระแสต่ำจาก Arduino แล้วเพิ่มระดับกระแสและแรงดันไฟฟ้าให้สูงขึ้นตามระดับที่มอเตอร์ต้องการ
โดยพื้นฐานแล้ว L298N มีวงจร H-bridge แยกกันสองวงจร จำได้ไหมว่า H-bridge ช่วยควบคุมทิศทางของมอเตอร์ DCได้อย่างไร? เนื่องจาก L298N มีวงจร H-bridge สองวงจร จึงสามารถควบคุมมอเตอร์ DC
สองตัวพร้อมกันได้ คุณยังสามารถรวม H-bridge สองตัวนี้เข้าด้วยกันเพื่อควบคุมมอเตอร์สเต็ปเปอร์แบบไบโพลาร์ได้อีกด้วยพลัง
L298N มีความยืดหยุ่นค่อนข้างมากในด้านพลังงาน สามารถทำงานได้กับแรงดันไฟฟ้าที่หลากหลาย ตั้งแต่ 5V ถึง 46V และสามารถจ่ายกระแสไฟฟ้าต่อเนื่องได้สูงสุด 2A ต่อช่องสัญญาณ ซึ่งหมายความว่าสามารถรองรับมอเตอร์ได้หลากหลายตั้งแต่มอเตอร์งานอดิเรกขนาดเล็กไปจนถึงมอเตอร์ขนาดใหญ่ที่มีกำลังแรงกว่า
ตัวควบคุมไฟ 5V และจัมเปอร์บนบอร์ด
โมดูลไดรเวอร์มอเตอร์ L298N มาพร้อมกับตัวควบคุมแรงดันไฟฟ้า 78M05
ในตัว ตัวควบคุมแรงดันไฟฟ้านี้มีหน้าที่รับพลังงานจากแหล่งจ่ายไฟมอเตอร์ (ที่เชื่อมต่อกับพิน VS)
และแปลงเป็นแรงดันไฟฟ้าคงที่ 5V จากนั้นแรงดันไฟฟ้า 5V นี้จะจ่ายไฟให้กับวงจรตรรกะภายในของชิป L298N
ซึ่งหมายความว่าคุณไม่จำเป็นต้องต่อแหล่งจ่ายไฟ 5V แยกต่างหากเข้ากับพิน VSSจะกลายเป็นเอาต์พุต 5V เอาต์พุตนี้สามารถจ่ายกระแสได้สูงสุด 0.5 แอมป์ ซึ่งมักจะเพียงพอสำหรับการจ่ายไฟให้กับ
Arduino หรืออุปกรณ์อิเล็กทรอนิกส์ขนาดเล็กอื่นๆ
อย่างไรก็ตาม สิ่งสำคัญที่ต้องทราบคือตัวควบคุมแรงดันไฟฟ้าแบบออนบอร์ด 5V ไม่ได้ออกแบบมาเพื่อรองรับแรงดันไฟฟ้าขาเข้าที่สูงกว่า 12V ดังนั้น
คุณควรใช้คุณสมบัตินี้เฉพาะเมื่อแหล่งจ่ายไฟของมอเตอร์ของคุณต่ำกว่า 12V เท่านั้น หากแหล่งจ่ายไฟของมอเตอร์ของคุณสูงกว่า 12V
คุณต้องถอดจัมเปอร์ออกเพื่อป้องกันไม่ให้ตัวควบคุมแรงดันไฟฟ้าแบบออนบอร์ด 5V เสียหาย
การเดินสายโมดูลไดรเวอร์มอเตอร์ L298N เข้ากับ Arduino
🔹 การต่อวงจร (L298N + Arduino + มอเตอร์ DC)
🔹 หลักการทำงาน
🔹 เวอร์ชันที่ 1 : กดปุ่มควบคุมซ้าย–ขวา
การต่อปุ่มกด
โค้ด
🔹 เวอร์ชันที่ 2 : หมุนอัตโนมัติ ซ้าย–ขวา
ฟังก์ชัน นี้directionControl()สาธิตวิธีการควบคุมทิศทางของมอเตอร์ทั้งสองตัว
ขั้นแรก เราตั้งค่ามอเตอร์ทั้งสองตัวให้มีความเร็วสูงสุดที่เป็นไปได้โดยการตั้งค่าพินเปิดใช้งานทั้งสองตัวเป็น HIGH จากนั้น
เราส่งสัญญาณที่จำเป็นไปยังพินควบคุมทิศทางเพื่อให้มอเตอร์ A และมอเตอร์ B หมุนไปข้างหน้า
หลังจากมอเตอร์ทั้งสองตัวหมุนไปในทิศทางนั้นเป็นเวลาสองวินาที เราจะเปลี่ยนสัญญาณไปยังพินควบคุมทิศทาง
ซึ่งจะทำให้มอเตอร์ทั้งสองตัวกลับทิศทางการหมุนเป็นเวลาอีกสองวินาที สุดท้าย เราจะหยุดมอเตอร์โดยการตั้งค่าพินควบคุมทิศทางทั้งหมดเป็น LOW
การเดินสายโมดูลไดรเวอร์มอเตอร์ L298N เข้ากับ Arduino
int MotorL = 2; // กำหนดขา ที่ต่อกับขั้วมอเตอร์
int MotorR = 3;
void setup() {
pinMode(MotorL, OUTPUT);
pinMode(MotorR, OUTPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(MotorR, 1);
digitalWrite(MotorL, 0);
Serial.println("Motor Right"); // หมุนซ้ายคือ มอเตอร์ขั้ว R มีไฟ ขั้ว L ไม่มีไฟ
delay(3000);
digitalWrite(MotorR, 0);
digitalWrite(MotorL, 0);
Serial.println("Motor STOP"); // หยุด คือ ไม่จ่ายไฟให้มอเตอร์
delay(2000);
digitalWrite(MotorR, 0);
digitalWrite(MotorL, 1);
Serial.println("Motor Left"); // หมุนขวาคือ มอเตอร์ขั้ว R ไม่มีไฟ ขั้ว L มีไฟ
delay(3000);
}
Arduino uno r3 -> โมดูลขับมอเตอร์ L298N
5V -> 5V
GND -> GND
ขา2 -> In3
ขา3 -> In4
โมดูลขับมอเตอร์ L298N -> Motor
OUT3 -> ขาสีแดง
OUT4 -> ขาสีดำ
L298N Pin → Arduino Pin
IN1 → D8
IN2 → D9
ENA → D10 (ใช้ PWM ควบคุมความเร็ว)
Output L298N → มอเตอร์ DC
OUT1, OUT2 → มอเตอร์ DC
Power
12V → Power L298N (สำหรับมอเตอร์)
5V (จาก L298N) → Arduino 5V (หากจ่ายไฟให้ Arduino ได้)
GND → GND ร่วมกัน
IN1 = HIGH, IN2 = LOW → มอเตอร์หมุน ไปข้างหน้า (ซ้าย–ขวา แล้วแต่การต่อสาย)
IN1 = LOW, IN2 = HIGH → มอเตอร์หมุน ถอยหลัง
IN1 = LOW, IN2 = LOW → มอเตอร์หยุด
analogWrite (ENA, ค่า 0–255) → ควบคุม ความเร็วรอบ
ปุ่มกด ซ้าย → Arduino D2
ปุ่มกด ขวา → Arduino D3
ต่อปุ่มแบบ Pull-down (ใช้ R 10kΩ ต่อระหว่างขา IN → GND) หรือใช้ pinMode(INPUT_PULLUP) ก็ได้
// L298N
int ENA = 10;
int IN1 = 8;
int IN2 = 9;
// ปุ่มกด
int buttonLeft = 2;
int buttonRight = 3;
void setup() {
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(buttonLeft, INPUT_PULLUP); // ใช้ PULLUP
pinMode(buttonRight, INPUT_PULLUP);
}
void loop() {
bool leftPressed = digitalRead(buttonLeft) == LOW; // ปุ่มกด = LOW
bool rightPressed = digitalRead(buttonRight) == LOW;
if (leftPressed) {
// หมุนไปทางซ้าย
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 200);
}
else if (rightPressed) {
// หมุนไปทางขวา
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 200);
}
else {
// หยุด
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
}
(หมุน 2 วินาที → หยุด 1 วินาที → หมุนกลับอีกทาง)
int ENA = 10;
int IN1 = 8;
int IN2 = 9;
void setup() {
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
}
void loop() {
// หมุนซ้าย
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, 200);
delay(2000);
// หยุด
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
delay(1000);
// หมุนขวา
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, 200);
delay(2000);
// หยุด
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
delay(1000);
}

