Điều khiển động cơ bước với Driver A4988 và Arduino

Điều khiển động cơ bước với Driver A4988 và Arduino

Nếu bạn đã từng sử dụng qua máy in 3D thì Driver A4988 Arduino là một module không có gì xa lạ. Để nắm rõ hơn cách thức hoạt động và cấu tạo bên trong của A4988 thì các bạn không nên bỏ qua bài viết này.

Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.

Xem ngay: Điều khiển động cơ bước Stepper Motor bằng IC L293D và Arduino

Driver điều khiển động cơ bước A4988

A4988 là một loại chip điều khiển động cơ bước đơn giản và mạnh mẽ. Nó được sử dụng rộng rãi trong các ứng dụng Arduino. Với những chức năng như điều khiển dòng động cơ, điều chỉnh tốc độ, và chế độ hoạt động microstep.

Để sử dụng A4988 Arduino, bạn cần kết nối các chân đầu vào như STEP (điều khiển bước), DIR (điều khiển hướng), và ENABLE (kích hoạt) từ Arduino. Bạn cũng cần cung cấp nguồn điện và kết nối động cơ bước vào các chân đầu ra.

Thông số kỹ thuật

Dưới đây là một số tính năng và thông số kỹ thuật quan trọng của chip A4988:

  • Điện áp hoạt động: Tính từ 8V đến 35V.
  • Dòng điều khiển động cơ: Tối đa 2A.
  • Chế độ hoạt động microstep: Hỗ trợ từ full step đến 1/16 step.
  • Chức năng tắt nguồn tự động (Automatic Power-Down): Giúp tiết kiệm năng lượng khi động cơ không hoạt động.
  • Chức năng bảo vệ quá nhiệt (Thermal Shutdown): Ngắt kết nối nguồn khi nhiệt độ vượt quá mức cho phép.
  • Chức năng giảm dòng động cơ (Current Decay Mode): Điều chỉnh cách giảm dòng điện khi động cơ không hoạt động để giảm tiếng ồn và tiết kiệm năng lượng.

Sơ đồ chân Driver điều khiển động cơ bước A4988

Chân nguồn (Power Pins)

Trong Driver A4988, các Power Pins (chân nguồn) bao gồm:

  • VDD: Chân cung cấp điện tích dương (+). Nó được kết nối với nguồn điện dương DC từ 8V đến 35V. Đây là nguồn điện chính cung cấp cho chip điều khiển động cơ.
  • GND: Chân nối đất (-). Nó được kết nối với mối tiếp đất của nguồn điện và các thành phần khác trong mạch.
  • VMOT: Chân cung cấp điện tích dương (+) cho động cơ. Nó được kết nối với nguồn điện động cơ DC từ 8V đến 35V.

Lưu ý rằng các chân nguồn này cần được đấu nối chính xác và đúng điện áp để đảm bảo Driver A4988 arduino hoạt động đúng. Nếu điện áp không đúng, có thể gây hư hỏng cho chip và động cơ hoặc làm giảm hiệu suất.

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

Chân lựa chọn microstep (Microstep Selection Pins)

Chân lựa chọn microstep (Microstep Selection Pins) trong Driver A4988 là các chân đầu vào trên module điều khiển động cơ bước A4988 để thiết lập chế độ hoạt động microstep của động cơ bước.

Driver A4988 hỗ trợ các chế độ microstep như full step, half step, 1/4 step, 1/8 step và 1/16 step. Bằng cách kết hợp các chân microstep selection (MS1, MS2 và MS3) với mức điện áp (VREF) được cấp cho chân REF pin, bạn có thể lựa chọn chế độ microstep phù hợp với yêu cầu.

Dưới đây là bảng mô tả cách lựa chọn chế độ microstep bằng các chân microstep selection trên Driver A4988:

MS1 Pin MS2 Pin MS3 Pin Chế độ microstep
LOW LOW LOW Full step
HIGH LOW LOW Half step
LOW HIGH LOW 1/4 step
HIGH HIGH LOW 1/8 step
HIGH HIGH HIGH 1/16 step

