ESP32 Stepper Motor 28BYJ-48 và Driver ULN2003

Trong hướng dẫn này, chúng ta sẽ tìm hiểu các chủ đề sau:

ESP32 uln2003 28byj-48 động cơ bước

Stepper motor (động cơ bước) vượt trội trong việc điều khiển vị trí chính xác, vì chúng chia một vòng quay hoàn chỉnh thành các "bước" rời rạc. Những động cơ này được ứng dụng trong nhiều thiết bị khác nhau, bao gồm máy in, máy in 3D, máy CNC và các hệ thống tự động hóa công nghiệp.

Một phương pháp tiết kiệm chi phí để tìm hiểu về stepper motor là thử nghiệm với stepper motor 28BYJ-48. Thông thường, những động cơ này được đi kèm với bo mạch driver dựa trên ULN2003, giúp việc sử dụng chúng trở nên đơn giản hơn rất nhiều.

Linh Kiện Cần Thiết

1×mô-đun phát triển ESP-WROOM-32
1×Alternatively, ESP32 Uno-form board
1×Alternatively, ESP32 S3 Uno-form board
1×Cáp USB Type-C
1×Stepper motor 28BYJ-48 + ULN2003 Driver Module
1×Bộ Nguồn 5V
1×DC Power Jack
1×dây jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
1×(Khuyến nghị) Breakout Expansion Board for ESP32
1×(Khuyến nghị) Power Splitter for ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Stepper Motor 28BYJ-48

Theo datasheet, động cơ 28BYJ-48 khi hoạt động ở chế độ full-step, di chuyển theo từng bước 11.25 độ, tạo ra 32 bước cho một vòng quay hoàn chỉnh (tính toán: 360°/11.25° = 32).

Hơn nữa, động cơ tích hợp hệ thống bánh răng giảm tốc 1/64, làm tăng hiệu quả số bước lên 32 x 64, tạo ra 2048 bước cho mỗi vòng quay. Mỗi bước trong số 2048 bước này tương ứng với một góc quay 360°/2048, tức khoảng 0.1758 độ mỗi bước.

Kết luận: nếu động cơ thực hiện 2048 bước (ở chế độ full-step), động cơ sẽ quay một vòng

Sơ Đồ Chân

Stepper motor 28BYJ-48 có 5 chân. Chúng ta không cần quan tâm chi tiết về các chân này. Chúng ta chỉ cần cắm nó vào connector của driver motor ULN2003.

28byj-48 động cơ bước

Về Module Driver Stepper Motor ULN2003

ULN2003 nổi bật là một module driver motor được sử dụng rộng rãi cho stepper motor. Các tính năng chính của module bao gồm:

  • Bốn LED sáng để chỉ thị hoạt động của bốn đường dây điều khiển đầu vào, phản ánh hiệu quả trạng thái bước hiện tại của động cơ. Những LED này không chỉ phục vụ mục đích thực tế mà còn thêm yếu tố trực quan cho quá trình bước.
  • Một jumper ON/OFF được tích hợp trong module, cho phép cách ly nguồn điện đến stepper motor được kết nối. Tính năng này cung cấp phương tiện thuận tiện để điều khiển nguồn cung cấp của động cơ, cho phép quản lý năng lượng hiệu quả.

Sơ Đồ Chân ULN2003

uln2003 động cơ bước trình điều khiển sơ đồ chân

Module ULN2003 bao gồm 6 chân và một connector cái:

  • Chân IN1: được sử dụng để điều khiển động cơ. Kết nối nó với chân output trên ESP32.
  • Chân IN2: được sử dụng để điều khiển động cơ. Kết nối nó với chân output trên ESP32.
  • Chân IN3: được sử dụng để điều khiển động cơ. Kết nối nó với chân output trên ESP32.
  • Chân IN4: được sử dụng để điều khiển động cơ. Kết nối nó với chân output trên ESP32.
  • Chân GND: là chân mass chung. Nó PHẢI kết nối với cả GND của ESP32 và nguồn cung cấp ngoài.
  • Chân VDD: cung cấp nguồn cho động cơ. Kết nối nó với nguồn cung cấp ngoài.
  • Motor Connector: đây là nơi cắm động cơ.

