วันพุธที่ 9 มีนาคม พ.ศ. 2559

[Robot] การใช้ชุดขับมอเตอร์ L298N Dual H-Bridge Motor Controller

ชุดขับมอเตอร์ 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) 
ซึ่งต้องมีการปรับความถี่ให้เหมาะสมกับมอเตอร์ที่จะใช้ด้วยนะครับ

Picture of Getting to know your L298N Dual H-Bridge Motor Controller module:

ขาต่างๆ:


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

การต่อเข้าใช้งานกับ Arduino:


ในการต่อกับ Arduino นั้น ขา IN1,IN2,IN3 และ IN4 นั้น สามารถต่อกับพอร์ต Digital ใดๆก็ได้
เนื่องจาก 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 );

การใช้ค่าในการควบคุมมอเตอร์ต่างๆ จะเป็นไปตามตารางด้านล่างนี้นะครับ

ตารางการทำงาน มอเตอร์ A
ENAIN1IN2คำอธิบาย
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 หยุดการทำงานแบบทันที (แบบเบรค)

ตารางการทำงาน มอเตอร์ B
ENAIN1IN2คำอธิบาย
0N/AN/Aมอเตอร์ B ไม่ทำงาน
0LOWLOWมอเตอร์ B หยุดการทำงานแบบหมุนอิสระ (แบบไม่เบรค)
0-255LOWHIGHมอเตอร์ B ทำงานและหมุนกลับหลังด้วยความเร็วที่ ENB
0-255HIGHLOWมอเตอร์ B ทำงานและหมุนเดินหน้าด้วยความเร็วที่ ENB
0HIGHHIGHมอเตอร์ B หยุดการทำงานแบบทันที (แบบเบรค)




ตัวอย่างเช่นมอเตอร์ A (เป็นมอเตอร์แบบในรูปข้างบน)
ผมต่อขาต่างๆ กับ Arduino UNO ไว้ดังนี้

ENA = ขา 10 (ขานี้รองรับ PWM)
IN1 = ขา 9
IN2 = ขา 8

ผมจะสั่งให้ มอเตอร์ A หมุนเดินหน้า ด้วยความเร็วสูงสุด (255) เป็นเวลา 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();
เป็นคำสั่งที่ใช้หยุดการหมุนของมอเตอร์ทั้งหมด

สามารถดาวน์โหลดไลบรารี่ L298N_ZEREF ได้ที่นี่ครับ 


เซเรฟ     22:48
2/3/2559





5 ความคิดเห็น:

  1. ผมโหลดโปรแกรมลงบอร์ดเสร็จแล้วผมต้องทำไงต่อครับมอเตอร์ถึงจพเริ่มทำงาน

    ตอบลบ
  2. ถ้าผมใช่ MCS51 ควบคุมรบกวนแนะนำโปรแกรมหน่อยครับ

    ตอบลบ
  3. ขอบคุณสำหรับความรู้ดีๆครับ

    ตอบลบ


  4. We have over 600+ stepper motors, stepper motor drivers and accessory products in stock for you to choose from. Furthermore, more than 10+ new models will be added each month. Featured products like nema 23 stepper motor and nema 42 stepper motors have received high praise and had a good performance on market.

    ตอบลบ