Bằng cách cấu hình các chân microstep selection theo ý muốn, bạn có thể điều chỉnh độ phân giải và độ chính xác của động cơ bước khi hoạt động.

Chân điều khiển đầu vào (Control Input Pins)

Chân điều khiển đầu vào được sử dụng để điều khiển hoạt động của động cơ bước. Các chân này bao gồm:

  • STEP (Step Pin): Chân này được sử dụng để cung cấp các xung điều khiển để di chuyển động cơ bước một bước. Mỗi lần có xung điện trên chân này, động cơ sẽ di chuyển một bước tương ứng.
  • DIR (Direction Pin): Chân này được sử dụng để xác định hướng di chuyển của động cơ. Khi điện áp trên chân này thay đổi, động cơ sẽ di chuyển theo hướng tương ứng (về phía trước hoặc phía sau).

Chân điều khiển các trạng thái nguồn (Pins For Controlling Power States)

Có ba chân được sử dụng để điều khiển các trạng thái nguồn (power states) của driver và động cơ bước. Các chân này bao gồm:

  • EN (Enable Pin): Chân này được sử dụng để bật hoặc tắt hoạt động của driver A4988 arduino. Khi chân EN ở mức logic HIGH, driver và động cơ bước hoạt động. Khi chân EN ở mức logic LOW, driver và động cơ bước bị tắt.
  • RST (Reset Pin): Chân này được sử dụng để đặt lại (reset) trạng thái của driver A4988. Khi một xung điện ở mức logic LOW được đưa vào chân này, driver sẽ trở về trạng thái ban đầu.
  • SLP (Sleep Pin): Chân này được sử dụng để đưa driver A4988 vào chế độ ngủ (sleep mode). Khi chân SLP được đặt ở mức logic HIGH, driver vào chế độ ngủ và hoạt động của động cơ bước bị tạm dừng. Khi chân SLP được đặt ở mức logic LOW, driver thoát khỏi chế độ ngủ và hoạt động bình thường.

Các chân EN, RST và SLP cần được kết nối chính xác theo datasheet của Driver A4988 để điều khiển nguồn và trạng thái hoạt động của driver và động cơ bước.

Chân đầu ra (Output Pins)

Trong Driver A4988, có bốn chân đầu ra (output pins) được sử dụng để điều khiển các cuộn dây của động cơ bước. Các chân này được đánh số như sau: 1B, 1A, 2A, 2B

Qua việc kiểm soát các chân đầu ra này, Driver A4988 thực hiện các xung điện để kích hoạt các cuộn dây của động cơ bước và tạo ra các bước xoay cần thiết để động cơ di chuyển.

Chú ý rằng việc kết nối đúng các chân đầu ra với đúng cuộn dây của động cơ bước rất quan trọng để đảm bảo hoạt động chính xác của động cơ. Bạn cần tham khảo datasheet A4988 và sơ đồ chân của động cơ bước để kết nối chính xác các chân đầu ra với cuộn dây tương ứng.

Tản nhiệt (Heatsink)

Heatsink (tản nhiệt) là một thành phần được sử dụng để giải nhiệt cho vi mạch điện tử bên trong driver. Vì trong quá trình hoạt động, driver có thể tạo ra lượng nhiệt cao do tổn thất công suất.

Tản nhiệt là một tấm kim loại có thiết kế vừa với diện tích tiếp xúc của IC A4988. Heatsink được gắn trực tiếp lên driver điều khiển động cơ bước A4988 arduino để hút nhiệt từ vi mạch và truyền nhiệt ra không khí xung quanh, giúp làm mát driver và duy trì nhiệt độ hoạt động an toàn.

Giới hạn dòng điện (Current limiting)

Cách 1

Trong cách đầu tiên này, mình sẽ dùng phương pháp giới hạn dòng điện trong động cơ bước NEMA 17 thông qua đo điện áp (Vref) tại chân “ref”.

Vì động cơ bước NEMA 17 có thông số 200 bước/vòng, và điện áp sử dụng 12V 350mA nên để giới hạn dòng điện của động cơ này bạn có thể làm theo các bước sau:

  • Kết nối một resistor chịu dòng điện (current-sensing resistor) giữa chân “ref” và chân GND của driver động cơ bước.
  • Sử dụng một voltmeter hoặc thiết bị đo điện áp để đo điện áp tại chân “ref” và chân GND. Điện áp này được gọi là Vref.

Vref = Current Limit / 2.5

  • động cơ bước NEMA 17 có dòng điện định mức là 350mA, nên điện áp tham chiếu sẽ là 0,14V

Cách 2

Trong cách thứ 2 này, mình sẽ dùng phương pháp giới hạn dòng điện được xác định bằng cách đo dòng điện chạy qua cuộn dây.

Bằng cách đấu nối theo sơ đồ bên dưới, sử dụng một tua vít nhỏ, điều chỉnh biến trở cho đến khi đạt được dòng điện định mức.

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
Driver A4988 1 Shopee | Cytron
Động cơ bước NEMA 17 1 Shopee | Cytron
Đồng hồ đo ZOYI ZT S4 1 Shopee | Cytron
Dây cắm 10-20 Shopee | Cytron

Sơ đồ đấu nối Driver điều khiển động cơ bước A4988 với Arduino

Code – Không sử dụng thư viện

Đoạn code bên dưới sẽ làm động cơ bước NEMA 17 quay theo hướng kim đồng hồ rồi đổi hướng ngược chiều kim đồng hồ và quay nhanh. Khi động cơ quay, mỗi lần bước xoay sẽ có thời gian chờ giữa các bước để tạo ra tốc độ và hướng quay mong muốn.

// Define pin connections & motor's steps per revolution
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;

void setup()
{
	// Declare pins as Outputs
	pinMode(stepPin, OUTPUT);
	pinMode(dirPin, OUTPUT);
}
void loop()
{
	// Set motor direction clockwise
	digitalWrite(dirPin, HIGH);

	// Spin motor slowly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(2000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(2000);
	}
	delay(1000); // Wait a second
	
	// Set motor direction counterclockwise
	digitalWrite(dirPin, LOW);

	// Spin motor quickly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(1000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(1000);
	}
	delay(1000); // Wait a second
}

Giải thích Code

// Define pin connections & motor's steps per revolution
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;

Đầu tiên, cần khai báo các chân kết nối và số bước quay của động cơ:

  • dirPin là chân kết nối điều khiển hướng quay của động cơ.
  • stepPin là chân kết nối điều khiển bước xoay của động cơ.
  • stepsPerRevolution là số bước mà động cơ cần thực hiện để hoàn thành một vòng quay.
void setup()
{
	// Declare pins as Outputs
	pinMode(stepPin, OUTPUT);
	pinMode(dirPin, OUTPUT);
}

Trong hàm setup(), các chân kết nối được khai báo là đầu ra (OUTPUT) để điều khiển động cơ bước NEMA 17.

void loop()
{
	// Set motor direction clockwise
	digitalWrite(dirPin, HIGH);

	// Spin motor slowly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(2000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(2000);
	}
	delay(1000); // Wait a second
	
	// Set motor direction counterclockwise
	digitalWrite(dirPin, LOW);

	// Spin motor quickly
	for(int x = 0; x < stepsPerRevolution; x++)
	{
		digitalWrite(stepPin, HIGH);
		delayMicroseconds(1000);
		digitalWrite(stepPin, LOW);
		delayMicroseconds(1000);
	}
	delay(1000); // Wait a second
}

Trong hàm loop(), quá trình điều khiển động cơ được thực hiện:

Đầu tiên, hướng quay của động cơ được đặt là theo chiều kim đồng hồ bằng cách đưa giá trị HIGH vào dirPin.

  • Sau đó, động cơ được quay chậm bằng cách thực hiện một vòng lặp từ 0 đến stepsPerRevolution:
  • Đưa giá trị HIGH vào stepPin để thực hiện bước xoay của động cơ.
  • Chờ một khoảng thời gian ngắn (2000 microseconds) bằng cách sử dụng delayMicroseconds().
  • Đưa giá trị LOW vào stepPin để kết thúc bước xoay.
  • Chờ một khoảng thời gian ngắn (2000 microseconds). Sau đó, chờ một giây bằng cách sử dụng delay(1000) để tạm dừng.

