Điều khiển động cơ DC, Stepper Motor và Servo bằng Motor Shield L293D & Arduino

Điều khiển động cơ DC, Stepper Motor và Servo bằng Motor Shield L293D & Arduino

Nếu bạn đang muốn chế tạo Robot dò Line Arduino, tránh vật cản thì Motor Shield L293D là một giải pháp không thể tuyệt vời hơn. Shield có khả năng điều khiển đến bốn động cơ DC và tích hợp thêm 2 động cơ Servo.

Thông qua bài viết các bạn sẽ tìm hiểu tổng quan về L293D Arduino và cách điều khiển các loại động cơ DC, động cơ bước và Servo.

Tổng quan về phần cứng Motor Shield L293D

Driver Chipset

Driver Chipset L293D là một IC (Integrated Circuit) điều khiển động cơ DC được sử dụng trong Motor Shield. Nó cung cấp khả năng điều khiển và kiểm soát các động cơ DC thông qua mạch cầu H. Chipset này bao gồm các transistor và diode được kết hợp thành một cấu trúc hình chữ H để điều khiển dòng điện qua động cơ theo các hướng khác nhau.

Motor Shield L293D tích hợp hai chip L293D, cho phép điều khiển đồng thời hai động cơ DC. Các chân kết nối trên Motor Shield cho phép điều khiển hướng chuyển động và tốc độ của các động cơ thông qua các tín hiệu điều khiển từ Arduino.

IC 74HC595 là một IC dịch đa giai đoạn (shift register) 8-bit. Nó cho phép mở rộng số lượng chân I/O của Arduino.

Bằng cách kết hợp IC 74HC595 với Motor Shield L293D, bạn có thể sử dụng nó để điều khiển các linh kiện ngoại vi khác như đèn LED, động cơ servo,…

Nguồn động cơ

Motor Shield L293D có giải điện áp khá rộng từ 4.5 – 25VDC. Module có 2 chế độ là cấp nguồn trực tiếp cho động cơ, hai là sử dụng nguồn của Arduino.

Trong trường hợp bạn muốn sử dụng nguồn trực tiếp của Arduino thì để nguyên Jumper (PWR) trên mạch. Trong trường hợp bạn muốn sử dụng nguồn riêng để cấp cho động cơ thì tháo Jumper này ra (lúc này Motor Shield L293D sẽ tách biệt nguồn với Arduino) và cấp nguồn vào domino EXT_PWR.

Điều khiển động cơ DC

Như bạn cũng đã thấy các đầu ra để nối với động cơ DC trên Motor Shield L293D được ký hiệu bằng các nhãn M1, M2, M3 và M4. Có thể sử dụng tổng cộng bốn động cơ DC hoạt động ở điện áp 4,5 – 25V.

Mỗi động cơ DC trên Shield Motor cho phép dòng điện lên đến 600mA (đỉnh 1.2A). Tuy nhiên, dòng điện cung cấp cho động cơ còn phụ thuộc vào công suất của nguồn điện động cơ.

Điều khiển động cơ bước Stepper Motor

Các bạn cũng có thể sử dụng đầu ra của Motor Shield L293D để điều khiển động cơ bước. M1-M2 sẽ được dùng để đấu nối cho một động cơ và một động cơ tiếp theo sẽ nối với M3-M4.

Trong trường hợp bạn sử dụng động cơ bước có 5 dây, thì hãy đấu dây vào GND trên L293D arduino.

Điều khiển động cơ Servo

Các động cơ Servo được cấp nguồn 5V trực tiếp từ Arduino, đây được xem là một giải pháp tệ của người phát triển Shield này vì làm như vậy có thể khiến IC ổn áp trên bo mạch của Arduino bị nóng và cũng có thể gây ra hiện tượng nhiễu. Việc sử dụng thêm một tụ điện 100uF trên các chân nguồn này, giúp hạn chế một chút hiện tượng này.

