Điều khiển động cơ DC với ESP32 và trình điều khiển động cơ L298N
Trong tài liệu hướng dẫn này mình sẽ hướng dẫn bạn cách điều khiển động cơ DC thông qua mạch lập trình ESP32 và Motor Driver L298N nhé! Trước tiên mình sẽ giải thích chi tiết về tình khái niệm rồi đi vào nội dung hướng dẫn sau nhé.
Tuy nhiên bạn cần lưu ý rằng có khá nhiều cách để điều khiển động cơ DC. Nhưng trong bài này, mình sẽ sử dụng L298N.
Chuẩn bị
- ESP32
- Động cơ DC
- Motor Driver L298N
- Pin
- Dây Jumper
Giới thiệu về Motor Driver L298N
Motor Driver L298N là gì?
Motor Driver L298N là lựa chọn phù hợp khi trong điều kiện các động cơ có mức điện áp từ 6 v đến 12 V. Mình sử dụng Motor Driver L298N để xử lý dòng điện có cường độ lên tới 3A.
Đặc điểm mà mình thích ở L298N là chúng hỗ trợ điều khiển hai động cơ DC đồng thời, phù hợp để làm các ứng dụng về robot.
Sơ đồ chân của Motor Driver L298N
Dưới đây là sơ đồ chân cắm của Motor Driver L298N:
Chúng ta có thể điều khiển động cơ a và b thông qua hai khối ở hai bên của motor:
- Output 1: Cực + của động cơ A
- Output 2: Cực – của động cơ A
- Output 3: Cực + của động cơ B
- Output 4: Cực – của động cơ B
Chân 12 V được dùng để cấp nguồn cho động cơ, chân 5 V dùng để cấp nguồn cho chip Motor Driver L298N. Tuy nhiên nếu bạn sử dụng dây Jumper thì Motor Driver L298N sẽ được cấp nguồn dựa trên nguồn điện của động cơ.
Lưu ý: Nếu bạn cấp điện áp lớn hơn mức 12V, bạn cần tháo dây Jumper và cấp 5 V cho cực +5V.
Mặc dù chân này ghi chú là 12V, nhưng khi sử dụng theo hướng dẫn dưới đây với dây nối Jumper, bạn có thể cấp bất kỳ điện áp nào trong mức từ 6 đến 12 V, ví dụ như sử dụng 4 pin AA 1,5V, với tổng điện áp khoảng 6V.
Nói tóm lại:
- Chân +12V: Nơi kết nối nguồn điện
- GND: GND nguồn điện
- Chân +5V: Cung cấp 5V nếu không dùng Jumper. Chúng hoạt động như một đầu ra 5V nếu có dùng Jumper.
- Jumper sẽ dùng nguồn điện của động cơ DC để cấp nguồn cho chip. Nếu không dùng Jumper, bạn cần cấp điện áp 5V cho cực +5V. Còn nếu bạn cung cấp điện áp lớn hơn 12V, bạn không nên dùng dây Jumper.
Trong hình trên, bạn có thể thấy 4 chân đầu vào (từ input 1 đến input 4) và 2 chân kích hoạt đầu cuối. Các chân đầu vào dùng để điều khiển động cơ DC về hướng, còn chân kích hoạt được dùng để điều khiển tốc độ của động cơ:
- Input 1: Đầu vào 1 cho động cơ A
- Input 2: Đầu vào 2 cho động cơ A
- Input 3: Đầu vào 1 cho động cơ B
- Input 4: Đầu vào 2 cho động cơ B
- Enable 1: Enable pin cho động cơ A
- Enable 2: Enable pin cho động cơ B
Bình thường theo mặc định thì sẽ có dây Jumper tại các chân Enable này. Bạn cần tháo các dây Jumper để điều khiển tốc độ của động cơ DC.
Cách điều khiển động cơ DC bằng L298N
Dưới đây mình sẽ hướng dẫn chi tiết cách điều khiển động cơ dc bằng L298N:
Chân kích hoạt Enable
Các chân kích hoạt Enable có vai trò giống như công tắc on off cho động cơ, ví dụ:
- Khi bạn gửi tín hiệu HIGH tới Enable pin 1 => Động cơ A sẽ bật và chạy với tốc độ tối đa
- Khi bạn gửi tín hiệu LOW tới Enable pin 1 => Động cơ A sẽ tắt
- Khi bạn gửi tín hiệu xung PWM, bạn có thể điều khiển tốc độ của động cơ DC. Tốc độ này tỷ lệ thuận với chu kỳ. Tuy nhiên, bạn cần lưu ý không chọn chu kỳ quá nhỏ, vì lúc đó động cơ không đủ lực để quay và chúng sẽ phát ra âm thanh vo ve chứ không quay bánh.
Chân đầu vào Input
Các chân đầu vào giúp điều khiển hướng quay của động cơ DC, giúp động cơ đi tới hoặc đi lùi. Có 4 chân đầu vào, trong đó chân 1 và 2 điều khiển động cơ A, còn chân 3 và 4 điều khiển động cơ B:
- Để động cơ A đi tới: Gửi tín hiệu LOW cho đầu vào 1 và HIGH cho đầu vào 2
- Để động cơ A đi lùi: Gửi tín hiệu HIGH cho đầu vào 1 và LOW cho đầu vào 2
Với động cơ B thì bạn thực hiện tương tự, chỉ là thay đổi chân đầu vào từ 1,2 thành chân 3,4.
Cách điều khiển 2 động cơ DC cho các dự án Robot
Nếu bạn cần làm robot và muốn điều khiển hai động cơ DC đồng thời, thì các động cơ này có thể cần phải quay những hướng và tốc độ khác nhau, để robot đi tới, đi lùi, rẽ trái hoặc rẽ phải.
Ví dụ, để robot đi tới thì bạn cần điều khiển 2 động cơ đi tới cùng tốc độ. Nếu muốn robot rẽ trái, bạn cần 2 động cơ đi tới nhưng động cơ bên phải quay nhanh hơn bên trái, hoặc là ngừng quay động cơ trái và quay động cơ phải đi tới.
Dưới đây mình đã tổng hợp cách điều khiển động cơ DC cho robot, bạn tham khảo:
Phương hướng | Input 1 | Input 2 | Input 3 | Input 4 |
Đi tới | 0 | 1 | 0 | 1 |
Đi lùi | 1 | 0 | 1 | 0 |
Rẽ phải | 0 | 1 | 0 | 0 |
Rẽ trái | 0 | 0 | 0 | 1 |
Dừng | 0 | 0 | 0 | 0 |
Điều khiển động cơ DC bằng ESP32 – Tốc độ và hướng
Kết nối
Chúng ta kết nối động cơ DC vào chân đầu ra A (Enable A, Input 1, Input 2) trên Motor Driver:
Động cơ DC cần có dòng điện đủ mạnh để di chuyển, nên chúng ta cần cấp nguồn điện bên ngoài ESP32. Trong bài hướng dẫn này, IoTZone sử dụng 4 viên pin AA, nhưng bạn có thể sử dụng bất kỳ nguồn điện nào khác có mức điện áp phù hợp, ở mức 6V – 12V.
Nếu thích thì bạn có thể sử dụng công tắc, để việc cấp và tắt nguồn điện dễ dàng hơn. Lúc đó, bạn không cần phải ngắt kết nối dây ra rồi cắm lại liên tục như mình để tiết kiệm điện :D.
Dưới đây, cùng xem qua phần mềm lập trình điều khiển động cơ DC: Arduino IDE nhé!
Phần mềm điều khiển động cơ DC – Arduino IDE
IoTZone đã có sẵn 1 bài hướng dẫn chi tiết về cách cài phần mềm Arduino IDE, bạn tham khảo bên dưới và làm theo nhé: Cách lập trình ESP32 bằng Arduino IDE (Windows, Linux, Mac OS X)
Sau khi đã cài xong tiện ích ESP32 trong Arduino IDE, bạn làm theo hướng dẫn bên dưới để nạp chương trình và demo.
Nạp chương trình
Mình đã viết sẵn 1 đoạn code nhỏ để điều khiển động cơ DC, cả về tốc độ và hướng. Đây chỉ là 1 đoạn code nhỏ để bạn hiểu về cách kiểm soát tốc độ và hướng của động cơ DC, còn khi điều khiển động cơ thực tế thì bạn cần tinh chỉnh tốc độ, hướng,… sao cho phù hợp nhé:
// Motor A int motor1Pin1 = 27; int motor1Pin2 = 26; int enable1Pin = 14; // Setting PWM properties const int freq = 30000; const int pwmChannel = 0; const int resolution = 8; int dutyCycle = 200; void setup() { // sets the pins as outputs: pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(enable1Pin, OUTPUT); // configure LED PWM functionalitites ledcSetup(pwmChannel, freq, resolution); // attach the channel to the GPIO to be controlled ledcAttachPin(enable1Pin, pwmChannel); Serial.begin(115200); // testing Serial.print("Testing DC Motor..."); } void loop() { // Move the DC motor forward at maximum speed Serial.println("Moving Forward"); digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, HIGH); delay(2000); // Stop the DC motor Serial.println("Motor stopped"); digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); delay(1000); // Move DC motor backwards at maximum speed Serial.println("Moving Backwards"); digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); delay(2000); // Stop the DC motor Serial.println("Motor stopped"); digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); delay(1000); // Move DC motor forward with increasing speed digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); while (dutyCycle <= 255){ ledcWrite(pwmChannel, dutyCycle); Serial.print("Forward with duty cycle: "); Serial.println(dutyCycle); dutyCycle = dutyCycle + 5; delay(500); } dutyCycle = 200; } 1
Bạn hãy nạp code trên vào mạch ESP32 để điều khiển động cơ DC nhé, và đừng quên chọn đúng bo mạch và cổng COM.
Dưới đây IoTZone sẽ giải thích chi tiết về đoạn code cho bạn:
Giải thích chương trình điều khiển động cơ DC
Khai báo
Khai báo chân động cơ
Mình kết nối chân động cơ như sau: input 1 với GPIO 27, input 2 với GPIO 26 và chân bật/tắt với GPIO 14:
int motor1Pin1 = 27; int motor1Pin2 = 26; int enable1Pin = 14;
Điều khiển tốc độ động cơ DC bằng tín hiệu PWM
Tốc độ điều khiển động cơ DC sẽ tỷ lệ thuận với chu kỳ làm việc. Đầu tiên, bạn cần đặt thuộc tính cho PWM:
const int freq = 30000; const int pwmChannel = 0; const int resolution = 8; int dutyCycle = 200;
Như đoạn code trên, mình đang dùng tín hiệu 30000Hx ở kênh PWM 0, độ phân giải 8 bit. Mình lựa chọn chu kỳ làm việc là 200, bạn có thể chọn bất kỳ giá trị chu kỳ nào từ 0 đến 255.
Với mức tần số 30000 này, nếu bạn chọn chu kỳ nhỏ hơn 200 thì động cơ DC sẽ không đủ lực quay. Đó là lý do tại sao mình chọn chu kỳ 200 ngay từ ban đầu để điều khiển động cơ DC.
Lưu ý: Ở các mức tần số khác thì động cơ DC hoạt động vẫn rất tốt, ở đây mình chỉ ví dụ một mức tần số nhất định.
Setup()
Cấu hình chân động cơ thành Output:
pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(enable1Pin, OUTPUT);
Cấu hình tín hiệu PWM bằng các thuộc tính đã chọn trước đó để điều khiển động cơ DC:
ledcSetup(pwmChannel, freq, resolution);
Chọn GPIO để nhận tín hiệu bằng hàm ledcAttachPin(). Ví dụ, mình đang dùng GPIO enable1Pin tương ứng với GPIO 14, và kênh tạo tín hiệu là PWMChannel tương ứng với kênh 0:
ledcAttachPin(enable1Pin, pwmChannel);
Điều khiển động cơ DC theo các hướng
Điều khiển động cơ DC đi tới
loop() là nơi điều khiển động cơ DC di chuyển, bây giờ mình sẽ cho động cơ đi tới nhé. Để làm được điều đó, bạn cấu hình input 1 thành LOW và input 2 thành HIGH.
Dưới đây, mình đang điều khiển động cơ DC di chuyển về phía trước trong 2 giây (2000 milli giây):
// Move the DC motor forward at maximum speed Serial.println("Moving Forward"); digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, HIGH); delay(2000);
Điều khiển động cơ DC đi lùi
Chúng ta thực hiện tương tự, nhưng đổi input 1 thành HIGH và input 2 thành LOW:
// Move DC motor backwards at maximum speed Serial.println("Moving Backwards"); digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); delay(2000);
Dừng động cơ
Bạn có thể lựa chọn đặt chân kích hoạt ở mức LOW, hoặc cấu hình cả input 1 và 2 thành LOW.
Dưới đây, IoTZone cấu hình input 1 và 2 ở mức LOW:
// Stop the DC motor Serial.println("Motor stopped"); digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); delay(1000);
Điều khiển động cơ DC – Tốc độ
Như đã trình bày, để điều khiển tốc độ động cơ DC, bạn cần thay đổi chu kỳ hoạt động. Để làm được điều đó, bạn sử dụng câu lệnh sau, với thông tin là kênh PWM đang tạo tín hiệu và chu kỳ:
ledcWrite(pwmChannel, dutyCycle);
Như ví dụ bên dưới, mình đang tăng chu kỳ nhiệm vụ lên 5 trong mỗi vòng lặp While:
// Move DC motor forward with increasing speed digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); while (dutyCycle <= 255){ ledcWrite(pwmChannel, dutyCycle); Serial.print("Forward with duty cycle: "); Serial.println(dutyCycle); dutyCycle = dutyCycle + 5; delay(500); }
Khi điều kiện While không đúng (không diễn ra nữa), chúng ta sẽ cài đặt chu kỳ lại thành 200:
dutyCycle = 200;
Bây giờ, bạn hãy nạp code vào mạch ESP32 của mình và xem demo cách điều khiển động cơ DC nhé!
>> Xem thêm: ESP32 điều khiển Relay qua Web Server – Điều khiển thiết bị AC
Lời kết
Trong hướng dẫn trên, mình đã hướng dẫn bạn chi tiết về cách điều khiển động cơ DC, cả về tốc độ và hướng. Nói ngắn gọn, chúng ta cần cấu hình việc gửi tín hiệu HIGH và LOW cho các input sao cho phù hợp, để điều khiển động cơ theo ý muốn. Chúc các bạn thành công.