Hướng quay của động cơ được đặt ngược chiều kim đồng hồ bằng cách đưa giá trị LOW vào dirPin.

  • Động cơ được quay nhanh bằng cách thực hiện lại quá trình quay tương tự như trên, nhưng thời gian chờ giữa các bước xoay là ngắn hơn (1000 microseconds).

Cuối cùng, sử dụng hàm delay(1000) và chờ một giây trước khi lặp lại quá trình.

Code – Sử dụng thư viện AccelStepper

Cài đặt thư viện

Để cài đặt thư viện AccelStepper trên Arduino IDE, các bạn cần làm theo các bước sau: Sketch > Include Libraries > Manage Libraries…

Nhập vào ô tìm kiếm tư khóa “accelstepper” chọn phiên bản mới nhất và tiến hành Download.

Code

Trong ví dụ này mình sẽ sử dụng thư viện AccelStepper để điều khiển một động cơ bước thông qua Arduino.

Đoạn code sẽ điều khiển động cơ bước quay theo một hướng với tốc độ, gia tốc, và vị trí mục tiêu đã được thiết lập, sau đó thay đổi hướng quay khi đạt đến vị trí mục tiêu. Quá trình này được lặp lại trong vòng lặp loop().

// Include the AccelStepper Library
#include <AccelStepper.h>

// Define pin connections
const int dirPin = 2;
const int stepPin = 3;

// Define motor interface type
#define motorInterfaceType 1

// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position
	myStepper.setMaxSpeed(1000);
	myStepper.setAcceleration(50);
	myStepper.setSpeed(200);
	myStepper.moveTo(200);
}

void loop() {
	// Change direction once the motor reaches target position
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	// Move the motor one step
	myStepper.run();
}

Giải thích Code

// Include the AccelStepper Library
#include <AccelStepper.h>

Đầu tiên cần khai báo thư viện AccelStepper.h để điều khiển động cơ bước NEMA 17.

// Define motor interface type
#define motorInterfaceType 1

Tiếp theo, kiểu Driver động cơ bước A4988 arduino được định nghĩa thông qua #define motorInterfaceType 1. Trong ví dụ này, Driver sử dụng các chân STEP và DIRECTION.

// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);

Sau đó, một đối tượng myStepper của lớp AccelStepper được khởi tạo với các tham số là kiểu chân STEP và chân DIRECTION..

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position
	myStepper.setMaxSpeed(1000);
	myStepper.setAcceleration(50);
	myStepper.setSpeed(200);
	myStepper.moveTo(200);
}

Trong hàm setup(), thiết lập các thông số cần thiết cho đối tượng myStepper:

  • setMaxSpeed() đặt tốc độ tối đa của động cơ (đơn vị: bước/giây).
  • setAcceleration() đặt hệ số gia tốc của động cơ.
  • setSpeed() đặt tốc độ ban đầu của động cơ.
  • moveTo() đặt vị trí mục tiêu mà động cơ sẽ di chuyển đến (đơn vị: bước).
void loop() {
	// Change direction once the motor reaches target position
	if (myStepper.distanceToGo() == 0) 
		myStepper.moveTo(-myStepper.currentPosition());

	// Move the motor one step
	myStepper.run();
}

Trong hàm loop(), quá trình điều khiển động cơ bước NEMA 17 được thực hiện:

  • Kiểm tra xem động cơ đã đạt đến vị trí mục tiêu chưa bằng cách sử dụng distanceToGo(). Nếu đã đạt đến, đổi hướng quay bằng cách đặt vị trí mục tiêu là âm của vị trí hiện tại.
  • Thực hiện di chuyển động cơ một bước bằng cách sử dụng run().

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments