Điều khiển động cơ DC bằng Arduino
Trong Hướng dẫn Arduino này, chúng ta sẽ tìm hiểu cách điều khiển động cơ DC bằng Arduino. Chúng tôi cũng xem xét một số kỹ thuật cơ bản để điều khiển động cơ DC và đưa ra hai ví dụ thông qua đó chúng tôi sẽ tìm hiểu cách điều khiển động cơ DC bằng trình điều khiển L298N và board Arduino.
Điều khiển động cơ PWM DC
Chúng ta có thể điều khiển tốc độ của động cơ DC bằng cách điều khiển điện áp đầu vào của động cơ và phương pháp phổ biến nhất để làm điều đó là sử dụng tín hiệu PWM.
PWM hay thay đổi độ rộng xung là một kỹ thuật cho phép chúng ta điều chỉnh giá trị trung bình của điện áp đến thiết bị điện tử bằng cách bật và tắt nguồn với tốc độ nhanh. Điện áp trung bình phụ thuộc vào chu kỳ xung, hoặc lượng thời gian tín hiệu BẬT so với lượng thời gian tín hiệu TẮT trong một khoảng thời gian quy định.
Vì vậy: Tùy thuộc vào kích thước của động cơ, chúng ta có thể chỉ cần kết nối đầu ra Arduino với chân cua điện trở hoặc chân của MOSFET và điều khiển tốc độ của động cơ bằng cách điều khiển đầu ra PWM. Tín hiệu Arduino công suất thấp bật và tắt chân tại MOSFET thông qua đó động cơ công suất cao được điều khiển.
Sơ đồ mạch điều khiển động cơ Arduino PWM DC
Lưu ý: Arduino GND và nguồn cung cấp năng lượng động cơ GND nên được kết nối với nhau.
Điều khiển động cơ DC bằng mạch cầu H
Mặt khác, để điều khiển hướng quay, chúng ta chỉ cần đảo ngược hướng của dòng điện qua động cơ, và phương pháp phổ biến nhất để làm điều đó là sử dụng mạch cầu H. Một mạch cầu H chứa bốn chân chuyển mạch, điện trở hoặc MOSFET, với động cơ ở trung tâm tạo thành một cấu hình giống như chữ H. Bằng cách kích hoạt hai công tắc cụ thể cùng một lúc, chúng ta có thể thay đổi hướng của dòng điện, do đó thay đổi hướng quay của động cơ.
Vì vậy, nếu chúng ta kết hợp hai phương thức này, PWM và H-Bridge, chúng ta có thể kiểm soát hoàn toàn động cơ DC. Có nhiều trình điều khiển động cơ DC có các tính năng này và L298N là một trong số đó.
Chip L298N
L298N là trình điều khiển động cơ H-Bridge kép cho phép điều khiển tốc độ và hướng của hai động cơ DC cùng một lúc. Mô-đun có thể điều khiển động cơ DC có điện áp trong khoảng từ 5 đến 35V, với dòng điện cực đại lên đến 2A.
Trình điều khiển động cơ cầu đôi L298N
Chúng ta hãy xem xét kỹ hơn về sơ đồ chân của mô-đun L298N và giải thích cách thức hoạt động của nó. Mô-đun này có hai nhóm chân cho động cơ A và B, và một chân ở giữa cho chân Ground, VCC cho động cơ và chân 5V có thể là đầu vào hoặc đầu ra.
Điều này phụ thuộc vào điện áp được sử dụng tại động cơ VCC. Mô-đun này có bộ điều chỉnh 5V trên board được bật hoặc tắt bằng cách sử dụng dây nối. Nếu điện áp cung cấp động cơ lên đến 12V, chúng ta có thể kích hoạt bộ điều chỉnh 5V và chân 5V có thể được sử dụng làm đầu ra, ví dụ để cấp nguồn cho board Arduino của chúng ta. Nhưng nếu điện áp động cơ lớn hơn 12V, chúng ta phải ngắt kết nối dây vì những điện áp đó sẽ làm hỏng cho bộ điều chỉnh 5V trên board. Trong trường hợp này, chân 5V sẽ được sử dụng làm đầu vào vì chúng ta cần kết nối nó với nguồn điện 5V để IC hoạt động bình thường.
Chúng ta có thể lưu ý ở đây rằng IC này làm giảm điện áp khoảng 2V. Vì vậy, ví dụ, nếu chúng ta sử dụng nguồn điện 12V, điện áp tại các chân động cơ sẽ vào khoảng 10V, điều đó có nghĩa là chúng ta sẽ không thể cung cấp tốc độ tối đa ra khỏi động cơ DC.
Giảm điện áp L298N
Tiếp theo là các đầu vào điều khiển logic. Các chân Bật A và Bật B được sử dụng để bật và kiểm soát tốc độ của động cơ. Nếu một dây có mặt trên chân này, động cơ sẽ được kích hoạt và hoạt động ở tốc độ tối đa, và nếu chúng ta loại bỏ dây, chúng ta có thể kết nối một đầu vào PWM với chân này và theo cách đó kiểm soát tốc độ của động cơ. Nếu chúng ta kết nối chân này với Ground, động cơ sẽ bị vô hiệu hóa.
Sơ đồ khối L298N Lưu lượng hiện tại và Cách hoạt động
Tiếp theo, các chân Đầu vào 1 và Đầu vào 2 được sử dụng để điều khiển hướng quay của động cơ A và đầu vào 3 và 4 cho động cơ B. Sử dụng các chân này, chúng tôi thực sự điều khiển các công tắc của mạch cầu H bên trong IC L298N. Nếu đầu vào 1 ở mức THẤP và đầu vào 2 là CAO thì động cơ sẽ di chuyển về phía trước và ngược lại, nếu đầu vào 1 ở mức CAO và đầu vào 2 ở mức THẤP thì động cơ sẽ di chuyển lùi. Trong trường hợp cả hai đầu vào đều giống nhau, cùng THẤP hoặc CAO, động cơ sẽ dừng. Điều tương tự áp dụng cho đầu vào 3 và 4 và động cơ B.
Arduino và L298N
Bây giờ hãy làm một số ứng dụng thực tế. Trong ví dụ đầu tiên, chúng tôi sẽ điều khiển tốc độ của động cơ bằng biến trở và thay đổi hướng quay bằng nút ấn. Đây là sơ đồ mạch.
Sơ đồ mạch Arduino và L298N Điều khiển động cơ DC
Vì vậy: chúng ta cần một trình điều khiển L298N, động cơ DC, biến trở, nút ấn và board Arduino.
Các linh kiện cần thiết:
- Bộ điều khiển L298N
- Động cơ DC 12 V
- Board Arduino
- Breadboard và dây nối
Code Arduino
Đây là mã Arduino:
#define enA 9 #define in1 6 #define in2 7 #define button 4 int rotDirection = 0; int pressed = false; void setup() { pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(button, INPUT); // Set initial rotation direction digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } void loop() { int potValue = analogRead(A0); // Read potentiometer value int pwmOutput = map(potValue, 0, 1023, 0 , 255); // Map the potentiometer value from 0 to 255 analogWrite(enA, pwmOutput); // Send PWM signal to L298N Enable pin // Read button - Debounce if (digitalRead(button) == true) { pressed = !pressed; } while (digitalRead(button) == true); delay(20); // If button is pressed - change rotation direction if (pressed == true & rotDirection == 0) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); rotDirection = 1; delay(20); } // If button is pressed - change rotation direction if (pressed == false & rotDirection == 1) { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); rotDirection = 0; delay(20); } }
Mô tả: Vì vậy, trước tiên chúng ta cần xác định các chân và một số biến cần thiết cho chương trình. Trong phần thiết lập, chúng ta cần đặt các chế độ chân và hướng quay ban đầu của động cơ. Trong phần vòng lặp, chúng tôi bắt đầu bằng cách đọc giá trị biến trở và sau đó ánh xạ giá trị mà chúng tôi nhận được từ 0 đến 1023, giá trị từ 0 đến 255 cho tín hiệu PWM, hoặc đó là chu kỳ nhiệm vụ 0 đến 100% của Tín hiệu PWM. Sau đó, bằng cách sử dụng chức năng analogWrite (), chúng tôi gửi tín hiệu PWM đến chân Bật của board L298N, điều khiển động cơ.
Tiếp theo, chúng tôi kiểm tra xem chúng tôi đã nhấn nút chưa và nếu đã bật, chúng tôi sẽ thay đổi hướng quay của động cơ bằng cách đặt trạng thái Đầu vào 1 và Đầu vào 2 ngược lại. Nút ấn sẽ hoạt động như nút chuyển đổi và mỗi lần chúng ta nhấn nó, nó sẽ thay đổi hướng quay của động cơ.
Điều khiển xe Arduino bằng bộ điều khiển L298N
Vì vậy, một khi chúng ta đã biết được điều này, bây giờ chúng ta có thể chế tạo chiếc xe robot Arduino của riêng mình. Đây là sơ đồ mạch:
Điều khiển xe Arduino sử dụng sơ đồ mạch điều khiển L298N
Tất cả những gì chúng ta cần là 2 Motor DC, trình điều khiển L298N, board Arduino và cần điều khiển. Về nguồn điện, tôi chọn sử dụng ba pin Li-ion 3.7V, cung cấp tổng cộng 11V. Tôi đã làm cho khung xe bằng ván ép dày 3 mm, gắn các động cơ vào nó bằng khung kim loại, gắn bánh xe vào động cơ và phía trước gắn một bánh xe xoay.
Arduino Robot Car DIY Khung gầm
Bây giờ chúng ta hãy xem code Arduino và xem nó hoạt động như thế nào.
int xAxis = analogRead(A0); // Read Joysticks X-axis int yAxis = analogRead(A1); // Read Joysticks Y-axis
Sau khi xác định các chân, trong phần vòng lặp, chúng ta bắt đầu với việc đọc các giá trị trục X và Y của phím điều khiển. Cần điều khiển thực sự được làm bằng hai biến trở được kết nối với đầu vào analog của Arduino và chúng có giá trị từ 0 đến 1023. Khi cần điều khiển ở vị trí trung tâm, giá trị của cả hai biến trở hoặc trục là khoảng 512.
Điều khiển chuyển động xe Arduino
Chúng tôi sẽ thêm một chút dung sai và có giá trị từ 470 đến 550 là chính. Vì vậy, nếu chúng ta di chuyển trục Y của phím điều khiển lùi và giá trị xuống dưới 470, chúng ta sẽ đặt hướng quay của hai động cơ về phía sau bằng bốn chân đầu vào. Sau đó, chúng tôi sẽ chuyển đổi các giá trị giảm dần từ 470 thành 0 thành tăng giá trị PWM từ 0 đến 255, đây là tốc độ của động cơ.
// Y-axis used for forward and backward control if (yAxis < 470) { // Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); }
Tương tự, nếu chúng ta di chuyển trục Y của cần điều khiển về phía trước và giá trị vượt quá 550, chúng ta sẽ có các động cơ di chuyển về phía trước và chuyển đổi số đọc từ 550 sang 1023 thành giá trị PWM từ 0 đến 255. Nếu cần điều khiển ở giữa tốc độ động cơ sẽ bằng không.
Tiếp theo, hãy xem cách chúng tôi sử dụng trục X cho điều khiển bên trái và bên phải của xe.
// X-axis used for left and right control if (xAxis < 470) { // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value int xMapped = map(xAxis, 470, 0, 0, 255); // Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255 if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } }
Vì vậy, một lần nữa, trước tiên chúng ta cần chuyển đổi số đọc trục X thành giá trị tốc độ từ 0 đến 255. Để di chuyển sang trái, chúng tôi sử dụng giá trị này để giảm tốc độ động cơ bên trái và tăng tốc độ động cơ bên phải. Ở đây, do các hàm số học, chúng tôi sử dụng hai câu lệnh if để giới hạn phạm vi tốc độ động cơ từ 0 đến 255.
Arduino Robot Xe điều khiển trái và phải
Phương pháp tương tự được sử dụng để di chuyển xe sang phải.
Tùy thuộc vào điện áp ứng dụng và động cơ chính, ở tốc độ thấp hơn, động cơ không thể bắt đầu di chuyển và nó tạo ra âm thanh ù. Trong trường hợp của tôi, các động cơ không thể di chuyển nếu giá trị của tín hiệu PWM dưới 70. Do đó, sử dụng hai câu lệnh if này tôi đã giới hạn ở phạm vi tốc độ từ 70 đến 255. Cuối cùng, chúng tôi chỉ gửi tốc độ động cơ cuối cùng hoặc Tín hiệu PWM đến các chân cho phép của trình điều khiển L298N.
// Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; } analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
Đây là code hoàn chỉnh của ví dụ xe robot Arduino:
#define enA 9 #define in1 4 #define in2 5 #define enB 10 #define in3 6 #define in4 7 int motorSpeedA = 0; int motorSpeedB = 0; void setup() { pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); } void loop() { int xAxis = analogRead(A0); // Read Joysticks X-axis int yAxis = analogRead(A1); // Read Joysticks Y-axis // Y-axis used for forward and backward control if (yAxis < 470) { // Set Motor A backward digitalWrite(in1, HIGH); digitalWrite(in2, LOW); // Set Motor B backward digitalWrite(in3, HIGH); digitalWrite(in4, LOW); // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 470, 0, 0, 255); motorSpeedB = map(yAxis, 470, 0, 0, 255); } else if (yAxis > 550) { // Set Motor A forward digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // Set Motor B forward digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed motorSpeedA = map(yAxis, 550, 1023, 0, 255); motorSpeedB = map(yAxis, 550, 1023, 0, 255); } // If joystick stays in middle the motors are not moving else { motorSpeedA = 0; motorSpeedB = 0; } // X-axis used for left and right control if (xAxis < 470) { // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value int xMapped = map(xAxis, 470, 0, 0, 255); // Move to left - decrease left motor speed, increase right motor speed motorSpeedA = motorSpeedA - xMapped; motorSpeedB = motorSpeedB + xMapped; // Confine the range from 0 to 255 if (motorSpeedA < 0) { motorSpeedA = 0; } if (motorSpeedB > 255) { motorSpeedB = 255; } } if (xAxis > 550) { // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value int xMapped = map(xAxis, 550, 1023, 0, 255); // Move right - decrease right motor speed, increase left motor speed motorSpeedA = motorSpeedA + xMapped; motorSpeedB = motorSpeedB - xMapped; // Confine the range from 0 to 255 if (motorSpeedA > 255) { motorSpeedA = 255; } if (motorSpeedB < 0) { motorSpeedB = 0; } } // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70) if (motorSpeedA < 70) { motorSpeedA = 0; } if (motorSpeedB < 70) { motorSpeedB = 0; } analogWrite(enA, motorSpeedA); // Send PWM signal to motor A analogWrite(enB, motorSpeedB); // Send PWM signal to motor B }