Arduino UNO R4 Rotary Encoder
Trong hướng dẫn này, chúng ta sẽ học cách sử dụng incremental encoder với Arduino UNO R4. Chúng ta sẽ tìm hiểu:
- Cách hoạt động của rotary encoder
- Sự khác biệt giữa rotary encoder và potentiometer
- Cách kết nối rotary encoder với Arduino UNO R4
- Lập trình Arduino UNO R4 để đọc giá trị từ rotary encoder mà không sử dụng interrupt
- Lập trình Arduino UNO R4 để đọc giá trị từ rotary encoder với interrupt

Phần Cứng Cần Thiết
| 1 | × | Arduino UNO R4 WiFi hoặc Arduino UNO R4 Minima | ||
| 1 | × | (Tùy chọn) DIYables STEM V4 IoT, tương thích với Arduino Uno R4 WiFi | ||
| 1 | × | Arduino UNO R4 Minima (Thay thế) | ||
| 1 | × | USB Cable Type-A to Type-C (for USB-A PC) | ||
| 1 | × | USB Cable Type-C to Type-C (for USB-C PC) | ||
| 1 | × | encoder xoay | ||
| 1 | × | dây jumper | ||
| 1 | × | (Khuyến nghị) Screw Terminal Block Shield for Arduino UNO R4 | ||
| 1 | × | (Khuyến nghị) Breadboard Shield for Arduino UNO R4 | ||
| 1 | × | (Khuyến nghị) Enclosure for Arduino UNO R4 | ||
| 1 | × | (Khuyến nghị) Power Splitter for Arduino UNO R4 | ||
| 1 | × | (Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO |
Or you can buy the following kits:
| 1 | × | DIYables STEM V4 IoT Starter Kit (Arduino included) | ||
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Về Rotary Encoder
Rotary encoder là thiết bị chuyển đổi chuyển động quay thành tín hiệu điện. Nó kiểm tra việc xoay và vị trí của trục hoặc núm xoay. Có hai loại chính:
- Incremental encoder: Tạo ra các xung để đo sự thay đổi vị trí.
- Absolute encoder: Cung cấp một mã số kỹ thuật số đặc biệt cho mỗi vị trí, làm cho nó hoàn hảo cho việc định vị chính xác, ngay cả khi mất điện.
Hướng dẫn này tập trung vào incremental encoder.
Sơ Đồ Chân Rotary Encoder

Module rotary encoder có bốn chân:
- Chân CLK (Output A): Chân này gửi tín hiệu mỗi khi bạn xoay núm một click theo bất kỳ hướng nào, hiển thị một chu kỳ tín hiệu hoàn chỉnh từ LOW đến HIGH rồi về LOW. Điều này cho chúng ta biết núm đã được xoay bao nhiêu.
- Chân DT (Output B): Tương tự như chân CLK, nhưng tín hiệu từ chân này bị trễ một chút, xảy ra 90 độ sau tín hiệu CLK. Độ trễ này giúp chúng ta xác định chiều xoay là thuận chiều kim đồng hồ hay ngược chiều kim đồng hồ.
- Chân SW: Kết nối với nút nhấn bên trong của encoder, thường ở trạng thái mở. Sử dụng điện trở pull-up trên chân này có nghĩa là nó sẽ hiển thị HIGH khi núm không được nhấn và LOW khi được nhấn.
- Chân VCC (+): Kết nối chân này với nguồn cung cấp từ 3.3 đến 5 volt.
- Chân GND: Kết nối chân này với ground (0V).
Rotary Encoder so với Potentiometer
Bạn có thể nhầm lẫn giữa rotary encoder với Arduino UNO R4 - Potentiometer (Biến Trở), nhưng chúng là các linh kiện khác nhau. Đây là cách so sánh:
- Rotary encoder có thể xoay hoàn toàn liên tục, nhưng potentiometer chỉ có thể xoay khoảng ba phần tư của một vòng tròn.
- Rotary encoder đưa ra các xung, trong khi potentiometer đưa ra điện áp analog.
- Rotary encoder hữu ích để biết núm đã xoay bao nhiêu, nhưng không biết vị trí chính xác của nó. Potentiometer tốt để tìm ra vị trí chính xác của núm.
Cách Hoạt Động Của Rotary Encoder

Trong encoder, có một đĩa có rãnh liên kết với chân tên C, hoạt động như ground chung. Cũng có hai chân bổ sung A và B.
- Khi bạn xoay núm, các chân A và B tiếp xúc với chân ground chung C, nhưng theo một trình tự cụ thể dựa trên hướng xoay, thuận chiều hoặc ngược chiều kim đồng hồ.
- Tiếp xúc này tạo ra hai tín hiệu hơi khác nhau về thời gian vì một chân kết nối với ground trước chân kia. Các tín hiệu này lệch nhau 90 độ, và điều này được gọi là quadrature encoding.
- Xoay núm thuận chiều kim đồng hồ làm cho chân A tiếp xúc với ground sớm hơn chân B. Xoay ngược chiều kim đồng hồ làm cho chân B tiếp xúc với ground trước chân A.
- Bằng cách quan sát khi mỗi chân tiếp xúc hoặc ngắt kết nối với ground, chúng ta có thể xác định hướng xoay của núm. Chúng ta làm điều này bằng cách phân tích sự thay đổi ở chân B so với chân A.

Khi A chuyển từ LOW sang HIGH:
- Xoay núm thuận chiều kim đồng hồ nếu B là LOW.
- Xoay núm ngược chiều kim đồng hồ nếu B là HIGH.
※ Lưu ý:
Chân A và B được kết nối với các chân CLK và DT. Cách sắp xếp có thể khác nhau tùy theo nhà sản xuất. Các code được cung cấp ở đây đã được kiểm tra với Rotary Encoder từ DIYables.
Cách Lập Trình Cho Rotary Encoder
- Kiểm tra tín hiệu từ chân CLK.
- Khi tín hiệu thay đổi từ LOW sang HIGH, kiểm tra chân DT đang hiển thị gì.
- Nếu chân DT hiển thị HIGH, núm được xoay ngược chiều kim đồng hồ. Cộng 1 vào bộ đếm.
- Nếu chân DT hiển thị LOW, núm được xoay thuận chiều kim đồng hồ. Trừ 1 từ bộ đếm.
Sơ Đồ Đấu Nối

This image is created using Fritzing. Click to enlarge image
Code Arduino UNO R4 – Rotary Encoder Không Dùng Interrupt
Code Arduino UNO R4 này thực hiện các hành động sau:
- Nó cảm nhận cách thức và mức độ xoay của encoder.
- Nếu cảm nhận thấy núm được xoay một click sang phải, nó cộng một vào bộ đếm.
- Nếu cảm nhận thấy núm được xoay một click sang trái, nó giảm bộ đếm đi một.
- Nó nhận biết nếu nút được nhấn.
Chúng ta sử dụng thư viện ezButton để làm cho code debouncing nút đơn giản hơn.
Các Bước Nhanh
Thực hiện theo các hướng dẫn từng bước:
- Nếu đây là lần đầu tiên bạn sử dụng Arduino Uno R4 WiFi/Minima, hãy tham khảo hướng dẫn về Arduino UNO R4 - Cài Đặt Phần Mềm.
- Kết nối rotary encoder với Arduino UNO R4 theo sơ đồ được cung cấp.
- Kết nối board Arduino Uno R4 với máy tính của bạn bằng cáp USB.
- Khởi động Arduino IDE trên máy tính của bạn.
- Chọn board Arduino Uno R4 thích hợp (ví dụ: Arduino Uno R4 WiFi) và cổng COM.
- Thêm thư viện ezButton vào Arduino IDE. Để biết hướng dẫn, hãy truy cập liên kết này: [ezButton library](https://arduinogetstarted.com/tutorials/arduino-button-library#content_how_to_install
- Sao chép code được cung cấp và mở nó trong Arduino IDE.
- Nhấp vào nút Upload trong Arduino IDE để tải code lên Arduino UNO R4.
- Xoay núm thuận chiều kim đồng hồ rồi ngược chiều kim đồng hồ.
- Nhấn núm.
- Kiểm tra kết quả trên Serial Monitor.
Giải Thích Code
Xem các comment trong code cho từng dòng.
Code Arduino UNO R4 – Rotary Encoder Với Interrupt
Trong ví dụ code trước, chúng ta đã sử dụng phương pháp polling, liên tục kiểm tra trạng thái của chân. Phương pháp này có hai nhược điểm:
- Sử dụng tài nguyên Arduino UNO R4 không hiệu quả
- Một số số đếm có thể bị bỏ qua nếu code khác mất quá nhiều thời gian để thực thi.
Một phương pháp để kiểm soát điều này là thông qua interrupt. Interrupt giúp tránh việc phải liên tục kiểm tra một sự kiện cụ thể. Điều này cho phép Arduino UNO R4 thực hiện các tác vụ khác trong khi vẫn giám sát các sự kiện.
Hãy xem code dưới đây sử dụng interrupt để đọc giá trị từ encoder.
- Sao chép code được cung cấp và mở nó trong Arduino IDE.
- Nhấp vào nút Upload trong Arduino IDE để tải code lên Arduino UNO R4.
Bây giờ, khi bạn xoay núm, bạn sẽ thấy thông tin xuất hiện trên Serial Monitor, tương tự như những gì bạn đã thấy trước đây trong code trước.
※ Lưu ý:
- Để kết nối chân CLK của encoder với Arduino UNO R4 sử dụng interrupt, bạn nên sử dụng chân 2 hoặc 3. Đây là những chân duy nhất hỗ trợ interrupt.
- Một số hướng dẫn trực tuyến có thể gợi ý sử dụng hai interrupt cho một encoder, nhưng điều này không cần thiết. Chỉ sử dụng một interrupt là đủ.
- Đảm bảo bạn sử dụng từ khóa volatile cho bất kỳ biến toàn cục nào trong interrupt để tránh vấn đề.
- Giữ lập trình bên trong interrupt đơn giản. Không sử dụng Serial.print() hoặc Serial.println() ở đó.
Video Tutorial
Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.