Điều khiển động cơ bước với Arduino và cần điều khiển
Bài đăng này cho thấy cách điều khiển tốc độ động cơ bước và hướng quay bằng cách sử dụng board Arduino UNO và cần điều khiển PS2.
Động cơ bước được sử dụng trong ví dụ này là 28BYJ-48 (động cơ bước đơn cực) thường đi kèm với board điều khiển của nó.
Cần điều khiển (Cần điều khiển PS2) bao gồm hai biến trở 10k ohm (một cho trục X và một cho trục Y) và nút ấn.
Yêu cầu phần cứng:
- Board UNO
- Động cơ bước 28BYJ-48 (với board điều khiển ULN2003A)
- Cần điều khiển
- Nguồn điện 5V
- Breadboard
- Dây dẫn
Sơ đồ
Sơ đồ mạch dự án được hiển thị bên dưới (tất cả các đầu nối đất được nối với nhau).
và hình ảnh sau đây cho thấy mạch fritzing :
Động cơ bước được kết nối với board ULN2003A được cấp nguồn 5V ở ngoài. Các chân điều khiển (IN1, IN2, IN3 và IN4) của board này được nối với Arduino như sau:
- IN1 với chân Arduino 11
- IN2 tới chân Arduino 10
- IN3 đến chân Arduino 9
- IN4 đến chân Arduino 8
Board điều khiển có 5 chân: GND, + 5V, VRX, VRY và SW trong đó:
- GND và + 5V là các chân cấp nguồn
- VRX là đầu ra biến trở trục X
- VRY là đầu ra biến trở trục Y
- SW là điểm mút của nút ấn ( điểm mút còn lại được kết nối với GND).
Đầu ra của biến trở trục X (VRX) được nối với chân tương tự Arduino A0, đầu ra biến trở trục Y (VRY) cũng có thể được sử dụng. Chân chuyển đổi (SW) không được sử dụng trong ví dụ này.
Sử dụng biến trở trục X và trục Y, chúng ta có thể điều khiển hai động cơ bước độc lập.
Điều khiển động cơ bước với CODE Arduino và cần điều khiển:
Trong ví dụ này tôi đã sử dụng thư viện động cơ bước Arduino (tích hợp) để đơn giản hóa code, nó được thêm vào code bằng cách sử dụng dòng sau:
#include <Stepper.h>
Động cơ bước mà tôi đã sử dụng trong dự án này là 28BYJ-48, động cơ này được trang bị bộ giảm tốc 1/64. Động cơ bên trong có 32 bước trên một vòng quay, có nghĩa là trục ngoài có 2048 bước trên một vòng quay (64 x 32). Số bước được xác định trong code như dưới đây:
#define STEPS 32
và các chân điều khiển của động cơ bước được định nghĩa là:
// define stepper motor control châns #define IN1 11 #define IN2 10 #define IN3 9 #define IN4 8 // initialize stepper library Stepper stepper(STEPS, IN4, IN2, IN3, IN1);
Chân đầu ra biến trở trong cần điều khiển được nối với chân tương tự Arduino 0, được xác định trong code là:
// joystick pot output is connected to Arduino A0 #define joystick A0
Khi phím điều khiển được sử dụng, biến trở ở vị trí chính giữa và điện áp đầu ra của nó xấp xỉ 2,5V, đọc nó với Arduino sẽ cho giá trị số khoảng 511 (độ phân giải mô-đun Arduino UNO ADC là 10-bit).
Trong code tôi đã thực hiện 3 khoảng:
- Cái đầu tiên trong khoảng từ 500 đến 523: trong khoảng thời gian này, phím điều khiển không được sử dụng và động cơ bước không di chuyển chút nào (tất cả đầu ra đều là 0).
- Khoảng thứ hai khi giá trị số lớn hơn hoặc bằng 523 thì động cơ di chuyển theo hướng thứ nhất.
- Khoảng cuối cùng khi giá trị số nhỏ hơn hoặc bằng 500 thì động cơ di chuyển theo hướng khác.
Tốc độ của động cơ luôn nằm trong khoảng từ 5 đến 500 vòng / phút. Di chuyển cần điều khiển đến mức tối đa (cả hai hướng) làm cho động cơ di chuyển ở tốc độ tối đa.
CODE hoàn chỉnh:
// include Arduino stepper motor library #include <Stepper.h> // define number of steps per revolution #define STEPS 32 // define stepper motor control pins #define IN1 11 #define IN2 10 #define IN3 9 #define IN4 8 // initialize stepper library Stepper stepper(STEPS, IN4, IN2, IN3, IN1); // joystick pot output is connected to Arduino A0 #define joystick A0 void setup() { } void loop() { // read analog value from the potentiometer int val = analogRead(joystick); // if the joystic is in the middle ===> stop the motor if( (val > 500) && (val < 523) ) { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } else { // move the motor in the first direction while (val >= 523) { // map the speed between 5 and 500 rpm int speed_ = map(val, 523, 1023, 5, 500); // set motor speed stepper.setSpeed(speed_); // move the motor (1 step) stepper.step(1); val = analogRead(joystick); } // move the motor in the other direction while (val <= 500) { // map the speed between 5 and 500 rpm int speed_ = map(val, 500, 0, 5, 500); // set motor speed stepper.setSpeed(speed_); // move the motor (1 step) stepper.step(-1); val = analogRead(joystick); } } }
VIDEO DEMO: