Bài 3: Dùng nút nhấn để bật tắt đèn Led với Arduino (Digital In)

From MakerLab Wiki
Jump to navigation Jump to search

Giới thiệu

Bài 2 các bạn được làm quen với thành phần Output mới là 1 module LED.

Tuy nhiên, ở hiện tại chỉ với mỗi thành phần Output, chúng ta cũng chỉ có thể điều khiển LED theo một kịch bản cố định, không thay đổi được theo các sự kiện (Event) trong thời gian thực, tức nó còn thiếu sự linh động.
Để có thể điều khiển LED theo ý mình muốn bất kì lúc nào, ta cần sử dụng thêm thành phần Input nữa.
Trong bài này, mình sẽ hướng dẫn cách sử dụng kết hợp thêm 1 module Nút nhấn để điều khiển LED bật tắt theo ý mình.
Oke, đi nào!

Kiến thức cơ bản

Nút nhấn?

Nút nhấn (thường mở)
Nút nhấn (thường mở)
Nút nhấn là một linh kiện giúp bạn gửi đi các tín hiệu điều khiển đến các thiết bị điện, điện tử qua thao tác của người dùng.
Nó chứa ít nhất hai tiếp điểm, các điểm tiếp xúc này sẽ đóng khi nhấn nút (loại thường mở) hoặc mở khi nhấn nút (loại thường đóng). Thông thường lò xo sẽ khôi phục nút về vị trí ban đầu khi áp lực tác động lên nút được giải phóng.
Bên trong nút nhấn có một "Lò xo hồi vị", để tạo ra lực cản đối với lực hướng xuống trên nút và một "Cặp lò xo" phía trên một "Cặp tiếp điểm" (có liên kết điện), để giữ mỗi tiếp điểm ở đúng vị trí và tạo một kết nối chắc chắn khi nút được nhấn.

Điện trở?

Để sử dụng được Nút nhấn trong các mạch điện tử, ta cần phải dùng kết hợp với Điện trở (Resistor), là một linh kiện giúp hạn chế "Dòng điện".
Bản thân Điện trở mang một giá trị Trở kháng được xác định bằng đơn vị Ohm (Ω). Khi được cấp vào một mức "Điện áp" giữa hai đầu linh kiện, giá trị Trở kháng sẽ quyết định cường độ "Dòng điện" chạy qua là bao nhiêu theo công thức từ Định luật Ohm.
Mục đích của việc dùng thêm Điện trở là để Vi điều khiển (vd: các bo Arduino, ...) có thể đọc tín hiệu Digital vào rõ ràng, ổn định hơn, tránh điện áp tín hiệu rơi vào trạng thái trôi nổi ngẫu nhiên.
2 cách sử dụng phổ biến, mình sẽ đề cập tiếp dưới đây!

Pull-Up?

Điện trở Kéo lên
Điện trở Kéo lên
Điện trở kéo lên (Pull-up Resistor) được sử dụng để đặt trạng thái mặc định của chân Digital là HIGH tương ứng mức Điện áp 5V.
Khi nhấn hoặc giữ đè nút, tín hiệu chân Digital sẽ rơi xuống mức LOW. Cho đến khi bạn nhả nút nhấn ra (với loại không tự giữ) nó sẽ quay lại mức tín hiệu mặc định ban đầu.

Pull-Down?

Điện trở Kéo xuống
Điện trở Kéo xuống
Điện trở kéo xuống (Pull-down Resistor) được sử dụng để đặt trạng thái mặc định của chân Digital là LOW tương ứng mức Điện áp 0V.
Khi nhấn hoặc giữ đè nút, tín hiệu chân Digital sẽ tăng lên mức HIGH. Cho đến khi bạn nhả nút nhấn ra (với loại không tự giữ) nó sẽ quay lại mức tín hiệu mặc định ban đầu.

Phần mềm

Arduino

