โปรเจกต์ วิธีการใช้งาน L298N motor driver module
module นี้ช่วยให้คุณสามารถควบคุม motors สองตัวแยกอิสระได้สูงสุด 2A ในทั้งสองทิศทาง ช่วง Supply อาจอยู่ระหว่าง 5V และ 35V ซึ่งเพียงพอสำหรับ DC motor projects ส่วนใหญ่
module นี้ช่วยให้คุณสามารถควบคุม motors สองตัวแยกอิสระได้สูงสุด 2A ในทั้งสองทิศทาง ช่วง Supply อาจอยู่ระหว่าง 5V และ 35V ซึ่งเพียงพอสำหรับ DC motor projects ส่วนใหญ่
Project Supporter Team
โพสต์โดย
บทความหลัก: How to use the L298N motor driver module
L298N Motor Driver เป็นตัวควบคุมที่ใช้ H-Bridge เพื่อควบคุมทิศทางของ Motor ได้อย่างง่ายดาย และใช้ PWM เพื่อควบคุมความเร็ว โมดูลนี้ช่วยให้คุณสามารถจัดการ Motor สองตัวแยกกันได้สูงสุดตัวละ 2A ในทั้งสองทิศทาง ช่วงของแหล่งจ่ายไฟ (Supply range) อาจอยู่ระหว่าง 5V ถึง 35V ซึ่งเพียงพอสำหรับโปรเจกต์ DC motor ส่วนใหญ่
เราขอแนะนำอย่างยิ่งให้อ่านบทความของเราเกี่ยวกับ PWM: What is PWM and how it works
อันดับแรก มาทำความเข้าใจความหมายของแต่ละ Pin ที่มีอยู่บนบอร์ด L298N กันก่อน


ทิศทางการหมุนของ Motor สามารถควบคุมได้โดยการส่งค่า Logic HIGH หรือ Logic LOW ไปยัง Input IN1/IN2 (Motor A) และ IN3/IN4 (Motor B) ตามที่แสดงในตาราง

Pin ควบคุมความเร็ว ENA และ ENB ใช้สำหรับเปิด/ปิด Motor และควบคุมความเร็วด้วย Pulse Width Modulation (PWM) นั่นหมายความว่า Motor จะหมุนด้วยความเร็วสูงสุดเมื่อเป็น HIGH และหยุดเมื่อเป็น LOW โดยปกติแล้วโมดูลจะมาพร้อมกับ Jumper บน Pin เหล่านี้ซึ่งเชื่อมต่อเข้ากับค่า HIGH โดยตรง หากคุณต้องการควบคุมความเร็วของ Motor ให้ถอด Jumper ออกแล้วเชื่อมต่อ Pin ENA และ/หรือ ENB เข้ากับ PWM มิฉะนั้น Motor จะหมุนที่ความเร็วสูงสุดเสมอ
โมดูลนี้ประกอบด้วย Regulator 5V ที่สามารถเปิด/ปิดการใช้งานได้โดยใช้ Jumper:
โปรดพิจารณาด้วยว่าโมดูล L298N มีแรงดันตกคร่อม (Voltage drop) ประมาณ 2V ดังนั้นหากใช้แหล่งจ่ายไฟ 12V ตัว Motor จะได้รับแรงดันจริงประมาณ 10V ซึ่งหมายความว่าเราจะไม่สามารถทำความเร็วสูงสุดได้
เมื่อมีความเข้าใจอย่างถ่องแท้เกี่ยวกับแต่ละ Pin และการทำงานของโมดูลแล้ว เราสามารถดำเนินการต่อวงจรได้

ENA และ ENB เชื่อมต่อกับ Pin PWM ของ Arduino Nano และ IN1/IN2/IN3/IN4 เชื่อมต่อกับ Pin Digital ทั่วไป เรากำลังใช้แบตเตอรี่ 9V และใส่ Jumper ไว้ ดังนั้นเราจึงสามารถใช้ Pin +5V เพื่อจ่ายไฟให้กับ Arduino ได้ด้วย
Code นี้ค่อนข้างง่ายและไม่จำเป็นต้องใช้ Library ภายนอกในการทำงาน เราได้กำหนด struct (ชื่อว่า motor) ซึ่งจะใช้แทนค่าความเร็วและทิศทางของ Motor แต่ละตัว
มีการเพิ่มข้อความอธิบายบางส่วนเพื่อให้สามารถ Debug กระบวนการใน Serial monitor ได้
// Motor A
#define ENA_PIN 10 //PWM
#define IN1_PIN 9
#define IN2_PIN 8
// Motor B
#define ENB_PIN 3 //PWM
#define IN3_PIN 4
#define IN4_PIN 5
struct motor {
byte speed = 0;
struct {
byte input1 = LOW;
byte input2 = LOW;
} direction;
};
motor motorA, motorB;
void setup()
{
Serial.begin(115200);
// ตั้งค่า Pin PWM และทิศทางให้เป็น Output สำหรับ Motor ทั้งสองตัว
pinMode(ENA_PIN, OUTPUT);
pinMode(IN1_PIN, OUTPUT);
pinMode(IN2_PIN, OUTPUT);
pinMode(ENB_PIN, OUTPUT);
pinMode(IN3_PIN, OUTPUT);
pinMode(IN4_PIN, OUTPUT);
// เริ่มต้นด้วยค่าเริ่มต้น
sendToMotorA();
sendToMotorB();
}
void loop()
{
Serial.println("Motors are stopped now");
Serial.println("Set direction FORWARD");
delay(2000);
setMotorDirectionForward(motorA);
setMotorDirectionForward(motorB);
Serial.println("Gradually increase motors speed to max");
increaseMotorsSpeed();
Serial.println("Motors are on full speed now");
delay(2000);
Serial.println("Gradually decrease motors speed to min");
decreaseMotorsSpeed();
Serial.println("Motors are stopped now");
Serial.println("Set direction BACKWARD");
delay(2000);
setMotorDirectionBackward(motorA);
setMotorDirectionBackward(motorB);
Serial.println("Gradually increase motors speed to max");
increaseMotorsSpeed();
Serial.println("Motors are on full speed now");
delay(2000);
Serial.println("Gradually decrease motors speed to min");
decreaseMotorsSpeed();
}
void sendToMotorA()
{
sendToMotor(motorA, ENA_PIN, IN1_PIN, IN2_PIN);
}
void sendToMotorB()
{
sendToMotor(motorB, ENB_PIN, IN3_PIN, IN4_PIN);
}
void increaseMotorsSpeed()
{
for (int speed = 0; speed <= 255; speed++) {
setMotorSpeed(motorA, speed);
setMotorSpeed(motorB, speed);
sendToMotorA();
sendToMotorB();
delay(20); // เพิ่มการหน่วงเวลาเล็กน้อยระหว่างการเปลี่ยนแปลง
}
}
void decreaseMotorsSpeed()
{
for (int speed = 255; speed >= 0; speed--) {
setMotorSpeed(motorA, speed);
setMotorSpeed(motorB, speed);
sendToMotorA();
sendToMotorB();
delay(20); // เพิ่มการหน่วงเวลาเล็กน้อยระหว่างการเปลี่ยนแปลง
}
}
หมายเหตุ: Snippet นี้เป็นส่วนหนึ่งของโปรเจกต์ Arduino ที่อยู่ใน GitHub repository ของเรา โดยมีการแยก Code ออกเป็นไฟล์ต่างๆ ตามความเหมาะสม
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้