※ Lưu ý:

Khi cung cấp nguồn cho stepper motor, quan trọng là phải tuân theo các nguyên tắc sau:

  • Đảm bảo điện áp của nguồn cung cấp ngoài khớp với yêu cầu điện áp của stepper motor. Ví dụ, nếu stepper motor của bạn hoạt động ở 12V DC, rất quan trọng là sử dụng nguồn 12V. Trong trường hợp stepper motor 28BYJ-48 hoạt động ở 5V DC, bắt buộc phải sử dụng nguồn cung cấp 5V.
  • Quan trọng cần lưu ý là ngay cả khi stepper motor được thiết kế để chạy với nguồn 5V, KHÔNG kết nối chân VDD với chân 5V trên ESP32. Thay vào đó, liên kết chân VDD với nguồn 5V ngoài. Biện pháp phòng ngừa này rất quan trọng vì stepper motor có thể tiêu thụ một lượng điện năng đáng kể, có thể vượt quá khả năng của nguồn cung cấp ESP32, có thể gây ra vấn đề hoặc hư hỏng.

Sơ Đồ Đấu Nối

ESP32 động cơ bước uln2003 trình điều khiển sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

Nếu bạn chưa rõ cách cấp nguồn cho ESP32 và các linh kiện khác, xem: Cách Cung Cấp Nguồn Điện Cho ESP32.

Xin lưu ý rằng, chúng ta không cần quan tâm về màu dây của stepper motor. Chúng ta chỉ cần cắm connector đực (trong stepper motor 28BYJ-48) vào connector cái (trên driver ULN2003)

Cách Lập Trình để điều khiển stepper motor

Khi điều khiển stepper motor, có ba phương pháp chính:

  • Full-Step (Bước đầy đủ)
  • Half-Step (Nửa bước)
  • Micro-Step (Vi bước)

Đối với các ứng dụng cơ bản, phương pháp full-step thường là đủ. Tuy nhiên, giải thích chi tiết về cả ba phương pháp sẽ được cung cấp trong phần cuối của hướng dẫn này. Đáng chú ý là việc lập trình cho các phương pháp này có thể phức tạp. Tin tốt là có nhiều thư viện có sẵn giúp xử lý độ phức tạp này cho chúng ta. Tất cả những gì chúng ta cần làm là sử dụng thư viện phù hợp, đơn giản hóa việc điều khiển stepper motor trong các dự án của chúng ta.

Arduino IDE bao gồm thư viện Stepper tích hợp, nhưng chúng tôi khuyên không nên sử dụng nó vì những lý do sau:

  • Tính Chất Blocking: Thư viện này hoạt động theo cách blocking, có nghĩa là nó độc quyền tài nguyên của ESP32, ngăn cản nó thực hiện các tác vụ khác trong khi điều khiển stepper motor.
  • Chức Năng Hạn Chế: Thư viện Stepper tích hợp có thể không cung cấp tất cả các hàm và tính năng bạn cần cho dự án của mình.

Thay vào đó, chúng tôi khuyên sử dụng thư viện AccelStepper. Thư viện này cung cấp một số ưu điểm, bao gồm:

  • Gia tốc và Giảm tốc: Nó hỗ trợ gia tốc và giảm tốc mượt mà, cho phép điều khiển chính xác hơn.
  • Full-Step và Half-Step Driving: Bạn có thể chọn giữa chế độ driving full-step và half-step cho stepper motor của mình.
  • Nhiều Stepper Đồng Thời: AccelStepper cho phép điều khiển nhiều stepper đồng thời, với mỗi stepper di chuyển độc lập và cùng lúc.

Tuy nhiên, quan trọng cần lưu ý rằng thư viện có một nhược điểm: nó không hỗ trợ micro-step driving.

Code ESP32

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-28byj-48-stepper-motor-uln2003-driver */ // Include the AccelStepper Library #include <AccelStepper.h> // define step constant #define FULLSTEP 4 #define STEP_PER_REVOLUTION 2048 // this value is from datasheet // Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence AccelStepper stepper(FULLSTEP, 19, 18, 17, 16); // ESP32 pin: GPIO19, GPIO18, GPIO17, GPIO16 void setup() { Serial.begin(9600); stepper.setMaxSpeed(1000.0); // set the maximum speed stepper.setAcceleration(50.0); // set acceleration stepper.setSpeed(200); // set initial speed stepper.setCurrentPosition(0); // set position stepper.moveTo(STEP_PER_REVOLUTION); // set target position: 64 steps <=> one revolution } void loop() { // change direction once the motor reaches target position if (stepper.distanceToGo() == 0) stepper.moveTo(-stepper.currentPosition()); stepper.run(); // MUST be called in loop() function Serial.print(F("Current Position: ")); Serial.println(stepper.currentPosition()); }

Các Bước Nhanh

  • Nếu đây là lần đầu tiên bạn sử dụng ESP32, xem ESP32 - Cài Đặt Phần Mềm.
  • Thực hiện đấu nối như hình ảnh trên.
  • Kết nối board ESP32 với PC của bạn qua cáp micro USB
  • Mở Arduino IDE trên PC của bạn.
  • Chọn đúng board ESP32 (ví dụ: ESP32 Dev Module) và cổng COM.
  • Nhấp vào biểu tượng Libraries ở thanh bên trái của Arduino IDE.
  • Tìm kiếm "AccelStepper", sau đó tìm thư viện AccelStepper của Mike McCauley
  • Nhấp nút Install để cài đặt thư viện AccelStepper.
ESP32 accelstepper thư viện
  • Sao chép code trên và mở bằng Arduino IDE
  • Nhấp nút Upload trên Arduino IDE để tải code lên ESP32
  • Xem động cơ quay. Nó sẽ:
    • Quay một vòng theo chiều kim đồng hồ, và sau đó
    • Quay hai vòng ngược chiều kim đồng hồ, và sau đó
    • Quay hai vòng theo chiều kim đồng hồ.

    Quá trình đó được lặp lại vô hạn.

    • Xem kết quả trong Serial Monitor

Cách điều khiển nhiều stepper motor 28BYJ-48

Hãy tìm hiểu cách điều khiển hai stepper motor độc lập cùng lúc.

Sơ Đồ Đấu Nối cho hai stepper motor 28BYJ-48

ESP32 two động cơ bước uln2003 trình điều khiển sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image

Code ESP32 cho hai stepper motor 28BYJ-48

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-28byj-48-stepper-motor-uln2003-driver */ // Include the AccelStepper Library #include <AccelStepper.h> // define step constant #define FULLSTEP 4 #define STEP_PER_REVOLUTION 2048 // this value is from datasheet // Pins entered in sequence IN1-IN3-IN2-IN4 for proper step sequence AccelStepper stepper_1(FULLSTEP, 23, 22, 21, 19); AccelStepper stepper_2(FULLSTEP, 18, 5, 17, 16); void setup() { Serial.begin(9600); stepper_1.setMaxSpeed(1000.0); // set the maximum speed stepper_1.setAcceleration(50.0); // set acceleration stepper_1.setSpeed(200); // set initial speed stepper_1.setCurrentPosition(0); // set position stepper_1.moveTo(STEP_PER_REVOLUTION); // set target position: 64 steps <=> one revolution stepper_2.setMaxSpeed(1000.0); // set the maximum speed stepper_2.setAcceleration(50.0); // set acceleration stepper_2.setSpeed(200); // set initial speed stepper_2.setCurrentPosition(0); // set position stepper_2.moveTo(STEP_PER_REVOLUTION); // set target position: 64 steps <=> one revolution } void loop() { // change direction once the motor reaches target position if (stepper_1.distanceToGo() == 0) stepper_1.moveTo(-stepper_1.currentPosition()); if (stepper_2.distanceToGo() == 0) stepper_2.moveTo(-stepper_2.currentPosition()); stepper_1.run(); // MUST be called in loop() function stepper_2.run(); // MUST be called in loop() function Serial.print(F("stepper_1# current position: ")); Serial.println(stepper_1.currentPosition()); Serial.print(F("stepper_2# current position: ")); Serial.println(stepper_2.currentPosition()); }