Chống dội nút nhấn là gì

Nút nhấn là 1 giao diện người dùng quen thuộc nhất đối với những tất cả chúng ta. Có những nút có những tính năng rất quan trọng như Phóng tên lửa hạt nhân, bật dây truyền sản xuất. Nhưng có những nút chỉ thêm vào để cho đẹp mạch 😀

Đối với nút phóng tên lửa hạt nhân chúng ta không thể thiết kế 1 cách cẩu thả được, như vậy sẽ ảnh hưởng tới rất nhiều mạng người. Và tuyệt đối không thể để bị nhiễu được. Hãy xem hình 1 để thấy mô hình nút nhấn chúng ta hay dùng.

Hình 1. Mô hình nút nhấn

Đây là mô hình nút nhấn hay dùng cho những bạn mới học, và với mô hình này bạn sẽ gặp nhiễu như hình 2.

Hình 2. Nhiễu trên tín hiệu nút nhấn

Đối với nút nhấn treo trở thì sẽ rất dễ nhiễu, nếu giảm giá trị của trở thì sẽ giảm được nhiễu, nhưng sẽ dẫn đến tăng công suất tiêu thụ điện của mạch điện. Do đó ta có 1 cách chống nhiễu bằng phần cứng như Hình 3.

Hình 3. Chống nhiễu nút nhấn bằng tụ

Thường thì tụ 100nF sẽ được dùng để chống nhiễu nút nhấn. Đối với cường độ nhiễu nhỏ có thể dùng tụ 10nF, còn nhiễu nhiều quá có thể dùng tụ 10uF.

Sau khi dùng mô hình như hình 3 ta có tín hiệu nút nhấn như hình 4

Hình 4. Hết nhiễu sau khi lọc nút nhấn bằng tụ

Nhìn Hình 4 là kết quả sau khi lọc nhiễu bằng tụ. Có vẻ rất lý tưởng, nhưng thực tế trong 1 số môi trường khắc nghiệt, vẫn sẽ còn nhiễu, và do nút nhấn thực hiện công việc quá quan trọng nên ta sẽ phải thêm lọc nhiễu bằng phần mềm.

Bình thường khi nhấn 1 nút nhấn rồi nhả ra sẽ mất ít nhất khoảng 10ms, chậm thì khoảng 1s. Chậm nữa thì infinity luôn. Còn nhiễu nút nhấn thì chỉ diễn ra trong khoảng thời gian tính bằng ns. Do đó ta có thể dùng thời gian để xem 1 giá trị logic có phải nhiễu hay không. Xem lại Hình 2 ta biết ngay thời điểm nào là nhấn nút và thời điểm nào là nhiễu. Vậy thì tôi nghĩ ra 1 cách đơn giản là tôi sẽ tính giá trị logic trung bình của nút nhấn theo thời gian. Cứ khoảng 50ms thì tôi tổng trung bình 1 lần. Đối với mô hình nút nhấn như trên thì mức logic mặc định (logic không nhấn nút ) = 1. còn mức logic nhấn nút = 0. Mức 0 thì gần như không thể nhiễu, chỉ còn mức 1 hay bị nhiễu nhảy xuống 0. Nên tôi sẽ tính trung bình mức logic 1, cứ mỗi 1 vòng quét của hệ thống tôi sẽ lưu lại giá trị của nút nhấn, sau 64 lần lưu lại giá trị, tôi sẽ tính xem có bao nhiễu giá trị mức 1, nếu % số giá trị mức 1 > 70% thì sẽ kết luận nút nhấn đang ở mức 1. Còn không thì sẽ kết luận là đang ở mức 0. Cách đọc như hình 5.

Hình 5. Phân khoảng thời gian tính trung bình mức 1 logic nút nhấn

Như trong hình 5. Tôi phân khoảng thời gian thành rất nhiều khoảng bằng nhau, H1, H2,… H7. Trong mỗi khoảng đấy có 64 lần đọc nút nhấn được lưu lại kết quả để tính trung bình. Cứ mỗi lần đọc đủ 64 lần nút nhấn sẽ tính trung bình 1 lần, ta có thể ước tính ra giá trị trung bình logic 1 của từng khoảng như sau:+ H1: >95% và < 100% Logic 1+ H2: >95% và < 100% Logic 1+ H3: < 40% Logic 1+ H4: 0% Logic 1+ H5: > 70% Logic 1+ H6: > 95% và < 100% Logic 1+ H7: > 95% và < 100% Logic 1Cứ mỗi lần đọc dữ liệu nút nhấn mới, tôi sẽ xóa đi kết quả đọc nút nhấn cũ nhất, giữ lại 63 kết quả đọc nút nhấn gần nhất cộng với kết quả lần đọc này và tính ra trung bình. Tôi ước tính cường độ nhiễu lớn nhất trong ứng dụng tôi gặp có thể lên đến 30%. Do đó khi trung bình mức logic > 70% thì tôi sẽ kết luận là đang ở mức 1. Còn < 70% thì tôi kết luận mức 0.

