Chúng tôi đã xem xét kết nối một nút với Arduino và đã đề cập đến vấn đề liên hệ "nảy". Đây là một hiện tượng rất khó chịu gây ra các lần bấm nút lặp đi lặp lại và gây khó khăn cho việc xử lý các lần bấm nút theo chương trình. Hãy nói về cách để thoát khỏi số liên lạc bị trả lại.
Cần thiết
- - Arduino;
- - nút chạm;
- - điện trở có giá trị danh định 10 kOhm;
- - Điốt phát quang;
- - dây nối.
Hướng dẫn
Bước 1
Tiếp xúc bị nảy là hiện tượng thường gặp ở các công tắc cơ, nút bấm, công tắc bật tắt và rơ le. Do thực tế là các tiếp điểm thường được làm bằng kim loại và hợp kim có tính đàn hồi, khi đóng về mặt vật lý, chúng không thiết lập ngay kết nối đáng tin cậy. Trong một khoảng thời gian ngắn, các điểm tiếp xúc đóng nhiều lần và đẩy lùi nhau. Kết quả là, dòng điện có giá trị ở trạng thái ổn định không phải ngay lập tức, mà sau một chuỗi thăng trầm. Thời gian của hiệu ứng thoáng qua này phụ thuộc vào vật liệu tiếp xúc, kích thước và thiết kế. Hình minh họa cho thấy một biểu đồ dao động điển hình khi các tiếp điểm của nút nhạy được đóng lại. Có thể thấy rằng thời gian từ lúc chuyển sang trạng thái dừng là vài mili giây. Điều này được gọi là "trả lại".
Hiệu ứng này không đáng chú ý trong các mạch điện để điều khiển ánh sáng, động cơ, hoặc các thiết bị và cảm biến quán tính khác. Nhưng trong các mạch có tốc độ đọc và xử lý thông tin nhanh (trong đó các tần số có cùng thứ tự với các xung "trả lại", hoặc cao hơn), thì đây là một vấn đề. Đặc biệt, Arduino UNO, hoạt động ở tần số 16 MHz, rất xuất sắc trong việc bắt lỗi tiếp xúc bằng cách chấp nhận một chuỗi các số một và số không thay vì một công tắc 0 đến 1.
Bước 2
Hãy xem độ nảy của tiếp điểm ảnh hưởng như thế nào đến hoạt động chính xác của mạch. Hãy kết nối nút đồng hồ với Arduino bằng cách sử dụng mạch điện trở kéo xuống. Bằng cách nhấn nút, chúng tôi sẽ sáng đèn LED và để nó sáng cho đến khi nút được nhấn lại. Để rõ ràng, chúng tôi kết nối đèn LED bên ngoài với chân số 13, mặc dù có thể phân phối chân cắm tích hợp.
Bước 3
Để hoàn thành nhiệm vụ này, điều đầu tiên bạn nghĩ đến:
- nhớ trạng thái trước đó của nút;
- so sánh với trạng thái hiện tại;
- nếu trạng thái đã thay đổi, thì chúng ta thay đổi trạng thái của đèn LED.
Hãy viết một bản phác thảo như vậy và tải nó vào bộ nhớ Arduino.
Khi mạch được bật lên, hiệu ứng nảy tiếp xúc có thể nhìn thấy ngay lập tức. Nó biểu hiện ở chỗ đèn LED không sáng ngay sau khi nhấn nút, sáng rồi tắt, hoặc không tắt ngay sau khi nhấn nút nhưng vẫn sáng. Nói chung, mạch hoạt động không ổn định. Và nếu đối với một nhiệm vụ có bật đèn LED, điều này không quá quan trọng, thì đối với các nhiệm vụ khác, nghiêm trọng hơn, nó chỉ đơn giản là không thể chấp nhận được.
Bước 4
Chúng tôi sẽ cố gắng khắc phục tình hình. Chúng tôi biết rằng liên hệ bị trả lại xảy ra trong vòng vài mili giây sau khi đóng liên hệ. Hãy chờ 5ms sau khi thay đổi trạng thái của nút. Thời gian này đối với một người gần như là ngay lập tức và việc nhấn nút của một người thường mất nhiều thời gian hơn - vài chục mili giây. Và Arduino hoạt động hiệu quả với khoảng thời gian ngắn như vậy, và 5ms này sẽ cho phép nó cắt đứt các liên lạc bị trả lại khi nhấn một nút.
Trong bản phác thảo này, chúng ta sẽ khai báo thủ tục debounce () ("bounce" trong tiếng Anh chỉ là "bị trả lại", tiền tố "de" có nghĩa là quá trình ngược lại), cho đầu vào mà chúng ta cung cấp trạng thái trước đó của nút. Nếu một lần nhấn nút kéo dài hơn 5 msec, thì đó thực sự là một lần nhấn.
Bằng cách phát hiện báo chí, chúng tôi thay đổi trạng thái của đèn LED.
Tải bản phác thảo lên bảng Arduino. Mọi thứ bây giờ tốt hơn nhiều! Nút hoạt động bình thường, khi nhấn, đèn LED sẽ thay đổi trạng thái như chúng ta muốn.
Bước 5
Chức năng tương tự được cung cấp bởi các thư viện đặc biệt như thư viện Bounce2. Bạn có thể tải xuống từ liên kết trong phần "Nguồn" hoặc trên trang web https://github.com/thomasfredericks/Bounce2. Để cài đặt thư viện, hãy đặt nó vào thư mục thư viện của môi trường phát triển Arduino và khởi động lại IDE.
Thư viện "Bounce2" chứa các phương thức sau:
Bounce () - khởi tạo đối tượng "Bounce";
khoảng trống (ms) - đặt thời gian trễ tính bằng mili giây;
void đính kèm (số pin) - đặt chân mà nút được kết nối;
int update () - cập nhật đối tượng và trả về true nếu trạng thái pin đã thay đổi và false nếu ngược lại;
int read () - đọc trạng thái mới của pin.
Hãy viết lại bản phác thảo của chúng ta bằng cách sử dụng thư viện. Bạn cũng có thể nhớ và so sánh trạng thái trong quá khứ của nút với trạng thái hiện tại, nhưng hãy đơn giản hóa thuật toán. Khi nhấn nút, chúng tôi sẽ đếm số lần nhấn, và mỗi lần nhấn lẻ sẽ bật đèn LED và mỗi lần nhấn chẵn sẽ tắt đèn. Bản phác thảo này trông ngắn gọn, dễ đọc và dễ sử dụng.