ESP8266 Công tắc giới hạn động cơ bước

Hướng dẫn này sẽ chỉ cho bạn cách sử dụng ESP8266 để điều khiển động cơ bước thông qua một công tắc giới hạn và một driver L298N. Cụ thể, chúng ta sẽ đề cập đến:

Phần cứng cần chuẩn bị

1×ESP8266 NodeMCU ESP-12E
1×Recommended: ESP8266 NodeMCU ESP-12E (Uno-form)
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×Limit Switch (KW12-3)
1×Limit Switch (V-153-1C25)
1×Limit Switch (V-155-1C25)
1×Limit Switch (V-156-1C25)
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 ESP8266
1×(Khuyến nghị) Power Splitter for ESP8266 Type-C

Or you can buy the following kits:

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

Về Động cơ Bước và Công tắc Giới hạn

Nếu bạn chưa quen với động cơ bước và công tắc giới hạn (bao gồm sơ đồ chân, chức năng, lập trình, v.v.), những bài hướng dẫn dưới đây có thể cung cấp cho bạn thêm thông tin:

Sơ đồ đấu dây

Hướng dẫn này cung cấp sơ đồ đấu dây cho hai trường hợp: một động cơ bước và một công tắc giới hạn, một động cơ bước và hai công tắc giới hạn.

  • Sơ đồ nối dây giữa ESP8266, động cơ bước và một công tắc giới hạn.
sơ đồ nối dây ESP8266 NodeMCU cho động cơ bước và công tắc giới hạn

This image is created using Fritzing. Click to enlarge image

Xem thêm Sơ đồ chân ESP8266Cách cấp nguồn cho ESP8266.

  • Sơ đồ nối dây giữa ESP8266, động cơ bước và hai công tắc giới hạn.
sơ đồ nối dây ESP8266 NodeMCU cho động cơ bước và hai công tắc giới hạn

This image is created using Fritzing. Click to enlarge image

※ Lưu ý:

Việc kết nối dây giữa động cơ bước và L298N có thể khác nhau tùy thuộc vào loại động cơ bước. Do đó, điều quan trọng là xem bài hướng dẫn này ESP8266 - Động cơ bước để hiểu cách kết nối.

Mã ESP8266 - Dừng động cơ bước bằng công tắc giới hạn

Có nhiều phương pháp để dừng động cơ bước:

  • Gọi hàm stepper.stop(): Điều này sẽ không gây dừng đột ngột, mà là dừng dần
  • Bỏ qua việc gọi stepper.run(): Điều này sẽ dẫn đến việc dừng ngay tức thì của động cơ bước

Mã dưới đây sẽ khiến một động cơ bước quay liên tục cho đến khi công tắc giới hạn được kích hoạt, tại thời điểm đó nó sẽ dừng ngay lập tức.

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/esp8266/esp8266-stepper-motor-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limit_switch(D0); // create ezButton object that attach to the ESP8266 pin D0 AccelStepper stepper(AccelStepper::FULL4WIRE, D1, D2, D5, D6); bool is_stopped = false; void setup() { Serial.begin(9600); limit_switch.setDebounceTime(50); // set debounce time to 50 milliseconds stepper.setMaxSpeed(500.0); // set the maximum speed stepper.setAcceleration(50.0); // set acceleration stepper.setSpeed(100); // set initial speed stepper.setCurrentPosition(0); // set position stepper.moveTo(MAX_POSITION); } void loop() { limit_switch.loop(); // MUST call the loop() function first if (limit_switch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); is_stopped = true; } if (is_stopped == false) { // without this part, the move will stop after reaching maximum position if (stepper.distanceToGo() == 0) { // if motor moved to the maximum position stepper.setCurrentPosition(0); // reset position to 0 stepper.moveTo(MAX_POSITION); // move the motor to maximum position again } stepper.run(); // MUST be called in loop() function } else { // If the stepper.run() function is not invoked, the motor stops immediately // NOTE: invoking the stepper.stop() does NOT stop the motor immediately. Serial.println(F("The stepper motor is STOPPED")); } }

Hướng dẫn từng bước

Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:

  • Xem hướng dẫn ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn dùng ESP8266.
  • Nối các thành phần như được hiển thị trong sơ đồ.
  • Nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 phù hợp, ví dụ NodeMCU 1.0 (ESP-12E Module), và cổng COM tương ứng.
  • Kết nối cáp USB với ESP8266 và máy tính.
  • Mở Arduino IDE, chọn bo mạch và cổng phù hợp.
  • Nhấp vào biểu tượng Libraries ở thanh bên trái của Arduino IDE.
  • Tìm kiếm “ezButton”, sau đó xác định thư viện nút do ArduinoGetStarted.com cung cấp.
  • Nhấn nút Install để cài đặt thư viện ezButton.
thư viện nút nhấn ESP8266 NodeMCU
  • Tra cứu “AccelStepper” và tìm thấy thư viện AccelStepper do Mike McCauley tạo.
  • Nhấn nút Cài đặt để thêm thư viện AccelStepper.
thư viện accelstepper cho ESP8266 NodeMCU
  • Sao chép mã và mở nó bằng Arduino IDE.
  • Nhấp vào nút Tải lên để chuyển mã tới ESP8266.
  • Nếu việc đấu dây được thực hiện đúng, động cơ sẽ quay theo hướng kim đồng hồ.
  • Nhấn công tắc giới hạn và động cơ sẽ dừng lại ngay lập tức.
  • Kết quả xuất hiện trên Serial Monitor nên trông như thế này.
COM6
Send
The limit switch: TOUCHED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Giải thích mã nguồn

Hãy xem giải thích theo từng dòng được chứa trong các bình luận của mã nguồn!

Mã ESP8266 - Thay đổi hướng động cơ bước bằng công tắc giới hạn

Đoạn mã dưới đây khiến động cơ bước quay liên tục, và nó sẽ đổi hướng khi công tắc giới hạn được chạm.

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/esp8266/esp8266-stepper-motor-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limit_switch(D0); // create ezButton object that attach to the ESP8266 pin D0 AccelStepper stepper(AccelStepper::FULL4WIRE, D1, D2, D5, D6); int direction = DIRECTION_CW; long target_pos = 0; void setup() { Serial.begin(9600); limit_switch.setDebounceTime(50); // set debounce time to 50 milliseconds stepper.setMaxSpeed(500.0); // set the maximum speed stepper.setAcceleration(50.0); // set acceleration stepper.setSpeed(100); // set initial speed stepper.setCurrentPosition(0); // set position target_pos = direction * MAX_POSITION; stepper.moveTo(target_pos); } void loop() { limit_switch.loop(); // MUST call the loop() function first if (limit_switch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); direction *= -1; // change direction Serial.print(F("The direction -> ")); if (direction == DIRECTION_CW) Serial.println(F("CLOCKWISE")); else Serial.println(F("ANTI-CLOCKWISE")); target_pos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(target_pos); } // without this part, the move will stop after reaching maximum position if (stepper.distanceToGo() == 0) { // if motor moved to the maximum position stepper.setCurrentPosition(0); // reset position to 0 stepper.moveTo(target_pos); // move the motor to maximum position again } stepper.run(); // MUST be called in loop() function }

Hướng dẫn từng bước

Để bắt đầu với ESP8266 trên Arduino IDE, hãy làm theo các bước sau:

  • Xem hướng dẫn ESP8266 - Cài đặt phần mềm nếu đây là lần đầu bạn sử dụng ESP8266.
  • Nối các thành phần như được hiển thị trong sơ đồ.
  • Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn board ESP8266 phù hợp, ví dụ (NodeMCU 1.0 (ESP-12E Module)), và cổng COM tương ứng của nó.
  • Sao chép đoạn mã và mở nó bằng Arduino IDE.
  • Nhấp vào nút Tải lên để gửi mã tới ESP8266.
  • Nếu việc đấu dây đúng, động cơ sẽ quay theo chiều kim đồng hồ.
  • Khi chạm vào công tắc giới hạn, quay của động cơ bước sẽ bị đảo ngược sang chiều ngược kim đồng hồ.
  • Chạm lại công tắc giới hạn sẽ khiến động cơ bước quay theo chiều kim đồng hồ một lần nữa.
  • Đầu ra trên Serial Monitor nên trông như thế này.
COM6
Send
The limit switch: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch: TOUCHED The direction -> CLOCKWISE
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Mã ESP8266 - Thay đổi hướng động cơ bước bằng hai công tắc giới hạn

Đoạn mã dưới đây khiến động cơ bước quay liên tục, và nó sẽ đổi hướng khi bất kỳ một trong hai công tắc giới hạn bị chạm.

/* * Mã ESP8266 NodeMCU này được phát triển bởi newbiely.vn * Mã ESP8266 NodeMCU 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/esp8266/esp8266-stepper-motor-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 #define STATE_CHANGE_DIR 1 #define STATE_MOVE 2 #define STATE_MOVING 3 #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limit_switch_1(D0); // create ezButton object that attach to the ESP8266 pin D0 ezButton limit_switch_2(D8); // create ezButton object that attach to the ESP8266 pin D8 AccelStepper stepper(AccelStepper::FULL4WIRE, D1, D2, D5, D6); int stepper_state = STATE_MOVE; int direction = DIRECTION_CW; long target_pos = 0; void setup() { Serial.begin(9600); limit_switch_1.setDebounceTime(50); // set debounce time to 50 milliseconds limit_switch_2.setDebounceTime(50); // set debounce time to 50 milliseconds stepper.setMaxSpeed(500.0); // set the maximum speed stepper.setAcceleration(50.0); // set acceleration stepper.setSpeed(100); // set initial speed stepper.setCurrentPosition(0); // set position } void loop() { limit_switch_1.loop(); // MUST call the loop() function first limit_switch_2.loop(); // MUST call the loop() function first if (limit_switch_1.isPressed()) { stepper_state = STATE_CHANGE_DIR; Serial.println(F("The limit switch 1: TOUCHED")); } if (limit_switch_2.isPressed()) { stepper_state = STATE_CHANGE_DIR; Serial.println(F("The limit switch 2: TOUCHED")); } switch (stepper_state) { case STATE_CHANGE_DIR: direction *= -1; // change direction Serial.print(F("The direction -> ")); if (direction == DIRECTION_CW) Serial.println(F("CLOCKWISE")); else Serial.println(F("ANTI-CLOCKWISE")); stepper_state = STATE_MOVE; // after changing direction, go to the next state to move the motor break; case STATE_MOVE: target_pos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(target_pos); stepper_state = STATE_MOVING; // after moving, go to the next state to keep the motor moving infinity break; case STATE_MOVING: // without this state, the move will stop after reaching maximum position if (stepper.distanceToGo() == 0) { // if motor moved to the maximum position stepper.setCurrentPosition(0); // reset position to 0 stepper.moveTo(target_pos); // move the motor to maximum position again } break; } stepper.run(); // MUST be called in loop() function }

Hướng dẫn từng bước

  • Nối dây các thành phần như được chỉ ra trên sơ đồ.
  • Kết nối bo mạch ESP8266 với máy tính bằng cáp USB.
  • Mở Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch ESP8266 phù hợp, ví dụ như NodeMCU 1.0 (ESP-12E Module), và cổng COM tương ứng.
  • Sao chép mã và mở nó bằng Arduino IDE.
  • Nhấp vào nút Tải lên trong IDE để tải mã lên ESP8266.
  • Nếu các kết nối đúng, động cơ sẽ quay theo chiều kim đồng hồ.
  • Khi chạm công tắc giới hạn 1, hướng quay của động cơ bước nên đổi sang ngược chiều kim đồng hồ.
  • Chạm công tắc giới hạn 2 sẽ khiến động cơ quay ngược lại, lần này sang chiều kim đồng hồ.
  • Kết quả hiển thị trên Serial Monitor sẽ trông như sau.
COM6
Send
The limit switch 1: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch 2: TOUCHED The direction -> CLOCKWISE
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

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.