Tại sao tôi lại chọn con số 64 lần đọc nút nhấn để tính trung bình. Vì để tiện cho thuật toán, Tôi dùng 1 biến 64bit để lưu dữ liệu của 64 lần đọc nút nhấn, cứ mỗi lần đọc nút nhấn mới tôi chỉ cần dịch bit sang trái 1 bit và thêm dữ liệu mới vào. Như thế rất tiện. Nếu chip của bạn không cho phép khai báo biến 64bit thì bạn có thể chọn biến 32bit và chỉ lấy trung bình 32 lần. Hoặc nếu bạn vẫn muốn lấy trung bình 64 lần hoặc 100 lần thì bạn có thể dùng mảng để lưu dữ liệu.

Code của tôi sẽ như sau:

uint16_t ReadCnt = 0; uint64_t Log = 0; uint8_t ButtonValue = 0; // Giá trị nút nhấn sau khi lọc bằng phần mềm void ReadGInputLoop(void) { char InputValue = ReadGInput(); // Lấy giá trị nút nhấn hiện tại Log = Log << 1;// Dịch trái biến log để xóa giá trị nút nhấn cũ nhất if (InputValue > 0) Log |= 1; if (ReadCnt < 64) ReadCnt ++; else { float Logic1Percent = 0; uint16_t Logic1Cnt = 0; for (int i = 0; i< 64; i++) if (((Log >> i)&&0x01) == 1) Logic1Cnt ++; Logic1Percent = (Logic1Cnt*100.0 / 64.0) ; if (Logic1Percent > 70 ) ButtonValue = 1; else ButtonValue = 0; } }

OK. Mình sẽ đặt hàm ReadGInputLoop() trong while(1) của hàm main. xong chỉ lúc cần chỉ lấy giá trị ButtonValue để dùng thôi. Cách này thì nó không làm trễ hệ thống, không có delay nên cũng rất phù hợp để dùng.

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

Un nút nhấn là nút cho phép bạn ngắt hoặc gửi tín hiệu điện tử. Với yếu tố đơn giản này kết hợp với các yếu tố khác, bạn có thể tạo các dự án cho vô số ứng dụng. Việc sử dụng loại nút bấm này rất phổ biến khi nói đến các dự án với Arduino. Và bằng cách kết hợp một số nút này, bạn có thể tạo ra một bàn phím phức tạp hơn một chút, mặc dù đã có những bàn phím có thể lập trình cho những mục đích sử dụng này ...

Nhân tiện, bạn không nên nhầm lẫn nút bấm với một công tắc. Chúng là những thứ hoàn toàn khác nhau. Sự khác biệt là công tắc hoặc công tắc được kích hoạt hoặc tắt với mỗi lần nhấn được thực hiện trên nó. Trong khi đó, nút ấn sẽ chỉ ở một trạng thái trong khi áp lực được tác động lên nó. Tôi đã nhận xét rằng nó có thể gửi hoặc ngắt, đó là bởi vì có hai loại nút cơ bản.

Nút nhấn KHÔNG hoặc thường mở và nút nhấn NC hoặc thường đóng. Điều này cũng sẽ phát ra âm thanh cho bạn từ các rơ le. Và vâng, nó chính xác là hoạt động tương tự. Khi bạn có NC, nó sẽ cho dòng điện đi qua các đầu cuối của nó và nó chỉ ngắt khi bạn đang nhấn nó. Mặt khác, NA không cho dòng điện chạy qua khi không có áp lực tác động lên nó và sẽ chỉ cho dòng điện chạy qua khi bạn nhấn vào nó.

Biết rằng, là hầu hết mọi thứ bạn cần biết về nút nhấn để bắt đầu kết nối và lập trình của bạn bằng Arduino. Sự thật là nó là một yếu tố đơn giản đến mức không có nhiều điều để nói về loại nút bấm này.

La kết nối một nút bấm để làm cho nó tương tác với Arduino không thể đơn giản hơn. Một ví dụ là sơ đồ mà bạn có thể thấy trên những dòng này. Đó sẽ là tất cả những gì cần thiết để bắt đầu thử nghiệm. Nhưng tất nhiên, với kế hoạch đó, bạn có thể làm được rất ít. Bạn sẽ cần phải có một chút trí tưởng tượng để quyết định xem nút đó sẽ điều khiển những gì. Trên thực tế, nếu bạn đọc hwlibre.es thường xuyên, bạn sẽ thấy một số bài báo trong đó chúng tôi đã sử dụng các nút nhấn ...

Một điều mà bạn nên biết là vấn đề chống trả lại và cách kết nối các nút bấm này. Đầu tiên chúng ta đi đến cách kết nối chúng mà bạn đã biết có thể là với điện trở kéo lên và kéo xuống:

  • Kéo lên- Với cài đặt điện trở này, khi nhấn nút này, vi điều khiển hoặc Arduino có thể nhìn thấy hoặc đọc số XNUMX trên chân đó. Đó là, nó diễn giải nó như một tín hiệu THẤP.
  • Dỡ xuống: Trong trường hợp này thì ngược lại, bạn có thể đọc hoặc nhận tín hiệu 1 hoặc HIGH thông qua chân kết nối.

Đừng nhầm nó với NC hoặc NA, đó là một cái gì đó khác như chúng ta đã thấy trước đây. Cái này độc lập với cái kia ...

Chống trả lại

Các nút bấm có một phục hồi hiệu lực khi được nhấn. Có nghĩa là, khi nó được nhấn hoặc thả ra, sẽ có sự dao động trong tín hiệu đi qua các điểm tiếp xúc của nó và có thể khiến nó chuyển từ trạng thái HIGT sang THẤP hoặc ngược lại mà không thực sự muốn điều đó xảy ra. Điều đó có thể tạo ra hiệu ứng không mong muốn trên Arduino và khiến nó làm những điều kỳ lạ, chẳng hạn như kích hoạt một phần tử khi chúng ta thực sự muốn tắt nó bằng nút nhấn, v.v. Đó là bởi vì Arduino diễn giải các lần trả lại như thể nó đã được nhấn nhiều lần ...

Ảnh hưởng tiêu cực đó nó có một giải pháp. Đối với điều này, một tụ điện nhỏ phải được thực hiện trong mạch chống dội (phương pháp phần cứng) hoặc phần mềm (sửa đổi mã nguồn), cho dù cấu hình kéo lên hoặc kéo xuống đã được sử dụng chưa hoặc là NC hay NO. Trong tất cả những trường hợp này, giải pháp phải được thực hiện để tránh những đợt bật lại này.

Ví dụ, các mạch kéo lên và kéo xuống với tụ điện chống dội họ sẽ trông giống như thế này:

Trong khi phương pháp phần mềm Nó có thể được nhìn thấy trong đoạn mã này:

if (digitalRead (button) == LOW) // Kiểm tra xem nút có được nhấn không { ấn = 1; // Biến thay đổi giá trị } if (digitalRead (button) == HIGH && được nhấn == 1) { // Thực hiện hành động mong muốn ấn = 0; // Biến trở về giá trị ban đầu

}

Ví dụ dự án đơn giản

Khi chúng ta đã học chủ đề về các cách kết nối nút bấm và mạch chống dội ngược, chúng ta sẽ xem một ví dụ thực tế để điều khiển đèn LED bằng nút ấn. Đề án cũng đơn giản như bạn có thể thấy.

Sau khi kết nối chính xác, việc tiếp theo là viết mã trong Arduino IDE để lập trình bảng điều khiển của bạn và bắt đầu thử nghiệm với các nút. Một ví dụ mã đơn giản để điều khiển mạch của chúng tôi sẽ như sau:

// Ví dụ về sketch để điều khiển nút int pin = 2; trạng thái int; xung int = 0;

void setup ()

{
pinMode (2, INPUT); // Để đọc xung bằng cách thực hiện đầu vào chân đó

pinMode (13, OUTPUT); // Đối với đèn LED

Serial.begin (9600); }

void loop ()

{
if (digitalRead (2) == HIGH)

{

chốt = 2;

antiBounce (); // Gọi đến hàm chống thoát

} } // Chức năng chống trả lại phần mềm

void anti-bounce ()

{ while (digitalRead (pin) == LOW); trạng thái = digitalRead (13); digitalWrite (13,! trạng thái);

while (digitalRead (pin) == CAO);

}

Video liên quan

Chủ đề