Icon-Info-White.png Trước khi bắt đầu:

  • Yêu cầu đã cài phần mềm Arduino IDE (nên cài phiên bản mới nhất đã ổn định).
  • Các bạn có thể xem các bài hướng dẫn cơ bản về cách cài, cách sử dụng IDE này tại đây nhé.

Phần cứng

Danh sách thiết bị

Tên sản phẩm Số lượng
Mạch Vietduino Uno (Arduino Uno Compatible) 1
Mạch Arduino MakerEDU Shield 1
Mạch nút nhấn MKL-M02 push button tact switch module 1
Mạch led đơn MKL-M01 10mm single LED module 1
Cáp Micro USB 1
Cáp Kết Nối MakerEDU XH2.54 3Wires 20cm Cable [XH2.54 - XH2.54] 2

Hướng dẫn kết nối

  1. Gắn Shield "Arduino MakerEDU" lên bo Vietduino.
  2. Kết nối Module Nút nhấn với Shield bằng dây "XH2.54 3Wires" vào Port D9.
  3. Kết nối Module LED với Shield bằng dây "XH2.54 3Wires" vào Port D10.
  4. Kết nối bo Vietduino với máy tính thông qua cáp MicroUSB.

Code

  1. Mở Arduino IDE.
  2. Vào File -> New (hoặc Ctrl+N) tạo 1 file Arduino mới và đặt tên là ...\Button_Control_Led.ino
  3. Vào Tool để cấu hình Board:...Port:... đúng tương ứng với bo Arduino bạn đang dùng.
  4. Copy đoạn Code sau và nhấp vào Verify (Ctrl+R) để IDE kiểm tra lỗi cú pháp.
  5. Sau khi IDE kiểm tra không có lỗi trong Code, lúc này bạn có thể nhấp Upload (Ctrl+U) để nạp Code vào bo Arduino.

Code Example

Template:Kxncode

Giải thích Code

bool /*** KIỂU DỮ LIỆU ***/

Chức năng:

  • Tạo một biến kiểu dữ liệu chỉ chứa một trong hai giá trị là true hoặc false.
    Về cơ bản, chúng ta chỉ cần 1 bit (21 = 2) thôi là có thể đại diện cho 2 giá trị trên rồi, trong đó false tương ứng Bit 0true tương ứng Bit 1.
    Tuy nhiên, trên thực tế điều này còn do cấu trúc thiết kế bên trong Vi điều khiển quyết định. Trong các bo Arduino, mỗi biến bool chiếm tận 1 byte bộ nhớ lận!
Icon-Info-White.png Boolean?

  • Trong lập trình Arduino, đôi khi các bạn sẽ bắt gặp từ khóa này.
    Thật ra boolean là một loại "bí danh không chuẩn" cho bool do Arduino định nghĩa.
  • Việc dùng một trong hai tên này là như nhau, nhưng mình khuyến nghị bạn nên sử dụng bool thôi.

Cú pháp:

  • bool var = val;
  • bool var;

Tham số:

  • var - tên biến.
  • val - giá trị bạn "gán" cho biến đó.
if(condition)
{
  // statement(s)
}

Chức năng:

  • Câu lệnh if kiểm tra một Điều kiện (Condition) và thực hiện một câu lệnh hoặc tập hợp các câu lệnh sau, nếu điều kiện là true.
    Vậy còn điều kiện là false thì sao? Với câu lệnh chỉ có phần if, chương trình sẽ bỏ qua, không làm gì cả!

Tham số:

  • condition - một biểu thức Boolean (có thể là true hoặc false).
while(expression)
{
  // statement(s)
}

Chức năng:

  • Là một Vòng lặp và nó sẽ lặp liên tục và vô hạn, cho đến khi Biểu thức (Expression) bên trong cặp dấu () trở thành false.
    Vậy nên cần phải có một cái gì đó làm thay đổi kết quả biểu thức, nếu không vòng lặp while sẽ không bao giờ dừng.
Icon-Attention-White.png Vòng lặp vô tận!

  • Khái niệm vòng lặp vô tận nghe thật đáng sợ đúng không nào ^^!
  • Đôi khi trong một hệ thống lớn vẫn có thể xuất hiện Bug ở đâu đó và gây ra hiện tượng vòng lặp này, khiến chương trình không còn làm gì tiếp được. Lúc này chúng ta buộc phải dùng đến những cơ chế hay điều kiện đặc biệt để thoát khỏi nó.
  • Nhìn là vậy, thật ra chúng lại rất có nhiều ứng dụng trong Lập trình đấy. Bản thân hàm void loop() cũng là 1 Vòng lặp vô tận rồi.

Tham số:

  • expression - một biểu thức Boolean được đánh giá là true hoặc false.
digitalRead(); /*** HÀM ***/

Chức năng:

  • Đọc giá trị từ một chân Digital được chỉ định.

Cú pháp:

  • digitalRead(pin);

Tham số:

  • pin - chân (con số) chọn từ bo Arduino.

Kiểu dữ liệu trả về:

  • Trả về HIGH hoặc LOW.
== /*** TOÁN TỬ ***/

Chức năng:

  • Là một Toán tử So sánh2 Toán hạng.
    Nó giúp "so sánh" Biến ở bên trái với Biến hoặc Hằng số ở bên phải của toán tử.
Icon-Attention-White.png So sánh trong Lập trình:

  • Xin lưu ý rằng bạn có thể so sánh các Biến của các kiểu dữ liệu khác nhau, nhưng điều đó có thể tạo ra kết quả không thể đoán trước được.
  • Do đó, bạn nên so sánh các Biến của cùng một kiểu dữ liệu, bao gồm cả kiểu có signedunsigned nhé.

Cú pháp:

  • x == y; // kết quả là true nếu x bằng y và false nếu x không bằng y

Tham số: → cả 2 toán hạng đều có thể là bất kì kiểu dữ liệu nào.

  • x - là Biến (toán hạng bên phải).
  • y - là Biến hoặc Hằng số (toán hạng bên trái).
! /*** TOÁN TỬ ***/

Chức năng:

  • Toán tử Logic NOT1 Toán hạng.
    Nó cho kết quả là true nếu toán hạng là false và ngược lại.
Icon-Info-White.png Phân biệt giữa Toán tử Logic và Toán tử Bitwise:

  • Bạn nào đã tìm hiểu đủ sâu về Lập trình sẽ thấy một loại toán tử (~). Về cách hoạt động thoạt nhìn trông chúng có vẻ giống nhau, đều thực hiện "đảo ngược" một giá trị.
    Nhưng giá trị mà (~) "đảo" ở đây là bit và nó đảo tất cả các bit trong một Biến hoặc Hằng số.
  • Tới đây bạn nào tinh ý sẽ thắc mắc toán tử (!) thực hiện việc đánh giá thế nào để từ các Biến hoặc Hằng số mà trả về chỉ với 2 giá trị truefalse?
    Nói đơn giản, một giá trị miễn có tất cả các bit đều là 0 thì đó là false. Còn chỉ cần có một bit trong đó là 1 thì là true.

Cú pháp:

  • x = (!y); // giá trị "đảo ngược" của y được lưu trữ trong x

Tham số: → có thể là bất kì kiểu dữ liệu nào.

  • y - là Biến hoặc Hằng số (toán hạng bên trái).

Kết quả Demo

Icon-Done-White.png Successful:

  • Mỗi khi các bạn nhấn nút, đèn LED sẽ thay đổi trạng thái ON hoặc OFF.

Các bạn có thể xem chương trình sẽ hoạt động như thế nào theo video dưới đây nhé.

!!! nhúng 1 clip youtube, để xem video trực tiếp trên trang này. Dùng extension <iframe> cho MediaWiki.

Tìm hiểu thêm

Về hiện tượng Bounce của Nút nhấn: | Switch Bounce and How to Deal with It.

Về Điện trở PullUp và PullDown: | Pull Up and Pull Down Resistor.

Ngôn ngữ lập trình Arduino: | Language - Arduino Reference.