Vì vậy, nếu bạn muốn sử dụng Servo trên board mạch này, thì mình khuyên nên sử dụng các Servo nhỏ như SG90.

Tính năng mở rộng

Trên L293D arduino còn bổ sung thêm một số tính năng sau:

Bao gồm một điện trở băng (Pull Down – điện trở kéo xuống) giúp cho động cơ tắt khi bật nguồn.

Đèn LED trên board mạch dùng để báo động cơ đang hoạt động bình thường. Đèn LED không sáng đồng nghĩa là động cơ không hoạt động.

Nút RESET dùng để khởi động lại chương trình trên Arduino.

Sáu chân Analog (A0 đến A5), và các chân 5V, GND được đặt ở bên góc, các bạn có thể sử dụng để đấu nối với các cảm biến.

Đấu nối chân điều khiển động cơ với Arduino

Các chân điều khiển động cơ DC và động cơ bước, được sử dụng các chân D3, D4, D5, D6, D7, D8, D11 và D12.

D9 và D10 được sử dụng để điều khiển động cơ servo. D10 được kết nối với Servo 1, trong khi D9 được kết nối với Servo 2.

Cài đặt thư viện AFMotor

Để giao tiếp với Motor Shield L293D các bạn cần phải cài đặt thư viện AFMotor.h. Điều này giúp cho việc điều khiển động cơ DC, động cơ bước và Servo trở nên dễ dàng hơn.

Khởi động phần mềm Arduino IDE vào Sketch > Include Library > Manage Libraries…

Nhập “motor shield” vào ô tìm kiếm, chọn phiên bản mới nhất và tiến hành cài đặt

Linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Motor Shield L293D 1 Shopee | Cytron
Động cơ bước NEMA 17 1 Shopee | Cytron
Động cơ bước 28BYJ-48 1 Shopee | Cytron
Động cơ Servo SG90 1 Shopee | Cytron
Động cơ vàng 1 Shopee | Cytron
Dây cắm 10-20 Shopee | Cytron

Code 1: Điều khiển động cơ DC với L293D Arduino

Sơ đồ đấu nối dây động cơ vàng DC

Trong ví dụ này, mình sẽ sử dụng một động cơ DC hay thường gọi là động cơ vàng có điện áp hoạt động từ 3-12V là một động cơ được sử dụng trong hầu hết các đề tài như xe điều khiển từ xa, robot tránh vật cản…Và sử dụng nguồn 9V bên ngoài để cấp cho động cơ thông qua domino EXT_PWR.

Các bạn có thể đấu nối động cơ DC vào các domino M1, M2, M3 hoặc M4. Ở đây mình sẽ nối vào domino M4.

Xem ngay: Chế tạo Robot tránh vật cản – Hướng dẫn chi tiết

Code

#include <AFMotor.h>

AF_DCMotor motor(4);

void setup() 
{
	//Set initial speed of the motor & stop
	motor.setSpeed(200);
	motor.run(RELEASE);
}

void loop() 
{
	uint8_t i;

	// Turn on motor
	motor.run(FORWARD);
	
	// Accelerate from zero to maximum speed
	for (i=0; i<255; i++) 
	{
		motor.setSpeed(i);  
		delay(10);
	}
	
	// Decelerate from maximum speed to zero
	for (i=255; i!=0; i--) 
	{
		motor.setSpeed(i);  
		delay(10);
	}

	// Now change motor direction
	motor.run(BACKWARD);
	
	// Accelerate from zero to maximum speed
	for (i=0; i<255; i++) 
	{
		motor.setSpeed(i);  
		delay(10);
	}

	// Decelerate from maximum speed to zero
	for (i=255; i!=0; i--) 
	{
		motor.setSpeed(i);  
		delay(10);
	}

	// Now turn off motor
	motor.run(RELEASE);
	delay(1000);
}

Giải thích Code

#include <AFMotor.h>

Khai báo thư viện AFMotor để có thể sử dụng các lớp và hàm điều khiển động cơ DC.

