instructable_tr... gửi vào
- 367533 lượt xem
Mình thấy trên cộng đồng đã có nhiều bài về điều khiển động cơ, như bài của bạn quocbao hay bạn Nguyễn Duy Tâm. Một bài thì nói về IC cầu H, một bài thì nói về Motor shield của Arduino. Tuy nhiên, dân độ xe thường lại không dùng 2 phương pháp đó, mà lại dùng module L298N. Hôm nay, mình rãnh rỗi, kiếm bài trên instructable thấy hay và trên Cộng đồng Arduino Việt Nam chưa có nên mình sẽ viết để giúp các bạn trẻ sau này dễ tiếp cận với module này hơn.
Module này là gì?
Như ở bài viết Mạch cầu H và điều khiển động cơ với SN754410 hay bài viết Làm dự án xe với module điều khiển động cơ L293D, các tác giả đã hướng dẫn bạn cách dùng ic, module cầu H để điều khiển động cơ DC. Và với module L298N cũng là một module thông dụng với chức năng thông dụng và giá thành cực kỳ rẻ là lựa chọn của các bạn học sinh, sinh viên.
Thông số kỹ thuật:
- Driver: L298N tích hợp hai mạch cầu H.
- Điện áp điều khiển: +5 V ~ +12 V
- Dòng tối đa cho mỗi cầu H là: 2A (=>2A cho mỗi motor)
- Điện áp của tín hiệu điều khiển: +5 V ~ +7 V
- Dòng của tín hiệu điều khiển: 0 ~ 36mA (Arduino có thể chơi đến 40mA nên khỏe re nhé các bạn)
- Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃)
- Nhiệt độ bảo quản: -25 ℃ ~ +130 ℃
Datasheet bạn có thể tải về tại đây.
L298 gồm các chân:
- 12V power, 5V power. Đây là 2 chân cấp nguồn trực tiếp đến động cơ.
- Bạn có thể cấp nguồn 9-12V ở 12V.
- Bên cạnh đó có jumper 5V, nếu bạn để như hình ở trên thì sẽ có nguồn 5V ra ở cổng 5V power, ngược lại thì không. Bạn để như hình thì ta chỉ cần cấp nguồn 12V vô ở 12V power là có 5V ở 5V power, từ đó cấp cho Arduino
- Power GND chân này là GND của nguồn cấp cho Động cơ.
- Nếu chơi Arduino thì nhớ nối với GND của Arduino
- 2 Jump A enable và B enable, để như hình, đừng rút ra bạn nhé!
- Gồm có 4 chân Input. IN1, IN2, IN3, IN4. Chức năng các chân này tôi sẽ giải thích ở bước sau.
- Output A: nối với động cơ A. bạn chú ý chân +, -. Nếu bạn nối ngược thì động cơ sẽ chạy ngược. Và chú ý nếu bạn nối động cơ bước, bạn phải đấu nối các pha cho phù hợp.
- Nói chung thì cứ thử sai mà sửa thôi haha.
Board này gồm 2 phần điều khiển động cơ. Và có thể điều khiển cho 1 động cơ bước 6 dây hoặc 4 dây.
Chuẩn bị phần cứng
- Arduino uno
- Cầu H L298
- Trục vít
- Dây cắm
- Động cơ DC (motor)
Nối mạch
Các bạn nối như hình nhé, click vào ảnh để có ảnh to hơn nhé
- Nếu bạn điều khiển 2 Động cơ của robot, bạn cần chú ý bài đấu nối Cực +,- của động cơ tương ứng với chân +,- của OUTPUT X.
- Tiếp bạn cấp nguồn cho Module L298 như phần giải thích ở trên. Chú ý chọn Jump cho đúng.
- Nếu bạn dùng 5V và động cơ dưới 1A bạn có thể dùng chân 5V của Arduino, nếu không nguồn cấp cho động cơ ở L298 phải là nguồn riêng để không làm hỏng Arduino của bạn.
- Các chân số D7, D6, D5 và D4 của Arduino sẽ nối tương ứng với IN1, IN2, IN3 và IN4 của L298.
- Chiều quay của động cơ được điều khiển bằng cách xuất các đầu ra HIGH hoặc LOW tại các chân INx.
- Ví dụ với Động Cơ A: Logic HIGH ở IN1 và IN2 Logic LOW sẽ làm động cơ quay 1 hướng nếu đặt Logic ngược lại sẽ làm động cơ quay theo hướng khác.
- Bạn cần phải nhớ, đây là làm động cơ chỉ quay hết công suất mà thôi. Nếu muốn thay đổi tốc độ của nó, bạn cần phải băm xung PWM bằng các chân có hỗ trợ PWM trên Arduino (những chân có dấu ~).
- Để hiêu rõ, bây giờ mình sẽ giúp các bạn tưởng tượng nhé:
- Tưởng tượng, chân IN1 là chân OutA.1, chân IN2 là chân OutA.2.
- Bạn cấp cực dương vào IN1, cực âm vào IN2 => motor quay một chiều (chiều 1).
- Bạn cấp cực âm vào IN1, cực dương vào IN2 => motor quay chiều còn lại (chiều 2)!
- Cực dương ở đây là điện thế 5V, cực âm ở đây là điện thế 0V. Hiện điện thế được tính là điện thế ở IN1 trừ hiệu điện thế IN2.
- Giả sử, hiệu điện thế 5V sẽ là mạnh nhất trong việc điều khiển động cơ. Như vậy, chỉ cần hạ hiệu điện thế xuống là động cơ sẽ bị yếu đi.
- Và nếu hiệu điện thế < 0 => động cơ sẽ đảo chiều!
- Hãy vận dụng các luật này để hiểu những dòng code của mình phía dưới nhé!
Code điều khiển động cơ
Mình chơi cũng dễ chịu thôi, các bạn xem nhé, mình sẽ comment trong các dòng code!
#define IN1 7 #define IN2 6 #define IN3 5 #define IN4 4 #define MAX_SPEED 255 //từ 0-255 #define MIN_SPEED 0 void setup() { pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void motor_1_Dung() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); } void motor_2_Dung() { digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); } void motor_1_Tien(int speed) { //speed: từ 0 - MAX_SPEED speed = constrain(speed, MIN_SPEED, MAX_SPEED);//đảm báo giá trị nằm trong một khoảng từ 0 - MAX_SPEED - http://arduino.vn/reference/constrain digitalWrite(IN1, HIGH);// chân này không có PWM analogWrite(IN2, 255 - speed); } void motor_1_Lui(int speed) { speed = constrain(speed, MIN_SPEED, MAX_SPEED);//đảm báo giá trị nằm trong một khoảng từ 0 - MAX_SPEED - http://arduino.vn/reference/constrain digitalWrite(IN1, LOW);// chân này không có PWM analogWrite(IN2, speed); } void motor_2_Tien(int speed) { //speed: từ 0 - MAX_SPEED speed = constrain(speed, MIN_SPEED, MAX_SPEED);//đảm báo giá trị nằm trong một khoảng từ 0 - MAX_SPEED - http://arduino.vn/reference/constrain analogWrite(IN3, speed); digitalWrite(IN4, LOW);// chân này không có PWM } void motor_2_Lui(int speed) { speed = constrain(speed, MIN_SPEED, MAX_SPEED);//đảm báo giá trị nằm trong một khoảng từ 0 - MAX_SPEED - http://arduino.vn/reference/constrain analogWrite(IN4, 255 - speed); digitalWrite(IN3, HIGH);// chân này không có PWM } void loop() { motor_1_Tien(MAX_SPEED); // motor 1 tiến delay(5000);//tiến 5 s motor_2_Lui(MAX_SPEED); //motor 2 lùi // motor 1 vẫn tiến delay(2000);//tiến 2 s motor_1_Dung(); motor_2_Dung(); delay(10000);//dừng 10s }
Lời kết
Chúc các bạn thành công!
Để lại comment để mình biết các bạn có làm được không nhé :D. Like và share giúp mình để mình có nhiều điểm cộng đồng nha !