Bài 7: Điều khiển động cơ DC bằng Driver L298N và 2 nút nhấn. Ứng dụng làm mô hình kéo màn cửa lên xuống có sử dụng công tắc hành trình bằng Arduino Uno R3

 Bài trước: Cách sử dụng L298N

Trong bài này tôi sẽ giới thiệu với các bạn cách điều khiển động cơ DC theo hai chiều lên xuống bằng 2 nút nhấn, một nút lên và một nút xuống. Nó rất hữu ích cho các bạn mới bắt đầu làm quen với L298N. Với việc điều khiển động cơ theo hai hướng có thể áp dụng rất nhiều vào các dự án thực tế như: kéo màn cửa, sào phơi quần áo,...

Để bắt đầu chúng ta cần chuẩn bị phần cứng và lập trình  cho mô hình nút nhấn đơn giản (nhấn lên động cơ chạy lên, nhấn xuống động cơ chạy xuống) như sau:

1. Chuẩn bị phần cứng: 

  • Arduino Uno R3

  • Driver L298N 
  • Động cơ 

  • Nút nhấn: 

  • Dây cắm.
2. Sơ đồ mạch:


3. Code: 

int in1=9;
int in2=10;
int in3=11;
int in4=12;
int nutnhanlen=6;
int nutnhanxuong=7;
void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(nutnhanlen, INPUT_PULLUP);
  pinMode(nutnhanxuong, INPUT_PULLUP);

}

void loop() {
  
    int trangthainutlen=digitalRead(nutnhanlen);
    int trangthainutxuong=digitalRead(nutnhanxuong);

    if(trangthainutlen==0 && trangthainutxuong!=0){
        len();
      }
     else if (trangthainutlen!=0 && trangthainutxuong==0)
     { xuong();}
     else {dung();}
}
void len(){
  analogWrite(in1,150);
  digitalWrite(in2,LOW);
  analogWrite(in3,150);
  digitalWrite(in4,LOW);
  }
 void xuong(){
  digitalWrite(in1,LOW);
  digitalWrite(in2,HIGH);
  digitalWrite(in3,LOW);
  digitalWrite(in4,HIGH);
  }
 void dung(){
  digitalWrite(in1,LOW);
  digitalWrite(in2,LOW);
  digitalWrite(in3,LOW);
  digitalWrite(in4,LOW);
  }


Giải thích code:
  • Nút nhấn lên và nút nhấn xuống nối với chân 6 và 7 của Arduino, khai báo pinMode là INPUT_PULLUP để kéo điện trở trong chân Arduino, giá trị nút nhân khi nhấn là 0 ngược lại là 1.
  • Hai biến trangthainutlen và trangthainutxuong để đọc giá trị khi nào nút nhấn được nhấn (Khi nhấn giá trị là 0).
  • Nếu nút lên được nhấn (0) và nút xuống không nhấn (1). Gọi hàm len() để động cơ quay lên. Ngược lại nếu nút xuống nhấn và nút lên không nhấn thì động cơ quay xuống, ngược lại nếu không nhấn hoặc nhấn cả 2 động cơ sẽ dừng.

    Nhược điểm của mô hình trên là khi nhấn nút quá lâu động cơ sẽ chạy hết hành trình gây ra hư màn hoặc hư động cơ. Do đó trong phần tiếp theo tôi sẽ giới thiệu với các bạn mô hình như trên nhưng có kết hợp công tắc hành trình. Với công tắc hành trình khi động cơ quay lên hoặc xuống hết hành trình sẽ tự ngắt dù cho có nhấn nút nên rất an toàn.

1. Chế công tắc hành trình.

Trên thị trường có nhiều loại công tắc hành trình tuy nhiên chúng ta có thể tự chế công tắc hành trình đơn giản như sau:


  • Công tắc hành trình bao gồm 1 điện trở, một đầu nối với dây màu đỏ (Để nối với trục dương). Một đầu nối với dây màu đen (Để nối với trục âm), và dây màu xanh lá dùng để nối với chân digital của Arduino.
  • Hệ thống màn kéo gồm 2 công tắc tự chế ở giới hạn trên và giới hạn dưới. Đầu dương nối với tấm dẫn điện cố định ở giới hạn trên và giới hạn dưới. Trục giữa chạy lên xuống (Do động  cơ kéo) nối với cực dương, Đầu âm nối với GND của Arduino.
  • Khi trục lên xuống chạm vào công 1 trong 2 tấm dẫn điện mạch sẽ đóng và có tín hiệu tự dây màu xanh vào chân Arduino, lúc này chân Arduino nối với công tắc hành trình sẽ nhận tín hiệu ở mức cao (1), lúc này sẽ dừng động cơ bất chấp có nhấn nút hay không.
  • Các bạn có thể xem sơ đồ đầy đủ như sau:

2. Code:
int in1=9;
int in2=10;
int in3=11;
int in4=12;
int nutnhanlen=6;
int nutnhanxuong=7;
int ctht1=4;
int ctht2=5;
//int cbmua=3;
void setup() {
  Serial.begin(9600);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(nutnhanlen, INPUT_PULLUP);
  pinMode(nutnhanxuong, INPUT_PULLUP);
  pinMode(ctht1,INPUT);
  pinMode(ctht2,INPUT);
 // pinMode(cbmua,INPUT);
}

void loop() {
  
    int trangthainutxuong=digitalRead(nutnhanxuong);
    int trangthainutlen=digitalRead(nutnhanlen);
    int trangthaict1=digitalRead(ctht1);
    int trangthaict2=digitalRead(ctht2);
    //int thchandigital=digitalRead(cbmua);
    Serial.print(trangthaict1);
    Serial.println(trangthaict2);
    if(trangthainutxuong!=0 && trangthainutlen==0 && trangthaict1==0){
        len();
      }
     else if (trangthainutxuong==0 && trangthainutlen!=0 && trangthaict2==0
     )
     { xuong();}
     else {dung();}
    
}
void len(){
  analogWrite(in1,150);
  digitalWrite(in2,LOW);
  analogWrite(in3,150);
  digitalWrite(in4,LOW);
  }
 void xuong(){
  digitalWrite(in1,LOW);
  digitalWrite(in2,HIGH);
  digitalWrite(in3,LOW);
  digitalWrite(in4,HIGH);
  }
 void dung(){
  digitalWrite(in1,LOW);
  digitalWrite(in2,LOW);
  digitalWrite(in3,LOW);
  digitalWrite(in4,LOW);
  }
  • Trong đoạn code trên có thêm trangthaict1 và trangthaict2 để đọc giá trị công tắc hành trình 1 (Trên) và công tắc hành trình 2 (dưới).
  • Nếu nút lên nhấn (Giá trị 0), nút xuống không nhấn (Giá trị 1) và công tắc hành trình trên có giá trị 0 (Thanh ngang chưa chạm công tắc trên) thì cho động cơ quay lên. Khi động cơ quay lên mà trục ngang trạm công tắc trên thì trangthaict1=1 nên động cơ dừng. Động cơ chỉ quay lên khi cả ba điều kiện sau đúng (trangthainutlen==0 (Bằng không) và trangthainutxuong!=0 (Khác không) và trangthaict1==0 (Bằng không). Một trong 3 điều kiện trên sai thì động cơ sẽ không quay lên nữa. Tương tự cho chiều ngược lại.

Video tham khảo:

Điều khiển động cơ bằng hai nút nhấn:

Tự chế công tăc hành trình


Điều khiển cửa cuốn với nút nhấn và công tăc hành trình.


Chúc các bạn thành công.
Bài tiếp theo: 

Nhận xét, góp ý, thắc mắc, câu hỏi của bạn

Mới hơn Cũ hơn