Đ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
11 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

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Lưu các biến CHỈ ĐỌC với PROGMEM

Trong bài Tiết kiệm RAM trong Arduino?, chúng ta đã biết cách lưu chuỗi hằng vào bộ nhớ FLASH thay cho việc lưu hết bọn chúng vào RAM. Như vậy, một hằng chuỗi có thể được lưu vào bộ nhớ FLASH thay vì lưu vào RAM. Vậy, câu hỏi đặt ra là, những biến hằng khác (hằng số, hẳng mảng, hẳng số thực) có thể được lưu vào FLASH thay vì vào RAM hay không?

Trong thực tế, các biến hằng (trừ hằng chuỗi) hầu hết chỉ tốn vài chục byte để lưu trữ nên RAM, nên chúng ta cũng chưa gặp vấn đề gì trong việc lưu trữ hằng số hay hằng mảng cả. Nhưng thỉnh thoảng, có những lúc, ta phải tìm cách lưu trữ chúng ở một nơi khác, ví dụ Bài 12: Phát nhạc bằng Arduino với một cái loa hoặc buzzer.

Chần chừ gì nữa, biết muốn phám khá khả năng của Arduino - hay không?

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

Code Arduino trên MÂY, bạn có muốn thử hay không?

Từ trước đến giờ, mỗi khi muốn lập trình một bé Arduino, bạn cần phải chuẩn bị driver cho Arduino (hiển nhiên buộc phải có, vì phải giao tiếp với thiết bị ngoại vi là mạch Arduino) và phần mềm lập trình Arduino IDE. Và khi bạn muốn chia sẻ code của mình cho bạn của mình thì cách đơn giản nhất là gửi file sketch cho họ, hoặc nếu cao cấp hơn là sử dụng github hoặc bitbucket (tất nhiên là phải include các thư viện bên thứ ba nếu có). Vậy vấn đề đặt ra trong ngày hôm nay là, liệu có cách nào để có thể chia sẻ sketch của mình với bạn bè và lớn hơn nữa là với cộng đồng Arduino trên thế giới (nói chung) và Việt Nam (nói riêng) hay không?

Và mình đã tìm ra câu trả lời, và không những thế, câu trả lời còn vượt ra ngoài sức mong đợi của chúng ta.

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