Mục lục:

Một giải pháp quay Arduino hoàn chỉnh: 5 bước
Một giải pháp quay Arduino hoàn chỉnh: 5 bước

Video: Một giải pháp quay Arduino hoàn chỉnh: 5 bước

Video: Một giải pháp quay Arduino hoàn chỉnh: 5 bước
Video: [Arduino] Hướng dẫn cài đặt và sử dụng phần mềm Arduino IDE phiên bản mới nhất 2023 #led #arduino 2024, Tháng bảy
Anonim
Một giải pháp quay Arduino hoàn chỉnh
Một giải pháp quay Arduino hoàn chỉnh

Bộ mã hóa quay là các nút điều khiển có thể xoay cho các dự án điện tử, thường được sử dụng với các bộ vi điều khiển họ Arduino. Chúng có thể được sử dụng để tinh chỉnh các thông số, điều hướng menu, di chuyển các đối tượng trên màn hình, đặt các giá trị thuộc bất kỳ loại nào. Chúng là những thay thế phổ biến cho chiết áp, vì chúng có thể được xoay chính xác hơn và vô hạn, chúng tăng hoặc giảm một giá trị riêng biệt tại một thời điểm và thường được tích hợp với một công tắc có thể đẩy cho các chức năng loại lựa chọn. Chúng có đủ hình dạng và kích cỡ, nhưng khó có mức giá thấp nhất như được giải thích bên dưới.

Có vô số bài báo về chi tiết hoạt động và chế độ sử dụng của bộ mã hóa Rotary, cùng nhiều mã mẫu và thư viện về cách sử dụng chúng. Vấn đề duy nhất là không có mô-đun nào hoạt động chính xác 100% với các mô-đun quay của Trung Quốc có giá thấp nhất.

Bước 1: Bên trong bộ mã hóa quay

Bộ mã hóa quay bên trong
Bộ mã hóa quay bên trong
Bộ mã hóa quay bên trong
Bộ mã hóa quay bên trong
Bộ mã hóa quay bên trong
Bộ mã hóa quay bên trong

Phần quay của bộ mã hóa có ba chân (và hai chân nữa cho phần chuyển mạch tùy chọn). Một là điểm chung (GND đen), hai là để xác định hướng khi xoay núm (chúng thường được gọi là CLK xanh và DT đỏ). Cả hai đều được gắn vào chân đầu vào PULLUP của bộ vi điều khiển, làm cho mức CAO là giá trị đọc mặc định của chúng. Khi xoay núm về phía trước (hoặc theo chiều kim đồng hồ), đầu tiên CLK màu xanh lam giảm xuống mức THẤP, sau đó DT màu đỏ theo sau. Rẽ xa hơn, CLK màu xanh lam tăng trở lại mức CAO, sau đó khi bản vá GND chung rời cả hai chân kết nối, DT màu đỏ cũng tăng trở lại mức CAO. Như vậy là hoàn thành một lần đánh dấu FWD đầy đủ (hoặc theo chiều kim đồng hồ). Tương tự đi theo hướng khác BWD (hoặc ngược chiều kim đồng hồ), nhưng bây giờ màu đỏ giảm xuống đầu tiên và màu xanh tăng trở lại sau cùng như thể hiện trong hình ảnh hai cấp độ tương ứng.

Bước 2: Sự khốn khổ gây ra nỗi đau thực sự cho nhiều người

Sự khốn khổ gây ra nỗi đau thực sự cho nhiều người
Sự khốn khổ gây ra nỗi đau thực sự cho nhiều người
Sự khốn khổ gây ra nỗi đau thực sự cho nhiều người
Sự khốn khổ gây ra nỗi đau thực sự cho nhiều người
Sự khốn khổ gây ra nỗi đau thực sự cho nhiều người
Sự khốn khổ gây ra nỗi đau thực sự cho nhiều người

Vấn đề thường gặp đối với những người yêu thích Arduino, đó là các mô-đun bộ mã hóa Rotary giá rẻ trả lại những thay đổi bổ sung về mức đầu ra, gây ra các số đọc sai hướng và thừa. Điều này ngăn cản việc đếm hoàn hảo và không thể tích hợp các mô-đun này vào các dự án quay chính xác. Những lần dội lại này là do chuyển động cơ học của các miếng vá trên các chân kết nối và ngay cả việc áp dụng các tụ điện bổ sung cũng không thể loại bỏ chúng hoàn toàn. Số lần trả lại có thể xuất hiện ở bất kỳ đâu trong các chu kỳ đánh dấu đầy đủ và được minh họa bằng các tình huống thực tế trên hình ảnh.

Bước 3: Giải pháp Máy trạng thái hữu hạn (FSM)

Giải pháp Máy trạng thái hữu hạn (FSM)
Giải pháp Máy trạng thái hữu hạn (FSM)

Hình ảnh hiển thị không gian trạng thái đầy đủ của các thay đổi mức có thể xảy ra đối với hai chân (CLK màu xanh lam và DT màu đỏ), cho cả số lần trả lại đúng và sai. Dựa trên máy trạng thái này, một giải pháp hoàn chỉnh có thể được lập trình luôn hoạt động chính xác 100%. Bởi vì giải pháp này không cần có sự chậm trễ khi lọc, nên nó cũng là nhanh nhất có thể. Một lợi ích khác của việc tách không gian trạng thái của chân khỏi chế độ làm việc là người ta có thể áp dụng cả hai chế độ thăm dò hoặc ngắt theo ý thích của mình. Polling hoặc ngắt có thể phát hiện các thay đổi mức độ trên các chân và một quy trình riêng biệt sẽ tính toán trạng thái mới dựa trên trạng thái hiện tại và các sự kiện thực tế của sự thay đổi mức độ.

Bước 4: Mã Arduino

Mã Arduino
Mã Arduino

Đoạn mã dưới đây đếm số tích tắc FWD và BWD trên màn hình nối tiếp và cũng tích hợp chức năng chuyển đổi tùy chọn.

// Peter Csurgay 2019-04-10

// Các chân của vòng quay được ánh xạ tới các cổng Arduino

#define SW 21 #define CLK 22 #define DT 23

// Giá trị hiện tại và trước đó của bộ đếm được điều chỉnh bởi con quay

int curVal = 0; int presVal = 0;

// Bảy trạng thái của FSM (máy trạng thái hữu hạn)

#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;

void setup () {

Serial.begin (250000); Serial.println ("Bắt đầu…"); // Mức HIGH sẽ được mặc định cho tất cả các chân pinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Cả CLK và DT sẽ loại bỏ các ngắt đối với tất cả các thay đổi ở mức độ AttachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); mountInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

void loop () {

// Xử lý công tắc tùy chọn được tích hợp vào một số bộ mã hóa quay if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Mọi thay đổi về giá trị bộ đếm được hiển thị trong Serial Monitor if (curVal! = PresVal) {Serial.println (curVal); presVal = curVal; }}

// Chuyển đổi Máy trạng thái để thay đổi mức CLK

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; else if (state == SCLK_10) state = SCLK_00; else if (state == SDT_10) state = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; else if (state == SCLK_00) state = SCLK_10; else if (state == SDT_00) state = SDT_10; else if (state == SDT_01) {state = IDLE_11; curVal--; }}}

// Chuyển đổi Máy trạng thái để thay đổi mức DT

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; else if (state == SDT_01) state = SDT_00; else if (state == SCLK_01) state = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (state == SDT_00) state = SDT_01; else if (state == SCLK_00) state = SCLK_01; else if (state == SCLK_10) {state = IDLE_11; curVal ++; }}}

Bước 5: Tích hợp hoàn hảo

Bạn có thể kiểm tra trong video đính kèm rằng giải pháp FSM hoạt động chính xác và nhanh chóng ngay cả trong trường hợp bộ mã hóa quay phạm vi thấp với nhiều hiệu ứng trả lại lẻ tẻ khác nhau.

Đề xuất: