Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Động cơ bước 28BYJ-48 là một động cơ được sử dụng rộng rãi và ứng dụng trong trong nhiều dự án cũng như là vật dụng hàng ngày, có thể kế đến: cánh tay Robot 4 bậc, máy in 3D, đầu DVD… Thông qua, bài viết các bạn sẽ nắm rõ hơn về nguyên lý hoạt động cũng như cấu tạo của động cơ bước.

Để tạo động lực cho Team Arduino 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: Hướng dẫn làm cánh tay Robot 4 bậc sử dụng Arduino + Code

Nguyên lý hoạt động của động cơ bước 28BYJ-48

Để xoay động cơ bước 28BYJ-48, ta cần cung cấp các xung điều khiển theo thứ tự đúng cho từng cuộn dây, tạo ra một chu kỳ xoay bước. Mỗi lần tín hiệu điều khiển thay đổi, động cơ sẽ xoay một bước, điều này cho phép kiểm soát chính xác vị trí và hướng xoay của động cơ.

Động cơ bước 28BYJ48 có 64 bước mỗi vòng xoay. Vì vậy để xoay đủ một vòng ta cần cung cấp 64 xung điều khiển.

Bằng cách điều khiển tần số và thứ tự của các xung, ta có thể xoay động cơ bước 28BYJ-48 theo các bước cụ thể và kiểm soát vị trí và tốc độ quay của nó.

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

Động cơ bước 28BYJ-48

Động cơ bước 28BYJ-48 là một loại động cơ bước unipolar 4 dây được sử dụng rộng rãi trong các ứng dụng Arduino và các dự án điện tử. Động cơ này hoạt động dựa trên nguyên lý điện từ, trong đó một dòng điện được cấp vào các cuộn dây và tạo ra các lực điện từ để xoay các bước của động cơ.

Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Động cơ bước 28BYJ-48 có 5 dây điều khiển, trong đó có 4 dây dùng để điều khiển cuộn dây (Coil1, Coil2, Coil3, Coil4) và 1 dây chung (COM).

Để điều khiển động cơ bước 28BYJ48, ta sử dụng một driver động cơ như ULN2003 hoặc L293D. Driver này có nhiệm vụ cung cấp dòng điện và chuyển đổi các tín hiệu điều khiển từ Arduino để xoay các bước của động cơ.

Sơ đồ chân (Pinout)

Dưới đây là sơ đồ chân (Pinout) của động cơ bước 28BYJ-48 khi nhìn từ phía trước, với các chân (Coil1, Coil2, Coil3, Coil4) là các chân điều khiển của các cuộn dây và chân COM là dây chung.

Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Để điều khiển động cơ bước, chúng ta cần kết nối các chân (Coil1, Coil2, Coil3, Coil4) với driver động cơ hoặc các chân điều khiển của Arduino để cung cấp tín hiệu điều khiển và dòng điện cần thiết.

Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Tỉ số truyền hộp giảm tốc

Động cơ bước 28BYJ-48 có một hệ thống giảm tốc bên trong, được gọi là hệ thống hạt nhỏ (small gear train). Hệ thống này bao gồm một số bánh răng (gears) được kết nối với rotor của động cơ bước. Mỗi bánh răng trong hệ thống có một số lượng răng khác nhau.

Đối với động cơ bước 28BYJ48, gear reduction ratio được xác định là 1/64. Điều này có nghĩa là mỗi lần động cơ thực hiện một bước (step), rotor sẽ quay một góc nhỏ, tương ứng với 1/64 của một vòng quay.

Khi áp dụng xung điều khiển (pulse control) cho động cơ bước, điện thế và dòng điện được cung cấp đến các cuộn dây trong động cơ để tạo ra lực elektromagnet, đẩy rotor tiến một bước. Với mỗi bước, rotor quay một góc nhỏ được quy định bởi gear reduction ratio 1/64.

Gear reduction ratio của động cơ bước 28BYJ-48 giúp tăng lực xoắn (torque) và giảm tốc độ quay của động cơ. Nên động cơ bước này thích hợp cho các ứng dụng yêu cầu độ chính xác và lực xoắn cao.

Công suất tiêu thụ năng lượng

Động cơ bước 28BYJ-48 có mức tiêu thụ công suất tương đối thấp. Công suất tiêu thụ của động cơ phụ thuộc vào điện áp được cấp và dòng điện chạy qua động cơ.

Với điện áp hoạt động thông thường là 5V, động cơ bước 28BYJ48 tiêu thụ khoảng 50mA đến 70mA khi hoạt động với tốc độ có tải. Đây là mức tiêu thụ công suất khá thấp, cho phép động cơ hoạt động ổn định và không gây quá tải cho nguồn.

Tuy nhiên, khi động cơ đang chạy ở chế độ không tải (idle), nghĩa là không có tải trọng hoặc không có xung điều khiển, công suất tiêu thụ sẽ thấp hơn. Trong trạng thái này, động cơ có thể tiêu thụ từ 10mA đến 20mA dòng điện, tùy thuộc vào điều kiện cụ thể.

Do đó, động cơ bước 28BYJ-48 được coi là tiết kiệm năng lượng và phù hợp cho các ứng dụng yêu cầu tiêu thụ công suất thấp, như trong các thiết bị di động, mạch điều khiển, và các ứng dụng đòi hỏi hiệu suất năng lượng cao.

Thông số kỹ thuật

Module điều khiển động cơ bước ULN2003

Module điều khiển động cơ bước ULN2003 là một module được sử dụng để điều khiển và điều chỉnh động cơ bước một cách dễ dàng và thuận tiện. Nó được sử dụng phổ biến trong các ứng dụng điều khiển động cơ bước như các máy in 3D, máy CNC, robot và các thiết bị tự động hóa khác.

Module điều khiển động cơ bước ULN2003 được tích hợp sẵn mạch ULN2003, một bộ khuếch đại dòng điện, giúp tăng cường khả năng đưa ra xung điều khiển cho các động cơ bước.

Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Module này có các chân kết nối đơn giản và dễ sử dụng. Thông thường, nó bao gồm hai dãy chân điều khiển IN1 đến IN4 và OUT1 đến OUT4 để kết nối với Arduino hoặc bất kỳ bo mạch điều khiển nào khác. Module cũng cung cấp các chân nguồn cấp VCC và GND để cung cấp điện cho động cơ bước.

Mỗi chân đầu ra của module điều khiển ULN2003 có thể điều khiển một dây cuộn của động cơ bước. Bằng cách đưa các tín hiệu xung điều khiển đến các chân đầu vào, module sẽ tạo ra các xung điện áp để điều khiển chính xác các bước chuyển động của động cơ bước.

Module điều khiển động cơ bước ULN2003 có thể hoạt động với nguồn cấp điện DC từ 5V đến 12V, tùy thuộc vào yêu cầu cụ thể của động cơ bước được sử dụng.

Sơ đồ chân ULN2003

Sơ đồ chân này cho thấy có 4 chân đầu vào (IN1, IN2, IN3, IN4) để điều khiển động cơ bước và 4 chân đầu ra OUT1(A), OUT2(B), OUT3(C), OUT4(D) để kết nối với các cuộn dây của động cơ bước. Chân GND được nối đất (Ground), và chân VCC được sử dụng để cung cấp nguồn.

Để điều khiển động cơ bước, bạn cần cấu hình các chân đầu vào IN1, IN2, IN3, IN4 theo đúng thứ tự để tạo ra các xung điện áp theo một chuỗi bước chuyển động cụ thể. Mỗi chân đầu ra OUT1, OUT2, OUT3, OUT4 sẻ kết nối đến các cuộn dây của động cơ bước để tạo ra các xung điện áp điều khiển cuộn dây tương ứng.

Xem ngay: Hướng dẫn chế tạo Robot dò Line Arduino, tránh vật cản HC-SR04

Cá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
Động cơ bước 28BYJ-48 (12V) + ULN2003 2 Shopee | Cytron
Dây cắm 10-20 Shopee | Cytron

Sơ đồ đấu nối động cơ bước 28BYJ-48 và Module điều khiển động cơ bước ULN2003 với Arduino

Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Code 1: Hướng dẫn điều khiển động cơ bước bằng thư viện Stepper

//Includes the Arduino Stepper Library
#include <Stepper.h>

// Defines the number of steps per rotation
const int stepsPerRevolution = 2038;

// Creates an instance of stepper class
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
    // Nothing to do (Stepper Library sets pins as outputs)
}

void loop() {
	// Rotate CW slowly at 5 RPM
	myStepper.setSpeed(5);
	myStepper.step(stepsPerRevolution);
	delay(1000);
	
	// Rotate CCW quickly at 10 RPM
	myStepper.setSpeed(10);
	myStepper.step(-stepsPerRevolution);
	delay(1000);
}

Giải thích Code

//Includes the Arduino Stepper Library
#include <Stepper.h>

Khai báo sử dụng thư viện Stepper trong Arduino.

// Defines the number of steps per rotation
const int stepsPerRevolution = 2038;

Xác định số bước (steps) cho một vòng quay của động cơ bước. Giá trị 2038 được chọn dựa trên thông số kỹ thuật của động cơ bước 28BYJ-48.

// Creates an instance of stepper class
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);

Tạo một đối tượng myStepper từ lớp Stepper. Các đối số truyền vào định nghĩa số bước (stepsPerRevolution) và các chân của Arduino được nối với các chân điều khiển của động cơ bước (IN1, IN3, IN2, IN4) theo thứ tự.

void setup() {
    // Nothing to do (Stepper Library sets pins as outputs)
}

Trong hàm setup(), không có gì để thực hiện, vì thư viện Stepper đã tự động cài đặt các chân điều khiển là đầu ra (output) khi khởi tạo đối tượng Stepper.

void loop() {
	// Rotate CW slowly at 5 RPM
	myStepper.setSpeed(5);
	myStepper.step(stepsPerRevolution);
	delay(1000);
	
	// Rotate CCW quickly at 10 RPM
	myStepper.setSpeed(10);
	myStepper.step(-stepsPerRevolution);
	delay(1000);
}

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

  • Dòng myStepper.setSpeed(5); đặt tốc độ quay của động cơ bước là 5 RPM (vòng quay mỗi phút).
  • Dòng myStepper.step(stepsPerRevolution); thực hiện quay một vòng đầy (2038 bước) theo chiều kim đồng hồ (CW). Hàm step() sẽ tiến hành gửi các xung điện áp đúng thứ tự lên các chân điều khiển của động cơ bước.
  • Dòng delay(1000); dừng lại trong 1 giây trước khi thực hiện tiếp các lệnh tiếp theo.

Tiếp theo, chương trình thực hiện các bước tương tự như trên, nhưng lần này động cơ quay ngược chiều kim đồng hồ (CCW) với tốc độ 10 RPM.

Cuối cùng, dòng delay(1000); dừng lại trong 1 giây trước khi quay lại lặp lại quá trình.

Code 2: Hướng dẫn điều khiển động cơ bước bằng thư viện AccelStepper

Cài đặt thư viện

Mở phần mềm Arduino IDE lên, truy cập vào Sketch > Include Library > Manage Libraries…

Nhập vào ô tìm kiếm thư viện “accelstepper”, chọn Version mới nhất và tiến hành cài đặt.

Code Arduino

Dưới đây là một ví dụ về cách sử dụng thư viện AccelStepper trong Arduino để điều khiển một động cơ bước.

Đoạn Code cho phép điều khiển động cơ bước với chế độ gia tốc, đặt tốc độ, hệ số gia tốc và vị trí mục tiêu. Động cơ sẽ di chuyển về phía vị trí mục tiêu và thay đổi hướng quay khi đạt đến vị trí đó.

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

// Define step constant
#define MotorInterfaceType 4

// Creates an instance
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper myStepper(MotorInterfaceType, 8, 10, 9, 11);

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

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>

Khai báo sử dụng thư viện AccelStepper trong Arduino.

// Define step constant
#define MotorInterfaceType 4

Xác định module điều khiển động cơ bước, trong trường hợp này sử dụng động cơ 4 dây (4-wire).

// Creates an instance
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper myStepper(MotorInterfaceType, 8, 10, 9, 11);

Tạo một đối tượng myStepper từ lớp AccelStepper. Các đối số truyền vào định nghĩa module điều khiển động cơ (MotorInterfaceType) và các chân của Arduino được nối với các chân điều khiển của động cơ bước (IN1, IN3, IN2, IN4) theo thứ tự.

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

Trong hàm setup(), các thiết lập ban đầu được thực hiện:

  • Dòng myStepper.setMaxSpeed(1000.0); đặt tốc độ tối đa của động cơ bước là 1000 bước/giây.
  • Dòng myStepper.setAcceleration(50.0); đặt hệ số gia tốc của động cơ bước là 50 bước/giây.
  • Dòng myStepper.setSpeed(200); đặt tốc độ ban đầu của động cơ bước là 200 bước/giây.
  • Dòng myStepper.moveTo(2038); đặt vị trí mục tiêu của động cơ bước là 2038 bước. Động cơ sẽ chạy đến vị trí này.
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(), chương trình thực hiện các bước điều khiển động cơ:

  • Dòng if (myStepper.distanceToGo() == 0) kiểm tra xem động cơ đã đạt đến vị trí mục tiêu chưa. Nếu đã đạt đến, thì đổi hướng quay bằng cách đặt vị trí mục tiêu là đối diện với vị trí hiện tại của động cơ (myStepper.moveTo(-myStepper.currentPosition())).
  • Dòng myStepper.run() thực hiện di chuyển động cơ một bước. Hàm run() sẽ điều khiển các tín hiệu trên các chân điều khiển để di chuyển động cơ theo hướng và tốc độ đã được thiết lập.

Code 3: Hướng dẫn điều khiển đồng thời hai động cơ bước 28BYJ-48

Sơ đồ đấu nối

Điều khiển động cơ bước 28BYJ-48 bằng Driver ULN2003 & Arduino

Code Arduino

Dưới đây là một ví dụ sử dụng thư viện AccelStepper để điều khiển hai động cơ bước (stepper1 và stepper2) với chế độ gia tốc, đặt tốc độ, hệ số gia tốc và đặt vị trí mục tiêu cho mỗi động cơ.

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

// Define step constants
#define FULLSTEP 4
#define HALFSTEP 8

// Creates two instances
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper stepper1(HALFSTEP, 8, 10, 9, 11);
AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7);

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position for motor 1
	stepper1.setMaxSpeed(1000.0);
	stepper1.setAcceleration(50.0);
	stepper1.setSpeed(200);
	stepper1.moveTo(2038);

	// set the same for motor 2
	stepper2.setMaxSpeed(1000.0);
	stepper2.setAcceleration(50.0);
	stepper2.setSpeed(200);
	stepper2.moveTo(-2038);
}

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

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

Giải thích Code

// Define step constants
#define FULLSTEP 4
#define HALFSTEP 8

Xác định các hằng số cho chế độ hoạt động của động cơ bước, trong trường hợp này là chế độ full-step và half-step.

// Creates two instances
// Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence
AccelStepper stepper1(HALFSTEP, 8, 10, 9, 11);
AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7);

Tạo một đối tượng stepper1 từ lớp AccelStepper. Đối số đầu tiên là chế độ hoạt động (FULLSTEP hoặc HALFSTEP), các đối số tiếp theo là các chân của Arduino được kết nối với các chân điều khiển của động cơ bước (IN1, IN3, IN2, IN4) theo thứ tự. Tương tự, dòng AccelStepper stepper2(FULLSTEP, 4, 6, 5, 7); tạo một đối tượng stepper2 cho động cơ bước thứ hai.

void setup() {
	// set the maximum speed, acceleration factor,
	// initial speed and the target position for motor 1
	stepper1.setMaxSpeed(1000.0);
	stepper1.setAcceleration(50.0);
	stepper1.setSpeed(200);
	stepper1.moveTo(2038);

	// set the same for motor 2
	stepper2.setMaxSpeed(1000.0);
	stepper2.setAcceleration(50.0);
	stepper2.setSpeed(200);
	stepper2.moveTo(-2038);
}

Trong hàm setup(), các thiết lập ban đầu được thực hiện cho cả hai động cơ:

  • Đối với stepper1:

Dòng stepper1.setMaxSpeed(1000.0); đặt tốc độ tối đa của động cơ stepper1 là 1000 bước/giây.

Dòng stepper1.setAcceleration(50.0); đặt hệ số gia tốc của động cơ stepper1 là 50 bước/giây.

Dòng stepper1.setSpeed(200); đặt tốc độ ban đầu của động cơ stepper1 là 200 bước/giây.

Dòng stepper1.moveTo(2038); đặt vị trí mục tiêu của động cơ stepper1 là 2038 bước. Động cơ sẽ chạy đến vị trí này.

  • Đối với stepper2:

Tương tự như stepper1, các giá trị tốc độ, hệ số gia tốc và vị trí mục tiêu của stepper2 cũng được thiết lập.

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

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

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

Dòng if (stepper1.distanceToGo() == 0) kiểm tra xem động cơ stepper1 đã đạt đến vị trí mục tiêu chưa. Nếu đã đạt đến, thì đổi hướng quay của động cơ bằng cách di chuyển đến vị trí ngược lại (-stepper1.currentPosition()).

Tương tự, dòng if (stepper2.distanceToGo() == 0) kiểm tra động cơ stepper2.

Dòng stepper1.run()stepper2.run() thực hiện điều khiển các động cơ để di chuyển một bước tiếp theo.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments