Arduino Bộ mã hóa quay
Trong bài hướng dẫn này, chúng ta sẽ học cách sử dụng bộ mã hóa gia tăng với Arduino. Cụ thể, chúng ta sẽ học:
- Cách hoạt động của bộ mã hóa quay
- Bộ mã hóa quay so với biến trở
- Cách kết nối bộ mã hóa quay với Arduino
- Cách lập trình Arduino để đọc hướng và vị trí từ bộ mã hóa quay mà không có ngắt
- Cách lập trình Arduino để đọc hướng và vị trí từ bộ mã hóa quay với ngắt
Phần cứng cần chuẩn bị
| 1 | × | Arduino Uno R3 | ||
| 1 | × | USB 2.0 cable type A/B (for USB-A PC) | ||
| 1 | × | USB 2.0 cable type C/B (for USB-C PC) | ||
| 1 | × | encoder xoay | ||
| 1 | × | dây jumper | ||
| 1 | × | (Khuyến nghị) Screw Terminal Block Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Breadboard Shield for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Enclosure for Arduino Uno | ||
| 1 | × | (Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO |
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | ||
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Về Bộ Mã Hóa Quay
Bộ mã hóa quay là một thiết bị điện cơ có chức năng chuyển đổi chuyển động quay thành tín hiệu điện. Nó đo vòng quay và vị trí của một trục hoặc núm. Có hai loại chính:
- Bộ mã hóa gia tăng: tạo ra các xung để đo sự thay đổi tương đối
- Bộ mã hóa tuyệt đối: cung cấp một mã số kỹ thuật số duy nhất cho mỗi vị trí, làm cho chúng lý tưởng cho định vị chính xác ngay cả sau khi nguồn bị mất.
Hướng dẫn này nói về bộ mã hóa gia tăng.
Sơ đồ chân của mô-đun mã hóa quay

Một mô-đun mã hóa quay có 4 chân:
- Chân CLK (Đầu ra A): là xung chính cho biết lượng quay đã xảy ra. Mỗi khi bạn xoay núm một nấc (click) ở bất kỳ hướng nào, chân CLK sẽ phát ra tín hiệu hoàn thành một chu trình đầy đủ (LOW → HIGH → LOW).
- Chân DT (Đầu ra B): hoạt động như chân CLK nhưng tín hiệu phát ra trễ hơn CLK 90 độ. Nó giúp ta xác định hướng quay (theo kim đồng hồ hoặc ngược kim đồng hồ).
- Chân SW: là tín hiệu từ nút nhấn bên trong encoder. Nó thường mở. Nếu chúng ta sử dụng điện trở kéo lên ở chân này, chân SW sẽ ở HIGH khi núm không được nhấn, và LOW khi được nhấn.
- Chân VCC (+): cần được kết nối với nguồn VCC (từ 3,3 V đến 5 V).
- Chân GND: cần được kết nối với GND (0 V).
Bộ mã hóa quay so với biến trở
Bạn có thể bị nhầm lẫn giữa bộ mã hóa quay và Arduino - Biến trở. Tuy nhiên, chúng là hai thành phần khác nhau. Dưới đây là một so sánh giữa chúng:
- Bộ mã hóa quay giống như phiên bản hiện đại của điện trở biến thiên, nhưng nó có thể làm được nhiều chức năng hơn.
- Bộ mã hóa quay có thể quay vòng 360 độ liên tục mà không dừng lại, trong khi điện trở biến thiên chỉ có thể quay được khoảng 3/4 vòng.
- Bộ mã hóa quay phát ra xung, trong khi điện trở biến thiên phát ra điện áp tương tự.
- Bộ mã hóa quay tiện dụng khi bạn chỉ cần biết mức di chuyển của núm vặn, chứ không cần biết chính xác nó đang ở vị trí nào. Điện trở biến thiên hữu ích khi bạn thực sự cần biết chính xác núm vặn đang ở vị trí nào.
Cách hoạt động của bộ mã hóa quay

Ở bên trong bộ mã hóa, có một đĩa với các khe được nối tới một chân gọi là C, chân này giống như đất chung. Còn có hai chân nữa là A và B.
- Khi bạn xoay núm, các chân A và B chạm vào chân đất chung C, nhưng theo một trình tự nhất định tùy vào hướng xoay của núm (theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ).
- Những lần chạm này tạo ra hai tín hiệu. Chúng lệch thời gian so với nhau do một chân chạm đất trước chân kia. Hai tín hiệu cách nhau 90 độ về thời gian. Điều này được gọi là mã hóa vuông góc.
- Khi bạn xoay núm theo hướng kim đồng hồ, chân A chạm đất trước chân B. Khi bạn xoay núm theo hướng ngược chiều kim đồng hồ, chân B chạm đất trước chân A.
- Bằng cách theo dõi thời điểm mỗi chân chạm vào đất hoặc rời khỏi đất, chúng ta có thể xác định núm đang quay theo hướng nào. Chúng ta làm điều này bằng cách xem chân B phản ứng thế nào khi chân A thay đổi.

Khi A thay đổi trạng thái từ THẤP sang CAO:
- Nếu B ở mức thấp, nút vặn quay theo chiều kim đồng hồ.
- Nếu B ở mức cao, nút vặn quay ngược chiều kim đồng hồ.
※ Lưu ý:
Pin A và B được kết nối với các chân CLK và DT. Tuy nhiên, tùy thuộc vào nhà sản xuất, thứ tự có thể khác nhau. Các mã được cung cấp dưới đây đã được kiểm tra với bộ mã hóa quay từ DIYables
Cách lập trình cho bộ mã hóa quay
- Kiểm tra tín hiệu từ chân CLK
- Nếu trạng thái thay đổi từ LOW sang HIGH, kiểm tra trạng thái của chân DT.
- Nếu trạng thái của chân DT là HIGH, núm vặn quay theo chiều ngược kim đồng hồ, tăng bộ đếm lên 1
- Nếu trạng thái của chân DT là LOW, núm vặn quay theo chiều kim đồng hồ, giảm bộ đếm xuống 1
Sơ đồ đấu dây

This image is created using Fritzing. Click to enlarge image
Mã Arduino – Bộ mã hóa quay không dùng ngắt
Mã Arduino dưới đây thực hiện:
- Nhận diện hướng và lượng quay của bộ mã hóa.
- Nếu phát hiện núm quay đã quay một nấc (click) theo chiều kim đồng hồ, tăng bộ đếm lên một.
- Nếu phát hiện núm quay đã quay một nấc (click) theo ngược chiều kim đồng hồ, giảm bộ đếm xuống một.
- Nhận biết khi nút được nhấn.
Để đơn giản hóa mã debounce cho nút, thư viện ezButton được sử dụng.
Hướng dẫn từng bước
- Cài đặt thư viện ezButton trên Arduino IDE. Xem How To
- Sao chép mã ở trên và mở bằng Arduino IDE
- Nhấn nút Upload trên Arduino IDE để tải mã lên cho Arduino
- Quay núm theo chiều kim đồng hồ, rồi quay ngược chiều kim đồng hồ
- Nhấn núm
- Xem kết quả trên Serial Monitor.
Giải thích mã nguồn
Xem các chú thích theo từng dòng trong mã nguồn.
Mã Arduino – Bộ mã hóa quay với ngắt
Trong mã ví dụ trước, chúng ta sử dụng phương pháp polling, phương pháp này liên tục kiểm tra trạng thái của pin. Điều này có hai nhược điểm:
- Lãng phí tài nguyên Arduino
- Một số bộ đếm có thể bị bỏ qua nếu mã khác mất nhiều thời gian để thực thi.
Một cách tiếp cận để xử lý điều này là sử dụng ngắt. Ngắt loại bỏ nhu cầu phải liên tục kiểm tra một sự kiện cụ thể. Điều này cho phép Arduino thực hiện các tác vụ khác mà không bỏ lỡ một sự kiện.
Đây là một ví dụ về cách đọc một bộ mã hóa quay bằng ngắt.
Giờ đây, khi bạn xoay núm, bạn sẽ thấy thông tin xuất hiện trên Serial Monitor, giống như những gì bạn đã thấy trong mã trước đây.
※ Lưu ý:
- Nếu bạn sử dụng ngắt, bạn cần kết nối chân CLK của bộ mã hóa với một chân Arduino có thể xử lý ngắt. Nhưng hãy nhớ, không phải tất cả các chân Arduino có thể làm được điều này. Ví dụ, trên Arduino Uno, chỉ có chân 2 và 3 có thể làm việc với ngắt.
- Bạn có thể gặp các bài hướng dẫn trên các trang web khác sử dụng hai ngắt cho một bộ mã hóa duy nhất, nhưng điều này là không cần thiết và lãng phí. Chỉ cần một ngắt là đủ.
- Quan trọng là sử dụng từ khóa volatile cho các biến toàn cục được dùng trong ngắt. Bỏ qua điều này có thể dẫn đến những vấn đề bất ngờ.
- Giữ mã trong ngắt càng đơn giản càng tốt. Tránh sử dụng Serial.print() hoặc Serial.println() bên trong ngắt.
Ứng dụng bộ mã hóa quay Arduino
Với bộ mã hóa quay, chúng ta có thể thực hiện các ứng dụng sau, nhưng không giới hạn ở:
- Arduino - Bộ mã hóa quay điều khiển vị trí của động cơ servo
- Arduino - Bộ mã hóa quay điều khiển độ sáng của đèn LED
- Arduino - Bộ mã hóa quay điều khiển tốc độ của động cơ bước
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.