AF_DCMotor motor(4);

Tạo một đối tượng motor từ lớp AF_DCMotor, được kết nối với chân số 4 trên Motor Shield L293D.

void setup() 
{
	//Set initial speed of the motor & stop
	motor.setSpeed(200);
	motor.run(RELEASE);
}

Trong hàm setup(), tốc độ ban đầu của động cơ được đặt là 200 và động cơ được dừng lại (RELEASE).

void loop() 
{
	uint8_t i;

	// Turn on motor
	motor.run(FORWARD);
	
	// Accelerate from zero to maximum speed
	for (i=0; i<255; i++) 
	{
		motor.setSpeed(i);  
		delay(10);
	}
	
	// Decelerate from maximum speed to zero
	for (i=255; i!=0; i--) 
	{
		motor.setSpeed(i);  
		delay(10);
	}

	// Now change motor direction
	motor.run(BACKWARD);
	
	// Accelerate from zero to maximum speed
	for (i=0; i<255; i++) 
	{
		motor.setSpeed(i);  
		delay(10);
	}

	// Decelerate from maximum speed to zero
	for (i=255; i!=0; i--) 
	{
		motor.setSpeed(i);  
		delay(10);
	}

	// Now turn off motor
	motor.run(RELEASE);
	delay(1000);
}

Trong hàm loop(), động cơ được bật lên và thực hiện các bước tăng tốc từ 0 đến tốc độ tối đa, sau đó giảm tốc từ tốc độ tối đa về 0. Sau đó, đảo ngược hướng quay của động cơ và thực hiện các bước tăng tốc và giảm tốc tương tự. Cuối cùng, động cơ được tắt (RELEASE) và delay trong 1 giây trước khi bắt đầu lại quá trình từ đầu.

Code 2: Điều khiển động cơ bước với L293D Arduino

Sơ đồ đấu nối dây động cơ bước 28BYJ-48

Động cơ bước 28BYJ-48 hoạt động ở điện áp 5V và số bước trên mỗi vòng quay là 48. Mình sẽ cấp nguồn 5V bằng cách đầu vào domino EXT_PWR.

Các bạn lưu ý rút Jumper PWR ra nhé.

Để điều khiển động cơ bước 28BYJ-48 các bạn có thể sử dụng các cặp M1-M2 hoặc M3-M4. Trong ví dụ này mình sẽ dùng M3-M4 để điều khiển.

Điều khiển động cơ DC, Stepper Motor và Servo bằng Motor Shield L293D & Arduino

Đọc ngay: Hướng dẫn làm cánh tay Robot 4 bậc sử dụng Arduino + Code

Sơ đồ đấu nối dây động cơ bước NEMA 17

Động cơ bước NEMA 17 hoạt động ở điện áp 12V và số bước trên mỗi vòng quay là 200. Mình sẽ cấp nguồn ngoài 12V để điều khiển động cơ thông qua domino EXT_PWR.

Như những trường hợp trên, các bạn lưu ý rút Jumper PWR ra nhé.

Motor Shield L293D có 4 cuộn dây (M1, M2,M3, M4) các bạn có thể dùng bất kỳ 1 trong 4 cuộn này để điều khiển động cơ bước NEMA 17. Trong ví dụ này mình sẽ dùng M3-M4.

Code

Ở đoạn Code ví dụ này mình sẽ dùng để điều khiển cho cả hai động cơ bước 28BYJ-48 và động cơ bước NEMA 17. Nhưng các bạn cần thay đổi tham số stepsPerRevolution để phù hợp với từng thông số kỹ thuật của động cơ. Ví dụ: stepsPerRevolution = 200 cho NEMA 17 và stepsPerRevolution = 48 cho 28BYJ-48.

#include <AFMotor.h>

// Number of steps per output rotation
// Change this as per your motor's specification
const int stepsPerRevolution = 48;

// connect motor to port #2 (M3 and M4)
AF_Stepper motor(stepsPerRevolution, 2);

