Raspberry Pi Rotary Encoder (Encoder Quay)
Hướng dẫn này sẽ chỉ bạn cách sử dụng incremental rotary encoder với Raspberry Pi. 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 (một loại núm xoay khác)
- Cách kết nối vật lý rotary encoder với Raspberry Pi
- Cách viết code cho Raspberry Pi để đọc hướng xoay và vị trí từ rotary encoder.
Linh Kiện Cần Thiết
| 1 | × | Raspberry Pi 5 | ||
| 1 | × | encoder xoay | ||
| 1 | × | dây jumper | ||
| 1 | × | (Khuyến nghị) Screw Terminal Block Shield for Raspberry Pi | ||
| 1 | × | (Khuyến nghị) Raspberry Pi Prototyping Base Plate & Breadboard Kit | ||
| 1 | × | (Khuyến nghị) HDMI Touch Screen Monitor for Raspberry Pi |
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Về Rotary Encoder
Rotary encoder là một núm xoay có thể biến chuyển động xoay thành tín hiệu điện. Nó cho biết lượng xoay và vị trí hiện tại. Có hai loại chính:
- Incremental encoder: Sử dụng các tín hiệu xung để đo lượng thay đổi.
- Absolute encoder: Cung cấp mã duy nhất cho mỗi vị trí, giúp bạn biết chính xác vị trí 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

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

Bên trong encoder có một đĩa có các khe hở kết nối với một chân gọi là C, giống như một chân ground chung. Có thêm hai chân A và B.
- Khi bạn xoay núm, các chân A và B chạm vào chân ground chung C, nhưng theo một thứ tự nhất định tùy thuộc vào hướng xoay núm (thuận chiều kim đồng hồ hay 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 hơi khác nhau về thời gian vì một chân chạm ground trước chân kia. Hai tín hiệu lệch pha nhau 90 độ. Điều này được gọi là quadrature encoding.
- Khi bạn xoay núm theo chiều kim đồng hồ, chân A chạm ground trước chân B. Khi bạn xoay núm ngược chiều kim đồng hồ, chân B chạm ground trước chân A.
- Bằng cách theo dõi khi mỗi chân chạm hoặc rời khỏ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 kiểm tra điều gì xảy ra với chân B khi chân A thay đổi.

Khi A thay đổi trạng thái từ LOW sang HIGH:
- Nếu B ở mức LOW, núm được xoay theo chiều kim đồng hồ.
- Nếu B ở mức HIGH, núm được xoay ngược chiều kim đồng hồ.
※ Lưu ý:
Chân 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. Code được cung cấp bên dưới đã đượ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
- 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 được xoay ngược chiều 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 được xoay theo chiều kim đồng hồ, giảm bộ đếm xuống 1
Sơ Đồ Kết Nối

This image is created using Fritzing. Click to enlarge image
| Chân Rotary Encoder | Chân Raspberry Pi |
|---|---|
| CLK | GPIO 18 (Pin 12) |
| DT | GPIO 19 (Pin 35) |
| SW | GPIO 16 (Pin 36) |
| + (VCC) | 3.3V (Pin 1) |
| GND | GND (Pin 6) |
Code Raspberry Pi – Rotary Encoder
Code Raspberry Pi bên dưới thực hiện:
- Phát hiện hướng xoay và lượng xoay của encoder.
- Nếu phát hiện núm xoay một detent (click) theo chiều kim đồng hồ, tăng bộ đếm lên một.
- Nếu phát hiện núm xoay một detent (click) ngược chiều kim đồng hồ, giảm bộ đếm xuống một.
- Phát hiện nếu nút được nhấn.
Các Bước Thực Hiện
- Mới sử dụng Raspberry Pi? Hãy bắt đầu với hướng dẫn Raspberry Pi - Cài Đặt Phần Mềm để học các kiến thức cơ bản trước.
- Đảm bảo bạn đã cài đặt Raspbian hoặc bất kỳ hệ điều hành tương thích nào khác trên Pi.
- Đảm bảo Raspberry Pi của bạn được kết nối với cùng mạng cục bộ với PC.
- Đảm bảo Raspberry Pi của bạn được kết nối internet nếu bạn cần cài đặt một số thư viện.
- Kết nối PC của bạn với Raspberry Pi qua SSH sử dụng SSH client tích hợp trên Linux và macOS hoặc PuTTY trên Windows. Xem cách kết nối PC với Raspberry Pi qua SSH.
- Đảm bảo bạn đã cài đặt thư viện RPi.GPIO. Nếu chưa, cài đặt nó bằng lệnh sau:
- Tạo file script Python rotary_encoder.py và thêm code sau:
- Lưu file và chạy script Python bằng cách thực thi lệnh sau trong Terminal:
- Xoay núm theo chiều kim đồng hồ, sau đó ngược chiều kim đồng hồ
- Nhấn núm
- Kiểm tra kết quả trong Terminal.
Giải Thích Code
Hãy xem các comment từng dòng trong code
Ứng Dụng Raspberry Pi Rotary Encoder
Với Rotary Encoder, chúng ta có thể làm các ứng dụng sau nhưng không giới hạn:
- Raspberry Pi - Rotary Encoder điều khiển Vị trí của Servo Motor
- Raspberry Pi - Rotary Encoder điều khiển Độ sáng của LED
- Raspberry Pi - Rotary Encoder điều khiển Tốc độ của Stepper Motor
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.