ESP32 Stepper Motor

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng ESP32 để điều khiển stepper motor:

Hướng dẫn này có thể áp dụng cho bất kỳ loại bipolar stepper motor nào (4 dây). Hướng dẫn sẽ lấy stepper motor NEMA 17 làm ví dụ.

ESP32 động cơ bước

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×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)
1×Stepper Motor Nema 17
1×L298N Motor Driver Module
1×12V Power Adapter
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)

Giới Thiệu Về Stepper Motor

Có hai loại stepper motor phổ biến:

  • Bipolar: Những động cơ này có 4 dây.
  • Unipolar: Động cơ unipolar có thể có 5 hoặc 6 dây. Trong trường hợp stepper motor unipolar 6 dây, bạn có thể sử dụng bốn trong số sáu dây để điều khiển nó như một bipolar stepper motor.

Nếu bạn quan tâm đến stepper motor unipolar 5 dây, bạn có thể tham khảo hướng dẫn ESP32 - Stepper Motor 28BYJ-48 và Driver ULN2003.

Tuy nhiên, hướng dẫn này chỉ tập trung vào bipolar stepper motor.

Sơ đồ chân Bipolar Stepper Motor

Bipolar stepper motor có bốn chân, và những chân này có thể được đặt tên khác nhau tùy thuộc vào nhà sản xuất. Dưới đây, bạn sẽ tìm thấy bảng với một số tên chân phổ biến:

PIN NO Naming 1 Naming 2 Naming 3
1 A+ A A
2 A- A C
3 B+ B B
4 B- B D
bipolar động cơ bước sơ đồ chân

Cách sắp xếp chân, tên của dây và màu sắc của dây có thể khác nhau giữa các nhà sản xuất. Để hiểu cách màu sắc dây tương ứng với tên chân, điều cần thiết là tham khảo datasheet hoặc hướng dẫn sử dụng được cung cấp bởi nhà sản xuất. Hình ảnh trên minh họa thông số kỹ thuật của hai động cơ khác nhau, mỗi động cơ có quy ước đặt tên dây và tô màu dây độc đáo riêng.

Số Bước Trên Mỗi Vòng Quay

Thông số kỹ thuật của động cơ chỉ định độ trên mỗi bước (gọi là DEG_PER_STEP). Tùy thuộc vào phương pháp điều khiển, số bước trên mỗi vòng quay (gọi là STEP_PER_REVOLUTION) được tính theo bảng sau:

Phương pháp điều khiển Số bước trên mỗi vòng quay Độ thực tế trên mỗi bước
Full-step STEP_PER_REVOLUTION = 360 / DEG_PER_STEP DEG_PER_STEP
Half-step STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * 2 DEG_PER_STEP / 2
Micro-step (1/n) STEP_PER_REVOLUTION = (360 / DEG_PER_STEP) * n DEG_PER_STEP / n

Ví dụ, nếu datasheet của động cơ chỉ định 1.8 độ/bước:

Phương pháp điều khiển Số bước trên mỗi vòng quay Độ thực tế trên mỗi bước
Full-step 200 bước/vòng quay 1.8°
Half-step 400 bước/vòng quay 0.9°
Micro-step (1/n) (200 * n) bước/vòng quay (1.8 / n)°

Cách điều khiển stepper motor bằng ESP32

ESP32 có thể tạo ra tín hiệu để điều khiển stepper motor, nhưng những tín hiệu này có thể thiếu mức điện áp và dòng điện cần thiết mà stepper motor yêu cầu. Do đó, cần một driver phần cứng trung gian để kết nối giữa ESP32 và stepper motor. Driver này phục vụ hai chức năng chính:

  • Khuếch đại tín hiệu điều khiển: Nó tăng cường dòng điện và điện áp của tín hiệu điều khiển từ ESP32, đảm bảo rằng chúng đáp ứng các yêu cầu của stepper motor.
  • Bảo vệ ESP32: Đồng thời, nó bảo vệ ESP32 khỏi mức dòng điện và điện áp cao hơn được sử dụng để cấp nguồn cho stepper motor, ngăn ngừa bất kỳ tổn hại tiềm ẩn nào.

Nhiều driver phần cứng khác nhau có sẵn để điều khiển stepper motor, và một tùy chọn thường được sử dụng là L298N Driver.

Giới Thiệu Về L298N Driver

Một L298N Driver có thể được sử dụng để điều khiển hai DC motor hoặc một stepper motor. Trong hướng dẫn này, chúng ta học cách sử dụng nó để điều khiển stepper motor.

Sơ đồ chân L298N Driver

l298n trình điều khiển sơ đồ chân

L298N Driver có 11 chân và ba jumper:

  • Chân VCC: cung cấp nguồn cho động cơ. Có thể từ 5 đến 35V.
  • Chân GND: là chân mass chung, cần được kết nối với GND (0V).
  • Chân 5V: cung cấp nguồn cho module L298N. Có thể được cung cấp bởi 5V từ ESP32.
  • Chân IN1, IN2, IN3, IN4: được kết nối với các chân ESP32 để nhận tín hiệu điều khiển để điều khiển stepper motor.
  • Chân OUT1, OUT2, OUT3, OUT4: được kết nối với stepper motor.
  • Jumper ENA, ENB: được sử dụng để kích hoạt stepper motor. Bạn cần giữ cả hai jumper ENA & ENB tại chỗ.
  • Jumper 5V-EN: nếu chúng ta giữ jumper 5V-EN tại chỗ, nguồn cho module L298N được lấy từ VCC, chúng ta không cần kết nối bất cứ gì với chân 5V. nếu chúng ta tháo jumper 5V-EN, chúng ta cần cung cấp nguồn cho module L298N qua chân 5V

Như mô tả ở trên, L298N driver có hai nguồn đầu vào:

  • Một cho stepper motor (chân VCCGND): từ 5 đến 35V.
  • Một cho hoạt động nội bộ của module L298N (chân 5V và GND): từ 5 đến 7V. nếu jumper 5V-EN được giữ tại chỗ, chúng ta không cần kết nối chân này với bất cứ gì.

Sơ Đồ Kết Nối

ESP32 động cơ bước l298n 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.

※ Lưu ý:

  • Vui lòng giữ tất cả ba jumper trên module L298N tại chỗ (trong trường hợp nguồn của động cơ ≤ 12V)
  • Thứ tự các chân trên stepper motor có thể khác nhau giữa các nhà sản xuất. Vui lòng kiểm tra bảng dưới đây để kết nối đúng.

Bảng kết nối giữa ESP32 và L298N Driver

Chân ESP32 Chân L298N
7 IN1
6 IN2
5 IN3
4 IN4

Bảng kết nối giữa L298N Driver và Stepper motor

Quan trọng!: Vui lòng không quan tâm đến thứ tự dây của stepper motor trong hình sơ đồ kết nối ở trên. Đó chỉ là một ví dụ. Thứ tự các chân trên stepper motor có thể khác nhau giữa các nhà sản xuất. Hãy đảm bảo rằng kết nối của bạn tuân theo bảng dưới đây.

Chân L298N Chân stepper motor Hoặc Hoặc
OUT1 A+ A A
OUT2 A- A C
OUT3 B+ B B
OUT4 B- B D

Trước khi mua stepper motor, chúng tôi khuyên bạn nên kiểm tra datasheet, thông số kỹ thuật hoặc hướng dẫn của stepper motor. Hãy đảm bảo rằng họ cung cấp ánh xạ giữa màu và tên của chân. Ví dụ, stepper motor này cung cấp ánh xạ như hình ảnh dưới đây:

động cơ bước coil color mapping

Dựa trên ánh xạ đó, bảng kết nối trở thành:

Chân L298N chân stepper motor màu dây
OUT1 A dây đen
OUT2 C dây xanh lá
OUT3 B dây đỏ
OUT4 D dây xanh dương

※ Lưu ý:

Trong tất cả các bảng kết nối ở trên giữa stepper motor và L298N Driver, chúng ta có thể hoán đổi OUT1 với OUT2, OUT3 với OUT4. Do đó, có nhiều cách để thực hiện kết nối. Tuy nhiên, nếu chúng ta hoán đổi chúng, hướng quay của động cơ có thể bị thay đổi (từ chiều kim đồng hồ sang ngược chiều kim đồng hồ, và ngược lại).

Cách điều khiển Stepper motor bằng L298N driver

Điều khiển stepper motor không phải là một công việc đơn giản, đặc biệt là khi chúng ta muốn điều khiển nó theo cách không chặn (non-blocking). May mắn thay, nhờ thư viện AccelStepper, việc điều khiển stepper motor trở nên dễ dàng.

Arduino IDE cũng có thư viện Stepper tích hợp sẵn. Tuy nhiên, chúng tôi không khuyên bạn sử dụng thư viện này vì:

  • Thư viện cung cấp hàm chặn (blocking function). Điều này có nghĩa là nó chặn ESP32 thực hiện các công việc khác trong khi điều khiển stepper motor.
  • Nó không có đủ các hàm cần thiết.

Thay vào đó, chúng tôi khuyên bạn sử dụng thư viện AccelStepper. Thư viện này hỗ trợ:

  • Gia tốc
  • Giảm tốc
  • Điều khiển full-step và half-step
  • Nhiều stepper cùng lúc, với stepping độc lập đồng thời trên mỗi stepper
  • Nhược điểm: KHÔNG hỗ trợ điều khiển micro-step

Cách Điều Khiển Vị Trí của Stepper Motor qua L298N Driver

Chúng ta có thể di chuyển stepper motor đến vị trí mong muốn bằng cách sử dụng:

stepper.moveTo(desiredPosition); // di chuyển motor một vòng quay

※ Lưu ý:

