Arduino Động cơ DC 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 để điều khiển động cơ DC bằng công tắc giới hạn và bộ điều khiển L298N. 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×5V DC Motor
1×5V Power Adapter for 5V DC motor
1×DC Power Jack
1×L298N Motor Driver Module
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ơ DC và công tắc giới hạn

Nếu bạn chưa biết về động cơ DC và công tắc giới hạn (bố trí chân, cách hoạt động, cách lập trình ...), hãy tìm hiểu chúng trong các bài hướng dẫn sau:

Sơ đồ đấu dây

Hướng dẫn này cung cấp các mã Arduino cho hai trường hợp: một động cơ DC + một công tắc giới hạn, một động cơ DC + hai công tắc giới hạn.

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

This image is created using Fritzing. Click to enlarge image

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

This image is created using Fritzing. Click to enlarge image

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

Đoạn mã dưới đây khiến động cơ DC quay liên tục và dừng ngay khi công tắc giới hạn được 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-dc-motor-limit-switch */ #include <ezButton.h> #define ENA_PIN 7 // The Arduino pin connected to the EN1 pin L298N #define IN1_PIN 6 // The Arduino pin connected to the IN1 pin L298N #define IN2_PIN 5 // The Arduino pin connected to the IN2 pin L298N ezButton limitSwitch(A1); // create ezButton object that attach to pin A1 void setup() { Serial.begin(9600); limitSwitch.setDebounceTime(50); // set debounce time to 50 milliseconds // initialize digital pins as outputs. pinMode(ENA_PIN, OUTPUT); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); digitalWrite(ENA_PIN, HIGH); // max speed digitalWrite(IN1_PIN, HIGH); // control motor A spins clockwise digitalWrite(IN2_PIN, LOW); // control motor A spins clockwise } void loop() { limitSwitch.loop(); // MUST call the loop() function first if (limitSwitch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); digitalWrite(IN1_PIN, LOW); // stop motor digitalWrite(IN2_PIN, LOW); // stop motor } }

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 do ArduinoGetStarted.com.
  • Nhấp vào nút Cài đặt để cài đặt thư viện ezButton.
thư viện nút Arduino
  • Sao chép mã ở trên và mở bằng Arduino IDE
  • Nhấn Tải lên nút trên Arduino IDE để tải mã lên Arduino
  • Nếu dây 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 trông như sau
COM6
Send
The limit switch: TOUCHED The DC motor is STOPPED The DC motor is STOPPED The DC motor is STOPPED The DC motor is STOPPED
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Giải thích mã nguồn

Bạn có thể tìm 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ơ DC bằng công tắc giới hạn

Đoạn mã dưới đây làm cho động cơ DC 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-dc-motor-limit-switch */ #include <ezButton.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 // constants won't change #define ENA_PIN 7 // The Arduino pin connected to the EN1 pin L298N #define IN1_PIN 6 // The Arduino pin connected to the IN1 pin L298N #define IN2_PIN 5 // The Arduino pin connected to the IN2 pin L298N ezButton limitSwitch(A1); // create ezButton object that attach to pin A1 int direction = DIRECTION_CW; void setup() { Serial.begin(9600); limitSwitch.setDebounceTime(50); // set debounce time to 50 milliseconds // initialize digital pins as outputs. pinMode(ENA_PIN, OUTPUT); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); digitalWrite(ENA_PIN, HIGH); // max speed digitalWrite(IN1_PIN, HIGH); // control motor A spins clockwise digitalWrite(IN2_PIN, LOW); // control motor A spins clockwise } 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")); digitalWrite(IN1_PIN, HIGH); // control motor A spins clockwise digitalWrite(IN2_PIN, LOW); // control motor A spins clockwise } else { Serial.println(F("ANTI-CLOCKWISE")); digitalWrite(IN1_PIN, LOW); // control motor A spins anti-clockwise digitalWrite(IN2_PIN, HIGH); // control motor A spins anti-clockwise } } }

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

  • Sao chép mã ở phía 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 nối dây đúng, bạn sẽ thấy động cơ quay theo chiều 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ơ DC được đổ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ơ DC được đổi sang chiều kim đồng hồ
  • Kết quả trên Serial Monitor trông như dưới đâ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ã Arduino - Đổi hướng động cơ DC bằng hai công tắc giới hạn

Đoạn mã dưới đây khiến một động cơ DC quay liên tục 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-dc-motor-limit-switch */ #include <ezButton.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 #define ENA_PIN 7 // The Arduino pin connected to the EN1 pin L298N #define IN1_PIN 6 // The Arduino pin connected to the IN1 pin L298N #define IN2_PIN 5 // The Arduino pin connected to the IN2 pin L298N ezButton limitSwitch_1(A0); // create ezButton object that attach to pin A0 ezButton limitSwitch_2(A1); // create ezButton object that attach to pin A1 int direction = DIRECTION_CW; int prev_direction = DIRECTION_CW; 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 // initialize digital pins as outputs. pinMode(ENA_PIN, OUTPUT); pinMode(IN1_PIN, OUTPUT); pinMode(IN2_PIN, OUTPUT); digitalWrite(ENA_PIN, HIGH); // max speed digitalWrite(IN1_PIN, HIGH); // control motor A spins clockwise digitalWrite(IN2_PIN, LOW); // control motor A spins clockwise } void loop() { limitSwitch_1.loop(); // MUST call the loop() function first limitSwitch_2.loop(); // MUST call the loop() function first if (limitSwitch_1.isPressed()) { direction *= -1; // change direction Serial.println(F("The limit switch 1: TOUCHED")); } if (limitSwitch_2.isPressed()) { direction *= -1; // change direction Serial.println(F("The limit switch 2: TOUCHED")); } if (prev_direction != direction) { Serial.print(F("The direction -> ")); if (direction == DIRECTION_CW) { Serial.println(F("CLOCKWISE")); digitalWrite(IN1_PIN, HIGH); // control motor A spins clockwise digitalWrite(IN2_PIN, LOW); // control motor A spins clockwise } else { Serial.println(F("ANTI-CLOCKWISE")); digitalWrite(IN1_PIN, LOW); // control motor A spins anti-clockwise digitalWrite(IN2_PIN, HIGH); // control motor A spins anti-clockwise } prev_direction = direction; } }

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

  • Sao chép mã ở 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 cho Arduino
  • Nếu mạch được mắc đú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 của động cơ DC được thay đổ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ơ DC được thay đổi sang chiều kim đồng hồ
  • Kết quả trên Serial Monitor trông như dưới đây
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.