ชุดขับมอเตอร์ L298N Dual H-Bridge Motor Controller
สำหรับ หุ่นยนต์ (Robot) แล้ว สิ่งที่เป็นพลังขับเคลื่อนหลักให้กับหุ่นยนต์นั้น
ก็คงจะไม่พ้น มอเตอร์ ซึ่งต้องการการควบคุม จาก ชุดไดรว์มอเตอร์ (Motor Driver)
ที่จะมาควบคุม ทั้ง ทิศทาง และ ความเร็ว ของมอเตอร์ของเรา ซึ่งในวันนี้ จะมาพูดถึง
"L298N Dual H-Bridge Motor Controller"
การใช้งาน :
L298N เป็นชุดขับมอเตอร์ชนิด H-Bridge ซึ่งส่วนใหญ่จะถูกนำไปใช้ในการควบคุมทิศทาง
และความเร็วของมอเตอร์ ซึ่งสามารถควบคุมมอเตอร์ได้ทั้งหมด 2 Channel
หลักการทำงาน:
วงจร H-Bridge ของ L298N จะขับกระแสเข้ามอเตอร์ ตามขั้วที่กำหนดด้วยลอจิคเพื่อควบคุมทิศทาง
ส่วนความเร็วของมอเตอร์นั้นจะถูกควบคุมด้วย สัญญาณ (PWM Pulse Width Modulation)
ซึ่งต้องมีการปรับความถี่ให้เหมาะสมกับมอเตอร์ที่จะใช้ด้วยนะครับ
ขาต่างๆ:
Out 1: ช่องต่อขั้วไฟของมอเตอร์ A
Out 2: ช่องต่อขั้วไฟของมอเตอร์ A
Out 3: ช่องต่อขั้วไฟของมอเตอร์ B
Out 4: ช่องต่อขั้วไฟของมอเตอร์ B
12V: ช่องจ่ายไฟเลี้ยงมอเตอร์ 12V (ต่อได้ตั้งแต่ 5V ถึง 35V)
GND: ช่องต่อไฟลบ (Ground)
5V: ช่องจ่ายไฟเลี้ยงมอเตอร์ 5V (หากมีการต่อไฟเลี้ยงที่ช่อง 12V แล้ว
ช่องนี้จะทำหน้าที่จ่ายไฟออก เป็น 5V Output
สามารถต่อไฟจากช่องนี้ไปเลี้ยงบอร์ด Arduino ได้
ENA: ช่องต่อสัญญาณ PWM สำหรับมอเตอร์ A
IN1: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ A
IN2: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ A
IN3: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ B
IN4: ช่องต่อสัญญาณลอจิคเพื่อควบคุมทิศทางของมอเตอร์ B
ENB: ช่องต่อสัญญาณ PWM สำหรับมอเตอร์ B
สเปกทางเทคนิค:
Dual H bridge Drive Chip : L298N
แรงดันสัญญาณลอจิค : 5V Drive voltage: 5V-35V
กระแสของสัญญาณลอจิค : 0-36mA
กระแสขับมอเตอร์ : สูงสุดที่ 2A (เมื่อใช้มอเตอร์เดียว)
กำลังไฟฟ้าสูงสุด : 25W
ขนาด : 43 x 43 x 26 มิลลิเมตร
น้ำหนัก : 26 กรัม
*มี Power Supply 5V ในตัว สามารถจ่ายไฟออกจากช่อง 5V (เพื่อจ่ายให้บอร์ด Arduino) ได้
เมื่อต่อไฟเลี้ยงเข้าที่ช่อง 12V
// สัญญาณ PWM ของขา 9,10 ที่ 30.64 Hz
delay(3000); //รอเวลา 3 วินาที
digitalWrite(9,LOW); //ตามตารางข้างบน ต้องกำหนด IN1 = LOW
delay(3000); //รอเวลา 3 วินาที
digitalWrite(9,HIGH); //ตามตารางข้างบน ต้องกำหนด IN1 = HIGH
delay(3000); //รอเวลา 3 วินาที จบตรงนี้แล้วโค้ดจะเริ่มใหม่ วนไปเรื่อยๆ
เมื่อต่อไฟเลี้ยงเข้าที่ช่อง 12V
การต่อเข้าใช้งานกับ Arduino:
ในการต่อกับ Arduino นั้น ขา IN1,IN2,IN3 และ IN4 นั้น สามารถต่อกับพอร์ต Digital ใดๆก็ได้
เนื่องจาก 4 ขานี้ จะใช้ในการควบคุมสัญญาณลอจิคบอกทิศทางให้กับมอเตอร์ ส่วน ENA และ ENB นั้น
จำเป็นที่จะต้องต่อกับพอร์ต Digital ที่รองรับ PWM เนื่องจากจะต้องใช้สัญญาณ PWM ในการควบคุมความเร็วของมอเตอร์
เนื่องจาก 4 ขานี้ จะใช้ในการควบคุมสัญญาณลอจิคบอกทิศทางให้กับมอเตอร์ ส่วน ENA และ ENB นั้น
จำเป็นที่จะต้องต่อกับพอร์ต Digital ที่รองรับ PWM เนื่องจากจะต้องใช้สัญญาณ PWM ในการควบคุมความเร็วของมอเตอร์
การสั่งงานมอเตอร์เบื้องต้น:
ในการสั่งงาน L298N ให้ควบคุมมอเตอร์นั้น มีหลักการพื้นฐานง่ายๆ ดังนี้
ผมจะแบ่งขาออกเป็น 2 กลุ่ม ดังนี้
ENA IN1 IN2 และ IN3 IN4 ENB
ENA ใช้สำหรับควบคุมความเร็วมอเตอร์ A
ใช้คำสั่ง analogWrite( พอร์ตที่ต่อขา ENA , ความเร็วมอเตอร์ 0-255 );
IN1,IN2 ใช้ควบคุมทิศทางของมอเตอร์ A
ใช้คำสั่ง digitalWrite( พอร์ตที่ต่อขา IN1, IN2 , สถานะ HIGH , LOW );
ENB ใช้สำหรับควบคุมความเร็วมอเตอร์ B
ใช้คำสั่ง analogWrite( พอร์ตที่ต่อขา ENB , ความเร็วมอเตอร์ 0-255 );
IN3,IN4 ใช้ควบคุมทิศทางของมอเตอร์ B
ใช้คำสั่ง digitalWrite( พอร์ตที่ต่อขา IN3, IN4 , สถานะ HIGH , LOW );
การใช้ค่าในการควบคุมมอเตอร์ต่างๆ จะเป็นไปตามตารางด้านล่างนี้นะครับ
ENA | IN1 | IN2 | คำอธิบาย |
---|---|---|---|
0 | N/A | N/A | มอเตอร์ A ไม่ทำงาน |
0 | LOW | LOW | มอเตอร์ A หยุดการทำงานแบบหมุนอิสระ (แบบไม่เบรค) |
0-255 | LOW | HIGH | มอเตอร์ A ทำงานและหมุนกลับหลังด้วยความเร็วที่ ENA |
0-255 | HIGH | LOW | มอเตอร์ A ทำงานและหมุนเดินหน้าด้วยความเร็วที่ ENA |
0 | HIGH | HIGH | มอเตอร์ A หยุดการทำงานแบบทันที (แบบเบรค) |
ENA | IN1 | IN2 | คำอธิบาย |
---|---|---|---|
0 | N/A | N/A | มอเตอร์ B ไม่ทำงาน |
0 | LOW | LOW | มอเตอร์ B หยุดการทำงานแบบหมุนอิสระ (แบบไม่เบรค) |
0-255 | LOW | HIGH | มอเตอร์ B ทำงานและหมุนกลับหลังด้วยความเร็วที่ ENB |
0-255 | HIGH | LOW | มอเตอร์ B ทำงานและหมุนเดินหน้าด้วยความเร็วที่ ENB |
0 | HIGH | HIGH | มอเตอร์ B หยุดการทำงานแบบทันที (แบบเบรค) |
ตัวอย่างเช่นมอเตอร์ A (เป็นมอเตอร์แบบในรูปข้างบน)
ผมต่อขาต่างๆ กับ Arduino UNO ไว้ดังนี้
ผมต่อขาต่างๆ กับ Arduino UNO ไว้ดังนี้
ENA = ขา 10 (ขานี้รองรับ PWM)
IN1 = ขา 9
IN2 = ขา 8
ผมจะสั่งให้ มอเตอร์ A หมุนเดินหน้า ด้วยความเร็วสูงสุด (255) เป็นเวลา 3 วินาที
แล้วหยุดทันที (เบรค) เป็นเวลา 3 วิ แล้วเริ่มหมุนถอยหลังด้วยความเร็วสูงสุด (255)
เป็นเวลาอีก 3 วินาที แล้วเบรคอีก 3 วินาที จากนั้นก็วนคำสั่งนี้ไปเรื่อยๆ
ผมจะใช้คำสั่งดังต่อไปนี้...
แล้วหยุดทันที (เบรค) เป็นเวลา 3 วิ แล้วเริ่มหมุนถอยหลังด้วยความเร็วสูงสุด (255)
เป็นเวลาอีก 3 วินาที แล้วเบรคอีก 3 วินาที จากนั้นก็วนคำสั่งนี้ไปเรื่อยๆ
ผมจะใช้คำสั่งดังต่อไปนี้...
void setup()
{
//TCCR1B = TCCR1B & B11111000 | B00000101; // ปรับ timer 1 divisor เพื่อให้ได้ค่าความถี่ // สัญญาณ PWM ของขา 9,10 ที่ 30.64 Hz
pinMode(10,OUTPUT); //กำหนด ขา 10 (ต่ออยู่กับ ENA ให้เป็นแบบ OUTPUT)
pinMode(9,OUTPUT); //กำหนด ขา 9 (ต่ออยู่กับ IN1 ให้เป็นแบบ OUTPUT)
pinMode(8,OUTPUT); //กำหนด ขา 8 (ต่ออยู่กับ IN2 ให้เป็นแบบ OUTPUT)
}
void loop()
{
digitalWrite(9,HIGH); //ตามตารางข้างบน ต้องกำหนด IN1 = HIGH
digitalWrite(8,LOW); //และ IN2 = LOW มอเตอร์ A จึงจะทำงานหมุนไปด้านหน้า
analogWrite(10,255); //และสั่งหมุนที่ความเร็วสูงสุด 255 ผ่านทาง ENA (ขา 10) ที่เป็น PWM
delay(3000); //รอเวลา 3 วินาที
digitalWrite(9,HIGH); //ตามตารางข้างบน ต้องกำหนด IN1 = HIGH
digitalWrite(8,HIGH); //และ IN2 = HIGH มอเตอร์ A จึงจะหยุดการทำงานทันที (เบรค)
analogWrite(10,0); //และสั่งความเร็วมอเตอร์ให้เป็น 0 ผ่านทาง ENA (ขา 10) ที่เป็น PWM
delay(3000); //รอเวลา 3 วินาที
digitalWrite(9,LOW); //ตามตารางข้างบน ต้องกำหนด IN1 = LOW
digitalWrite(8,HIGH); //และ IN2 = HIGH มอเตอร์ A จึงจะทำงานหมุนถอยหลัง
analogWrite(10,255); //และสั่งหมุนที่ความเร็วสูงสุด 255 ผ่านทาง ENA (ขา 10) ที่เป็น PWM
delay(3000); //รอเวลา 3 วินาที
digitalWrite(9,HIGH); //ตามตารางข้างบน ต้องกำหนด IN1 = HIGH
digitalWrite(8,HIGH); //และ IN2 = HIGH มอเตอร์ A จึงจะหยุดการทำงานทันที (เบรค)
analogWrite(10,0); //และสั่งความเร็วมอเตอร์ให้เป็น 0 ผ่านทาง ENA (ขา 10) ที่เป็น PWM
delay(3000); //รอเวลา 3 วินาที จบตรงนี้แล้วโค้ดจะเริ่มใหม่ วนไปเรื่อยๆ
}
Library สำหรับ L298N:
จากเนื้อหาทั้งหมดข้างต้น จะสังเกตเห็นได้ว่าการใช้งานนั้นอาจจะซับซ้อนเล็กน้อย
พร้อมทั้งในการสั่งมอเตอร์แต่ละครั้งจะใช้คำสั่งมาก ได้เขียนเยอะ ผมเซเรฟ จึงได้พัฒนาไลบรารี่ขึ้นมา
เพื่อให้สามารถควบคุม L298N นี้ได้ง่ายๆ โดยใช้คำสั่งพื้นๆ โดยลักษณะการใช้งานจะมีดังนี้
1.ทำการ include library ของ L298N ด้วยคำสั่ง
#include
2. ทำการตั้งค่าการต่อพอร์ตต่างๆ โดยใช้คำสั่ง
L298( ขา ENA , ขา IN1 , ขา IN2 , ขา IN3 , ขา IN4 , ขา ENB);
เช่นที่ Arduino UNO ผมต่อ
ENA ขา 10 IN1 ขา 9 IN2 ขา 8 IN3 ขา 7 IN4 ขา 6 ENB ที่ขา 5
จะใช้คำสั่ง...
L298(10,9,8,7,6,5);
เพื่อตั้งค่าเริ่มต้นให้กับไลบรารี่ L298
3.คำสั่งต่างๆในการใช้งานมีดังนี้
fd( ความเร็ว 0-100 );
สั่งมอเตอร์ทั้งหมดให้หมุนเดินหน้า ด้วยความเร็วที่กำหนด (0-100%)
bk( ความเร็ว 0-100 );
สั่งมอเตอร์ทั้งหมดให้หมุนถอยหลัง ด้วยความเร็วที่กำหนด (0-100%)
tl( ความเร็ว 0-100 );
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ B หมุนตามความเร็วที่กำหนด (0-100%)
ส่วนมอเตอร์ A จะหยุดหมุน หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวซ้ายแบบกว้างขึ้นนั่นเอง
tr( ความเร็ว 0-100 );
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ A หมุนตามความเร็วที่กำหนด (0-100%)
ส่วนมอเตอร์ B จะหยุดหมุน หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวขวาแบบกว้างขึ้นนั่นเอง
sl( ความเร็ว 0-100 );
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ A หมุนถอยหลัง ส่วนมอเตอร์ B หมุนเดินหน้า
ตามความเร็วที่กำหนด (0-100%) หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวซ้ายแบบแคบ (หมุนรอบตัวเอง) ขึ้นนั่นเอง
sr( ความเร็ว 0-100 );
คำสั่งนี้ใช้ในการเลี้ยวของหุ่นยนต์ โดยจะสั่งให้มอเตอร์ B หมุนถอยหลัง ส่วนมอเตอร์ A หมุนเดินหน้า
ตามความเร็วที่กำหนด (0-100%) หากติดตั้งมอเตอร์ A ไว้ที่ล้อข้างซ้าย และ B ไว้ที่ล้อข้างขวา
การใช้คำสั่งนี้ จะส่งผลให้หุ่นยนต์เกิดการเลี้ยวขวาแบบแคบ (หมุนรอบตัวเอง) ขึ้นนั่นเอง
fd2( ความเร็วมอเตอร์ A , ความเร็วมอเตอร์ B );
สั่งมอเตอร์ A และ B ให้หมุนแยกความเร็วกัน โดยสามารถสั่งติดลบ (เพื่อให้หมุนถอยหลัง) ได้
โดยสั่งได้ตั้งแต่ -100 จนถึง 100 เช่น fd2(50,-50); จะทำงานคล้าย sr(50);
ao();
เป็นคำสั่งที่ใช้หยุดการหมุนของมอเตอร์ทั้งหมด
ไม่มีความคิดเห็น:
แสดงความคิดเห็น