Hàm stepper.moveTo() là không chặn (non-blocking). Đây là một điểm tuyệt vời của thư viện. Tuy nhiên, chúng ta phải chú ý khi sử dụng hàm này:

  • Gọi 'stepper.run()' càng thường xuyên càng tốt. Nó nên được gọi trong hàm void loop().
  • KHÔNG sử dụng hàm delay() khi motor đang di chuyển.
  • KHÔNG nên sử dụng hàm Serial.print()Serial.println() khi motor đang di chuyển. Những hàm này làm cho stepper motor di chuyển chậm hơn.

Cách Điều Khiển Tốc Độ của Stepper Motor qua L298N Driver

Chúng ta có thể điều khiển không chỉ tốc độ mà còn gia tốc và giảm tốc bằng cách sử dụng một số hàm đơn giản.

stepper.setAcceleration(50.0); // đặt gia tốc/giảm tốc stepper.setSpeed(200); // đặt tốc độ mong muốn

Cách Điều Khiển Hướng của Stepper Motor qua L298N Driver

Nếu bạn thực hiện kết nối như trên, motor sẽ quay:

  • Theo chiều kim đồng hồ: nếu chúng ta điều khiển motor từ vị trí này đến vị trí cao hơn (Tăng vị trí)
  • Ngược chiều kim đồng hồ: nếu chúng ta điều khiển motor từ vị trí này đến vị trí thấp hơn (Giảm vị trí)

Ví dụ:

  • Nếu vị trí hiện tại là 100 và chúng ta điều khiển motor đến 200, motor quay theo chiều kim đồng hồ
  • Nếu vị trí hiện tại là -200 và chúng ta điều khiển motor đến -100, motor quay theo chiều kim đồng hồ
  • Nếu vị trí hiện tại là 200 và chúng ta điều khiển motor đến 100, motor quay ngược chiều kim đồng hồ
  • Nếu vị trí hiện tại là -100 và chúng ta điều khiển motor đến -200, motor quay ngược chiều kim đồng hồ

※ Lưu ý:

Như đã đề cập trước đó, nếu bạn hoán đổi OUT1 với OUT2, hoặc OUT3 với OUT4, việc tăng vị trí có thể là ngược chiều kim đồng hồ và việc giảm vị trí có thể là chiều kim đồng hồ.

Cách Dừng Stepper Motor

  • Stepper motor sẽ tự động dừng sau khi đạt đến vị trí mong muốn.
  • Stepper motor có thể bị buộc dừng ngay lập tức bất cứ lúc nào bằng cách sử dụng hàm stepper.stop().

Code ESP32 - Code Stepper Motor

Code dưới đây thực hiện:

  • Quay motor một vòng theo chiều kim đồng hồ
  • Dừng motor 5 giây
  • Quay motor ngược lại một vòng theo ngược chiều kim đồng hồ
  • Dừng motor 5 giây
  • Quá trình đó được lặp lại liên tục
/* * 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-stepper-motor */ #include <AccelStepper.h> #define DEG_PER_STEP 1.8 #define STEP_PER_REVOLUTION (360 / DEG_PER_STEP) AccelStepper stepper(AccelStepper::FULL4WIRE, 19, 18, 17, 16); // ESP32 pin: GPIO19, GPIO18, GPIO17, GPIO16 long moveToPosition = STEP_PER_REVOLUTION; void setup() { Serial.begin(9600); stepper.setAcceleration(200.0); // set acceleration stepper.setSpeed(200); // set initial speed stepper.setCurrentPosition(0); // set position to 0 stepper.moveTo(STEP_PER_REVOLUTION); // move motor one revolution, in clockwise direction Serial.println("Motor moving in clockwise direction"); } void loop() { if (stepper.distanceToGo() == 0) { Serial.println("Motor is stopped"); delay(5000); // stop 5 seconds stepper.setCurrentPosition(0); // reset position to 0 moveToPosition = -1 * moveToPosition; // reverse direction stepper.moveTo(moveToPosition); // move motor one revolution if (stepper.distanceToGo() > 0) Serial.println("Motor moving in clockwise direction"); else if (stepper.distanceToGo() < 0) Serial.println("Motor moving in anticlockwise direction"); } // Serial.print(F("position: ")); // Serial.println(stepper.currentPosition()); stepper.run(); // MUST be called as frequently as possible }

Các Bước Thực Hiện

  • Nếu đây là lần đầu tiên bạn sử dụng ESP32, hãy xem ESP32 - Cài Đặt Phần Mềm.
  • Thực hiện kết nối như hình ảnh trên.
  • Kết nối bo mạch 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 bo mạch 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
  • Bạn sẽ thấy:
    • Stepper motor quay một vòng theo chiều kim đồng hồ
    • Stepper motor dừng 5 giây
    • Stepper motor quay ngược lại một vòng theo ngược chiều kim đồng hồ
    • Stepper motor dừng 5 giây
    • Quá trình trên được chạy lặp lại.
  • Xem kết quả trên Serial Monitor
COM6
Send
Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped Motor moving in clockwise direction Motor is stopped Motor moving in anticlockwise direction Motor is stopped
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Giải Thích Code

Đọc giải thích từng dòng trong các dòng comment của source code!

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.