void setup() {
  Serial.begin(9600);
  Serial.println("Stepper test!");

  motor.setSpeed(10);  // 10 rpm   
}

void loop() {
  Serial.println("Single coil steps");
  motor.step(100, FORWARD, SINGLE); 
  motor.step(100, BACKWARD, SINGLE); 

  Serial.println("Double coil steps");
  motor.step(100, FORWARD, DOUBLE); 
  motor.step(100, BACKWARD, DOUBLE);

  Serial.println("Interleave coil steps");
  motor.step(100, FORWARD, INTERLEAVE); 
  motor.step(100, BACKWARD, INTERLEAVE); 

  Serial.println("Micrsostep steps");
  motor.step(100, FORWARD, MICROSTEP); 
  motor.step(100, BACKWARD, MICROSTEP); 
}

Giải thích Code

const int stepsPerRevolution = 48;

Định nghĩa số bước cho mỗi vòng quay của động cơ bước. Giá trị này cần được điều chỉnh phù hợp với thông số kỹ thuật của động cơ bước bạn đang sử dụng.

AF_Stepper motor(stepsPerRevolution, 2);

Tạo một đối tượng motor từ lớp AF_Stepper, được kết nối với chân số 2 trên Motor Shield L293D.

motor.setSpeed(10);  // 10 rpm

Trong hàm setup(), tốc độ ban đầu của động cơ bước được đặt là 10 vòng/phút (rpm).

void loop() {
  Serial.println("Single coil steps");
  motor.step(100, FORWARD, SINGLE); 
  motor.step(100, BACKWARD, SINGLE); 

  Serial.println("Double coil steps");
  motor.step(100, FORWARD, DOUBLE); 
  motor.step(100, BACKWARD, DOUBLE);

  Serial.println("Interleave coil steps");
  motor.step(100, FORWARD, INTERLEAVE); 
  motor.step(100, BACKWARD, INTERLEAVE); 

  Serial.println("Micrsostep steps");
  motor.step(100, FORWARD, MICROSTEP); 
  motor.step(100, BACKWARD, MICROSTEP); 
}

Trong hàm loop(), động cơ bước thực hiện các bước điều khiển sử dụng hàm motor.step(). Mỗi lần gọi hàm này, động cơ di chuyển 100 bước theo hướng FORWARD hoặc BACKWARD, và sử dụng các chế độ điều khiển SINGLE, DOUBLE, INTERLEAVE và MICROSTEP.

Trong vòng lặp, thông tin về các bước điều khiển được hiển thị thông qua Serial Monitor bằng lệnh Serial.println().

Code 3: Điều khiển động cơ Servo với L293D Arduino

Sơ đồ đấu nối dây động cơ SG90

Trên Motor Shield L293D các bạn có thể sử dụng Ser1 (10)SERVO_2 (9) để điều khiển động cơ Servo.

Trong ví dụ này mình sẽ sử dụng nguồn 5V của Arduino, nên các bạn không cần phải rút Jumper EXT_PWR ra nhé.

Đọc ngay: Động cơ RC Servo là gì?

Code

Đây là một đoạn code khá đơn giản, dùng để điều khiển Servo SG90. Trong đoạn code này, Servo được điều khiển từ 0 độ đến 180 độ và sau đó điều khiển ngược lại từ 180 độ về 0 độ.

#include <Servo.h> 

Servo myservo;	// create servo object to control a servo
int pos = 0;	// variable to store the servo position

void setup() 
{
	// attaches the servo on pin 10 to the servo object
	myservo.attach(10);   
}

void loop() 
{
	// sweeps from 0 degrees to 180 degrees
	for(pos = 0; pos <= 180; pos += 1) 
	{
		myservo.write(pos);
		delay(15);
	}
	// sweeps from 180 degrees to 0 degrees
	for(pos = 180; pos>=0; pos-=1)
	{
		myservo.write(pos);
		delay(15);
	}
}

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments