MATHANGSPK BLOG

Chia sẽ các thủ thuật về máy tính, tin học, các kiến thức điện tử cơ bản

Thứ Sáu, 12 tháng 7, 2019

Điều khiển nút nhấn trong Arduino

Ở bài viết này mình xin giới thiệu các bạn đến chức năng rất hay thường dùng trong arduino, đó là giao tiếp với nút nhấn, để điều khiển LED. Nếu điều khiển được LED, đồng nghĩa với việc bạn có thể điều khiển được bất cứ cơ cấu chấp hành nào. Vì đơn giản chúng có 1 nguyên lý hoàn toàn giống nhau.
Sơ đồ tổng quan.
Sơ đồ đấu nối phần cứng:

Chân D2 là chân sẽ nhận tín hiệu: Theo như mạch trên Bình thường khi chưa tác động nút nhấn chân D2 sẽ được nối xuống Mass lúc này D2 nhận tín hiệu 0V và sẽ là mức 0 trong logic, khi switch được nhấn sẽ có một điện áp 5V đi qua điện trở 10KOhm xuống mass, lúc này hiệu điện thế giữa chân D2 và Mass là 5V. Chân D2 nhận mức logic là 1.
Một câu đặt ra, liệu chúng ta có thể nối trực tiếp nguồn 5V qua switch và đưa thẳng vào chân D2 có được không? Đó là một ý kiến theo tôi là không hay nhưng nó hoàn toàn được, vì trước khi vào Vi Xử lý thì nó đã có 1 điện trở 10megaOhm.
Nhưng nếu đấu mạch như sơ đồ trên thì sẽ tránh được trường hợp tín hiệu vào chân D2 bị nhiễu, là một điểm đôi khi khá nhức đầu, nếu ta gặp sự cố khi mạch hoạt động như chúng ta mong muốn. Và tốt nhất thì các bạn nên đấu mạch như sơ đồ trên là một điều được khuyên dùng.

Phần trên là phần mình giới thiệu nguyên lý mạch và cách thức làm việc, tiếp đến sẽ đến phần viết code cho Arduino.

Về phần code thì đây là các hàm đơn giản nên các thư viện cơ bản khi các bạn cài Arduino IDE đã có đầy đủ, chỉ cần code thôi là chạy được rồi.


//  D10 to resister and LED
//  D2 to push button switch
//
 
// Define the pins being used
int pin_LED = 10;
int pin_switch = 2;
 
void setup() 
{
    pinMode(pin_LED, OUTPUT);  
    digitalWrite(pin_LED,LOW); 
 
    pinMode(pin_switch, INPUT); 
}
 
void loop()
{
    if ( digitalRead(pin_switch) == HIGH) 
    {
       digitalWrite(pin_LED, HIGH);
    }
    else
    {
       digitalWrite(pin_LED, LOW);
    }   
}

Giải thích code chút xíu cho các bạn nào mới có thể dễ hiểu hơn nhé.
Đầu tiên là khai báo:

int pin_LED = 10;
int pin_switch = 2;

Đây là phần thiết lập, khởi tạo khi Arduino khởi động (chỉ chạy duy nhất 1 lần khi on nguồn).
void setup() 
{
    pinMode(pin_LED, OUTPUT);  
    digitalWrite(pin_LED,LOW);  
    pinMode(pin_switch, INPUT); 
}
pinMode (pin_LED, OUTPUT) --> cấu hình cho chân pin_LED là ngỏ ra

digitalWrite(pin_LED,LOW) --> Set mức 0 cho chân pin_LED --> Đồng nghĩa khi khởi động xong thì chúng ta sẽ thấy LED tắt.

pinMode(pin_switch, INPUT) --> Cấu hình cho chân pin_switch là ngỏ vào.

Ok bây giờ các bạn hãy thử nạp code vào để chạy thử xem như thế nào?


Kết quả, Khi mình nhấn nút nhấn thì LED sẽ sáng và khi mình nhã nút nhấn ra LED sẽ tắt đúng không các bạn?

Đến bước này các bạn đã thấy hứng thú với việc chơi với em này chưa?
Hãy theo đường dẫn này để đến được với mô phỏng các bạn nhé. Tại đây

Đến với ví dụ thứ 2: Phần cứng chúng ta sẽ không thay đổi nhưng phần mềm sẽ có chút thay đổi, chúng ta sẽ sửa lại code một chút như sau:

int pin_LED = 10;
int pin_switch = 2;
boolean newButtonState = 0;
boolean oldButtonState = 0;
void setup()
{
  pinMode(pin_LED, OUTPUT);
  pinMode(pin_switch, INPUT);
}

void loop()
{
  newButtonState = digitalRead(pin_switch);
  if(newButtonState != oldButtonState){
    if(digitalRead(pin_switch)==HIGH){
      digitalWrite(pin_LED, HIGH);
    }else  digitalWrite(pin_LED, LOW);
    oldButtonState = newButtonState;
  }  
}

Ở đây chúng ta sẽ khai báo thêm 1 cặp biến mới được gán là trạng thái mới và cũ của nút nhấn của chúng ta:
boolean oldButtonState = 0;
boolean newButtonState = 0;
Ở trong vòng lặp loop(), chúng ta có code như sau:
- Đầu tiên, chúng ta sẽ cập nhật trạng thái biến newButtonState = tín hiệu hiện tại mà chân pin_switch nhận về.
- Tiếp theo, là bước so sánh giữa trạng thái mới và trạng thái cũ trước đó, nếu khác nhau được dùng != trong ngôn ngữ so sánh khác, thì trạng thái của LED sẽ được thay đổi.
- Nếu trạng thái mới không thay đổi thì đoạn chương trình sẽ không làm gì cả.

Chúng ta sẽ chạy chương trình bằng tay như sau:
- Khi nút nhấn chưa được nhấn, nghĩa là chân pin_switch sẽ là mức 0.
- newButtonState sẽ bằng 0.
- Vì giá trị gán ban đầu của oldButtonState = 0 nên newButtonState = oldButtonState nên sẽ thực hiện gì tiếp cả vì không đủ điều kiện để thực hiện.
- Khi nút nhấn được nhấn, nghĩa là chân pin_switch sẽ là mức 1.
- newButtonState sẽ bằng 1.
- Lúc này thỏa điều kiện newButtonState khác với oldButtonState sẽ làm LED sáng lên vì lúc này pin_switch = 1.
- Và oldButtonState sẽ được cập nhật giá trị là 1.
- Và nếu vẫn còn giữ thì LED sẽ sáng mãi vì lúc này oldButtonState và newButtonState đều bằng 1, không thỏa điều kiện để thay đổi LED, cho tới khi nhả nút nhấn ra.

Sau đây là sản phẩm thực tế:


Kết thúc ví dụ thứ 2, vậy các bạn sẽ hỏi, vậy ở ví dụ 1 và 2 khác nhau ở điểm nào. Ở ví dụ 1 chúng ta cũng nhấn nút và LED sáng, nhã nút nhấn thì LED tắt, ở ví dụ 2 cũng vậy, đâu có khác gì đâu.

Bây giờ chúng ta sẽ thêm 1 vài dòng code vào 2 ví dụ để kiểm nhận sự khác biệt các bạn nhé.
Ta xét ở ví dụ 1, thay đổi code như sau:

int pin_LED = 10;
int pin_switch = 2;
void setup()
{
  Serial.begin(9600);
  pinMode(pin_LED, OUTPUT);
  pinMode(pin_switch, INPUT);
}

void loop()
{
    if(digitalRead(pin_switch)==HIGH){
      digitalWrite(pin_LED, HIGH);
        Serial.println("LED ON");
    }
  else{  
      digitalWrite(pin_LED, LOW); 
      Serial.println("LED OFF");
  }
}

Thêm cấu hình hiển thị Serial Monitor ở baudrate 9600, khi chúng ta nhấn nút thì sẽ gửi qua Serial dòng chữ "LED ON" và nếu không nhấn thì sẽ gửi dòng chữ "LED OFF"



Theo như chúng ta thấy thì khi nhấn hoặc không nhấn thì Lệnh Serial được gửi liên tục, điều này sẽ rất khó để kiểm soát được việc thay đổi trạng thái của nút nhấn để điều khiển 1 bước nào đó. Nên chúng ta thử xét ở ví dụ 2, xem thế nào nhé các bạn.
Ở ví dụ 2, ta sẽ thay đổi code như sau:

int pin_LED = 10;
int pin_switch = 2;
boolean newButtonState = 0;
boolean oldButtonState = 0;
void setup()
{
  Serial.begin(9600);
  pinMode(pin_LED, OUTPUT);
  pinMode(pin_switch, INPUT);
}

void loop()
{
  newButtonState = digitalRead(pin_switch);
  if(newButtonState != oldButtonState){
    if(digitalRead(pin_switch)==HIGH){
      digitalWrite(pin_LED, HIGH);
        Serial.println("LED ON");
    }else{
        digitalWrite(pin_LED, LOW);
        Serial.println("LED OFF");
    }
    oldButtonState = newButtonState;
  }  
}

Chúng ta sẽ xem video để dễ hiểu hơn



Ở video các bạn thấy, khi arduino bắt đầu chạy thì Serial Monitor không hiển thị bất kỳ thứ gì cả, vì đâu có thỏa điều kiện đâu mà chạy, khi mình nhấn nút thì chỉ hiển thị LED ON lên một lần, và khi nhã nút nhấn ra chỉ hiển thị LED OFF một lần.
Điều này chứng tỏ, nếu ta dùng code này khi muốn nhấn thì sẽ tăng giá trị lên 1 chẳng hạn thì sẽ rất tốt. Vì khi nhấn vào thì đoạn code bên trong điều kiện thỏa chỉ được thực hiện 1 lần.

Như vậy chúng ta đã hiểu hơn về cách hoạt động của nút nhấn trong Arduino rồi. Mọi ý kiến hay chia sẽ gì rất mong các bạn để lại phần comment bên dưới các bạn nhé. Mọi ý kiến thắc mắc, các bạn có thể liên hệ qua fb hoặc e-mail của mình nhé, hẹn gặp các bạn ở topic tiếp theo

Không có nhận xét nào:

Đăng nhận xét

Adbox