Arduino Động cơ bước và công tắc giới hạn

Trong bài hướng dẫn Arduino này, chúng ta sẽ học cách sử dụng Arduino, công tắc giới hạn, driver L298N và động cơ bước. Cụ thể, chúng ta sẽ học:

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

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (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 Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
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 biết về động cơ bước và công tắc giới hạn (bố trí chân, cách chúng hoạt động, cách lập trình ...), hãy tìm hiểu về chúng trong các bài hướng dẫn sau đây:

Sơ đồ đấu dây

Hướng dẫn này cung cấp mã Arduino 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 động cơ bước và công tắc giới hạn
sơ đồ nối dây động cơ bước và công tắc giới hạn cho Arduino

This image is created using Fritzing. Click to enlarge image

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

This image is created using Fritzing. Click to enlarge image

※ Lưu ý:

Tùy thuộc vào động cơ bước, kết nối dây giữa động cơ bước và L298N có thể khác nhau. Vui lòng xem kỹ bài hướng dẫn này Arduino - Điều khiển động cơ bước bằng bộ driver L298N để xem cách kết nối động cơ bước với trình điều khiển động cơ L298N.

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

Có nhiều cách để làm cho động cơ bước dừng lại:

  • Gọi hàm stepper.stop(): Cách này KHÔNG làm cho động cơ bước dừng ngay lập tức mà từ từ dừng lại
  • Không gọi hàm stepper.run(): Cách này sẽ làm cho động cơ bước dừng ngay lập tức

Đoạn mã dưới đây làm cho động cơ bước quay vô hạn và dừng ngay lập tức khi chạm vào một công tắc giới hạn.

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-stepper-motor-and-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limitSwitch(A0); // create ezButton object that attach to pin A0; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); bool isStopped = false; void setup() { Serial.begin(9600); limitSwitch.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() { limitSwitch.loop(); // MUST call the loop() function first if (limitSwitch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); isStopped = true; } if (isStopped == 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 { // without calling stepper.run() function, motor stops immediately // NOTE: stepper.stop() function does NOT stops motor immediately Serial.println(F("The stepper motor is STOPPED")); } }

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

  • Kết nối Arduino với máy tính bằng cáp USB
  • Mở Arduino IDE, chọn board và cổng đúng
  • Đi tới biểu tượng Thư viện ở thanh bên trái của Arduino IDE.
  • Tìm kiếm “ezButton”, sau đó tìm thư viện nút từ ArduinoGetStarted.com
  • Nhấn nút Cài đặt để cài đặt thư viện ezButton.
thư viện nút nhấn cho Arduino
  • Tìm kiếm “AccelStepper”, sau đó tìm thư viện AccelStepper của Mike McCauley
  • Nhấn nút Cài đặt để cài đặt thư viện AccelStepper.
thư viện Arduino accelstepper
  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấp vào nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Nếu các dây được nối đúng, bạn sẽ thấy động cơ quay theo chiều kim đồng hồ
  • Chạm vào công tắc giới hạn
  • Bạn sẽ thấy động cơ dừng ngay lập tức
  • Kết quả trên Serial Monitor như dưới đâ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

Bạn có thể tìm thấy lời giải thích trong dòng chú thích của mã Arduino ở trên.

Mã Arduino - Thay đổi hướng của độ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 vô hạn và đổi hướng khi một công tắc giới hạn bị chạm.

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-stepper-motor-and-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 limitSwitch(A0); // create ezButton object that attach to pin A0; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); int direction = DIRECTION_CW; long targetPos = 0; void setup() { Serial.begin(9600); limitSwitch.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 targetPos = direction * MAX_POSITION; stepper.moveTo(targetPos); } void loop() { limitSwitch.loop(); // MUST call the loop() function first if (limitSwitch.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")); targetPos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(targetPos); } // 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(targetPos); // move the motor to maximum position again } stepper.run(); // MUST be called in loop() function }

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

  • Sao chép mã ở trên và mở với Arduino IDE
  • Nhấp vào nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Nếu cách nối dây đúng, bạn sẽ thấy động cơ quay theo hướng kim đồng hồ.
  • Chạm công tắc giới hạn
  • Bạn sẽ thấy hướng quay của động cơ bước đã bị đổi sang ngược chiều kim đồng hồ
  • Chạm lại công tắc giới hạn
  • Bạn sẽ thấy hướng quay của động cơ bước được đổi sang chiều kim đồng hồ
  • Kết quả trên Serial Monitor trông như sau:
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ã Arduino - Thay đổi hướng của độ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 vô hạn và đổi hướng khi một trong hai công tắc giới hạn bị chạm.

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino 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/arduino/arduino-stepper-motor-and-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 limitSwitch_1(A0); // create ezButton object that attach to pin A0; ezButton limitSwitch_2(A1); // create ezButton object that attach to pin A1; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); int stepperState = STATE_MOVE; int direction = DIRECTION_CW; long targetPos = 0; void setup() { Serial.begin(9600); limitSwitch_1.setDebounceTime(50); // set debounce time to 50 milliseconds limitSwitch_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() { limitSwitch_1.loop(); // MUST call the loop() function first limitSwitch_2.loop(); // MUST call the loop() function first if (limitSwitch_1.isPressed()) { stepperState = STATE_CHANGE_DIR; Serial.println(F("The limit switch 1: TOUCHED")); } if (limitSwitch_2.isPressed()) { stepperState = STATE_CHANGE_DIR; Serial.println(F("The limit switch 2: TOUCHED")); } switch (stepperState) { 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")); stepperState = STATE_MOVE; // after changing direction, go to the next state to move the motor break; case STATE_MOVE: targetPos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(targetPos); stepperState = 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(targetPos); // move the motor to maximum position again } break; } stepper.run(); // MUST be called in loop() function }

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

  • Sao chép mã ở phía trên và mở bằng Arduino IDE
  • Nhấn nút Tải lên trên Arduino IDE để tải mã lên Arduino
  • Nếu kết nối dây đúng, bạn sẽ thấy động cơ quay theo chiều kim đồng hồ.
  • Chạm vào công tắc giới hạn 1
  • Bạn sẽ thấy hướng quay của động cơ bước được đổi sang ngược chiều kim đồng hồ
  • Chạm vào công tắc giới hạn 2
  • Bạn sẽ thấy hướng quay của động cơ bước được đổi sang chiều kim đồng hồ
  • Kết quả trên Serial Monitor trông như bên dưới
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.