Điều khiển NHIỀU NÚT BẤM chỉ với một chân của Arduino

I. Giới thiệu

Qua quá trình làm việc với Arduino, mình thấy có một giải pháp rất hay về việc sử dụng button với Arduino. Đó là chỉ cần sử dụng một chân analog với các nút nhấn và các điện trở có trị số khác nhau, ta có thể làm ra một bàn phím. Qua bài viết này, mình xin chia sẻ thư viện mình mới viết cho vấn đề này.

II. Phần cứng

  1. Arduino UNO
  2. Breadboard
  3. Dây cắm breadboard
  4. 03 nút nhấn
  5. 04 điện trở các trị số khác nhau (trong đó nên có 1 điện trở 10kOhm).

III. Download thư viện

Đây là thư viện do mình mới viết trong chiều ngày hôm nay (21/11/2015) do thấy nó hay quá. Lúc mình viết thì mình không biết là đã các thư viện khác của các bạn nước ngoài, và khi viết xong xem lại các thư viện khác thì code của mình cũng hiệu quả như nhau và có phần đơn giản hơn. Tên của thư viện này là AnalogButton.

IV. Lắp mạch

Hình ảnh lắp mạch

V. Giải thích quy trình

Như các bạn đã biết về các chân analog của Arduino. Mặc định, nó có thể đọc được các giá trị điện thế từ 0 => 5V phân ra thành các giá trị từ 0 => 1023. Nói một cách khác, mỗi chân analog sẽ có 1024 mức dữ liệu. Nếu ta vận dụng một cách linh hoạt, xem lân cận một mức nào đó là điểm giữ, và khi giá trị điện thế tại chân analog rơi vào điểm giữ đó thì làm một việc gì đó. Mở rộng xe, nếu ta có nhiều điểm giữ như vậy, ta có thể làm ra những sự kiện khác nhau (bật tắt đèn các kiểu) chỉ với 1 chân analog duy nhất. 

Vấn đề đặt ra là:

  1. Làm thế nào để tạo ra điểm giữ, nói cách khác là làm thế nào để xác định được điểm giữ bằng các button?
  2. Vậy khi tạo ra điểm giữ được rồi làm thế nào để bảo Arduino chạy một sự kiện (một hàm) nào đó?

1. Làm thế nào để tạo ra điểm giữ, nói cách khác là làm thế nào để xác định được điểm giữ bằng các button?

Chắc hẳn các bạn đã biết về hàm analogRead. Đó chính là hàm đọc giá trị điện thế và chuyển nó thành các mức dữ liệu từ 0 => 1023 (tượng chưng cho 0V và 5V). Như vậy, ta chỉ việc thay đổi mức điện áp cấp vào chân analog là sẽ xác định được một điểm dừng, để làm được điều đó, ta dùng các điện trở tạo ra cầu phân áp (Xem hình lắp mạch ở trên).

Vì sao phải là các giá trị điện trở khác nhau?

Bởi vì nếu các điện trở giống nhau => các điểm dừng trùng nhau. Vì vậy, nếu muốn các điểm dừng sẽ khác nhau => các giá trị điện trở phải khác nhau.

Để xác định được mức điểm dừng, ta chỉ việc dùng hàm analogRead đọc giá trị A0 là xong. Tuy nhiên, để làm quen với thư viện, mình xin chia sẻ đoạn code dưới để các bạn xác định điểm dừng.

 

 

Khi bạn nhấn một nút bấm thì sẽ có một giá trị điểm dừng xuất hiện. Nếu không nhấn nút bấm nào hết thì giá trị điểm dừng là 0.

 

Trong trường hợp của mình đó là khi nhấn lần lượt các button1, button2, button3 nó lần được các giá trị 45, 826, 908 (do mình các điện trở khá là chênh lệch với nhau hehe).

2. Vậy khi tạo ra điểm giữ được rồi làm thế nào để bảo Arduino chạy một sự kiện (một hàm) nào đó?

Bạn chỉ việc thay thế các điểm dừng trên vào đoạn code mẫu dưới đây là xong!

Giá trị điểm dừng bạn nhập vào khi thực thi có thể không chính xác là vì bạn dùng điểm trở có mức sai số lớn hoăc bạn gắn trên breadboard bị lỏng => nhiễu điện! Vì vậy khi làm mạch thực tế các bạn nên dùng điện trở và nút xịn một tí nghen.

VI. Kết luận

Rất dễ dàng phải không nào, chỉ việc xác định điểm dừng rồi thêm nó vào đoạn code thé là xong. Câu hỏi cuối bài mình muốn đặt ra cho các bạn là, làm thế nào để nhấn nhiều nút một lúc :3, hay nói một các hoa mỹ là tổ hợp phím :3. Hehe, vấn đề này không khó, thư viện này có thể làm được, chỉ cần các bạn để ý cách tiếp cận của mình, đó là dựa vào điểm dừng! Điểm dừng này lại phụ thuộc vào áp, áp lại phụ thuộc vào điện trở,... :3. Vậy khi nhấn nhiều nút, điều gì sẽ xảy ra?

Chúc các bạn thành công ahehe.

Chia sẻ thêm video cho các bạn có hứng thú làm hehe.

lên
14 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

while

Vòng lặp while là một dạng vòng lặp theVòng lặp while là một dạng vòng lặp theo điều kiện, mình không thể biết trước số lần lặp cua nó, nhưng mình quản lý lúc nào thì nó ngừng lặp!o điều kiện, mình không thể biết trước số lần lặp cua nó, nhưng mình quản lý lúc nào thì nó ngừng lặp!

lên
13 thành viên đã đánh giá bài viết này hữu ích.

for

Hàm for có chức năng làm một vòng lặp. Vậy vòng lặp là gì? Hãy hiểu một cách đơn giản, nó làm đi làm lại một công việc có một tính chất chung nào đó. Chẳng hạn, bạn bật tắt một con LED thì dùng digitalWrite xuất HIGH delay rồi lại LOW rồi lại delay. Nhưng nếu bạn muốn làm nhiều hơn 1 con LED thì mọi đoạn code của bạn sẽ dài ra (không đẹp và khi chỉnh sửa thì chẳng lẻ ngồi sửa lại từng dòng?

lên
24 thành viên đã đánh giá bài viết này hữu ích.