В данной статье мы рассмотрим подключение к плате Raspberry Pi Pico инкрементального энкодера и программирование работы с ним на языке MicroPython. Инкрементальные энкодеры (также называемые энкодерами вращения) — это популярные устройства ввода, которые можно использовать для измерения и контроля положения и вращения вала. Плата Raspberry Pi Pico с его контактами и относительно невысокой ценой обеспечивает отличную платформу для интеграции инкрементального энкодера в ваши проекты.
Также на нашем сайте мы рассматривали подключение инкрементального энкодера к другим микроконтроллерам (платам):
Необходимые компоненты
- Плата Raspberry Pi Pico (купить на AliExpress).
- Инкрементальный энкодер (купить на AliExpress).
Разница между инкрементальными энкодерами и потенциометрами
Хотя потенциометры и инкрементальные энкодеры могут выглядеть одинаково, они достаточно сильно отличаются друг от друга.
Основное различие между инкрементальными энкодерами и потенциометрами заключается в особенностях их использования. Инкрементальные энкодеры используются там, где нам нужно знать изменение движения ручки, а потенциометры используются там, где необходимо измерить точное положение ручки.
Степень движения также сильно различается, в то время как инкрементальный энкодер может непрерывно перемещаться в любом направлении, потенциометр может перемещаться только на 270 градусов.
Принципы работы инкрементального энкодера
Распиновка инкрементального энкодера
Модуль инкрементального энкодера содержит 5 контактов: GND, +(VCC), SW(Switch), DT и CLK. Все эти контакты являются цифровыми, за исключением контактов VCC и Ground. Назначение контактов (распиновка) инкрементального энкодера представлена на следующем рисунке.
GND – контакт общего провода (земли) инкрементального энкодера, в нашем проекте его необходимо подключить к общему проводу (ground pin) платы Arduino.
VCC – контакт для подачи питания на инкрементальный энкодер, его необходимо подключать к источнику напряжения питания 5V или 3.3V.
SW (switch pin) – контакт переключения энкодера. Инкрементальный энкодер, который мы используем, содержит внутри себя кнопку, которая активируется при нажатии на верхний край его рукоятки (оси). В активном состоянии эта кнопка формирует уровень LOW.
DT – данный контакт представляет собой фактически то же самое что и контакт CLK, но последовательность импульсов на нем сдвинута по фазе на 90 градусов относительно контакта CLK.
CLK – главный контакт модуля инкрементального энкодера. Каждый раз при вращении рукоятки выходной импульс на нем сменяет свое состояние с High на Low.
Как работает инкрементальный энкодер
Если посмотрим внутрь инкрементального энкодера, то там мы увидим диск с большим количеством вырезанных в нем отверстий. Логика выходных импульсов энкодера определяется его двумя контактами, показанными на рисунке ниже. Пластина энкодера подключается к общему проводу схемы.
При вращении оси энкодера его контакты Output A и Output B вступают в контакт с его пластиной в определенном порядке, который зависит от направления вращения оси энкодера. Если ось энкодера вращается по часовой стрелке, то сначала с пластиной соединяется output A, а потом output B. Если ось энкодера вращается против часовой стрелки, то все происходит с точностью наоборот. Таким образом, при любом направлении вращения оси энкодера сигналы на его выходах output A и output B сдвинуты на до градусов относительно друг друга.
На представленной анимации если мы вращаем ось энкодера по часовой стрелке, контакт A подключается первым, а потом подключается контакт B. Отслеживая какой контакт подключился к пластине первым мы можем определить направление вращения оси энкодера и, соответственно, мы можем инкрементировать или декрементировать состояние счетчика в нашей программе.
Компоненты модуля инкрементального энкодера
Это очень дешевый и простой в использовании модуль, который может быть использован в разнообразных приложениях. В зависимости от направления вращения своей оси он генерирует последовательность цифровых сигналов на своих контактах DATA и clock. Если импульсы начинаются с контакта data, а импульсы на контакте CLK сдвинуты относительно него на 90 градусов, это значит что ось энкодера вращается по часовой стрелке, иначе она вращается против часовой стрелки.
Если вы посмотрите внимательно на модуль инкрементального энкодера, то вы увидите, что на его печатной плате сравнительно мало элементов: на фронтальной части мы видим рукоятку энкодера и контакты, а на тыльной части только подтягивающие резисторы. Фактически, инкрементальный энкодер – это механическое устройство, способное работать с уровнями напряжения 3.3V и 5V.
Наиболее часто задаваемые вопросы про инкрементальный энкодер
Где применяются инкрементальные энкодеры?
Достаточно часто они применяются для управления скоростью и направлением движения ленты транспортёра. Также они востребованы в системах распределения товаров на складах, системах обработки багажа и упаковочных системах.
Какие типы энкодеров существуют?
Энкодеры выпускаются 4-х основных типов: механические, оптические, магнитные и электромагнитные.
Какие сигналы на выходе энкодера?
Инкрементальные энкодеры, также называемые энкодерами с ручкой, представляют собой электромеханические устройства, которые преобразуют угловое положение своей оси в аналоговые или цифровые выходные сигналы. Существует два основных типа подобных энкодеров: абсолютные и инкрементальные.
Что лучше: инкрементальный энкодер или потенциометр?
Основным преимуществом инкрементальных энкодеров перед потенциометрами является то, что они могут вращаться в одном направлении бесконечно долго, что позволяет значительно увеличить точность регулировки необходимого параметра. А потенциометры могут совершать в обоих направлениях только по одному обороту, что не всегда удобно для управления какими либо процессами.
Что такое джиттер энкодера?
Джиттер (дрожание) сигнала энкодера заключается в непостоянстве формы импульсов на выходах двух каналов энкодера относительно друг друга, что приводит к нежелательному смещению импульса вперед или назад.
Схема модуля инкрементального энкодера
Модуль инкрементального энкодера состоит из легко доступных компонентов общего назначения, в простейшем случае это сам энкодер и три подтягивающих резистора. Схема энкодера показана на следующем рисунке.
Схема проекта
Схема подключения инкрементального энкодера к плате Raspberry Pi Pico представлена на следующем рисунке.
В схеме необходимо сделать следующие соединения:
- соединить контакт VCC энкодера с контактом 3.3V Raspberry Pi Pico;
- соединить контакт GND энкодера с контактом GND Raspberry Pi Pico.
- соединить контакт DATA энкодера с контактом 25 Raspberry Pi Pico.
- соединить контакт CLK энкодера с контактом 24 Raspberry Pi Pico.
- если ваш инкрементальный энкодер содержит встроенный выключатель, вы можете подключить его контакт SW к цифровому контакту платы (например, контакту 26).
Объяснение программы для Raspberry Pi Pico
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.Если вы еще не знакомы с программированием подобной платы, то рекомендуем посмотреть статью про начало работы с Raspberry Pi Pico на MicroPython.
Код нашей программы включает дополнительную проверку прерываний от клавиатуры для корректного выхода из программы, а также показывает вывод при нажатии центральной кнопки.
Первым делом в коде программы импортируем необходимые библиотеки.
1 2 3 |
import time from rotary_irq_rp2 import RotaryIRQ from machine import Pin |
В следующей строчке кода мы создадим объект SW на контакте ввода/вывода (GPIO) 20 и сконфигурируем его на работу в режим ввода данных с подтягивающим резистором.
1 |
SW = Pin(20, Pin.IN, Pin.PULL_UP) |
Затем создадим объект для работы с инкрементальным энкодером под именем r. При создании этого объекта установим необходимые параметры для работы с ним.
1 2 3 4 5 |
r = RotaryIRQ(pin_num_clk=18, pin_num_dt=19, min_val=0, reverse=False, range_mode=RotaryIRQ.RANGE_UNBOUNDED) |
Инициализируем переменную val_old начальной позицией энкодера.
1 |
val_old = r.value() |
В основном цикле программы мы будем непрерывно считывать позицию энкодера с помощью метода r.value() и сохранять ее в переменную val_new. Если мы будем нажимать кнопку на энкодера, которая у нас подключена к контакту 20 платы, мы будем выводить на экран сообщение Button Pressed" и значение переменной val_new. Это значение продолжит выводиться на печать до тех пор пока кнопка энкодера будет нажата (SW.value() == 0). Если значение позиции оси энкодера будет меняться (val_old будет отличаться от val_new), мы будем обновлять значение val_old и выводить новое значение на экран. Функция time.sleep_ms(50) будет останавливать выполнение программы на 50 миллисекунд перед очередной итерацией основного цикла. Если будет обнаруживаться прерывание от клавиатуры (нажатие клавиш Ctrl+C) мы будем осуществлять выход из программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
while True: try: val_new = r.value() if SW.value() == 0: print("Button Pressed") print("Selected Number is:", val_new) while SW.value() == 0: continue if val_old != val_new: val_old = val_new print('result =', val_new) time.sleep_ms(50) except KeyboardInterrupt: break |
Тестирование работы проекта показано на следующем видео.
На нем вы можете видеть вывод данных на экран при нажатии центральной кнопки энкодера.
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import time from rotary_irq_rp2 import RotaryIRQ from machine import Pin SW=Pin(20,Pin.IN,Pin.PULL_UP) r = RotaryIRQ(pin_num_clk=18, pin_num_dt=19, min_val=0, reverse=False, range_mode=RotaryIRQ.RANGE_UNBOUNDED) val_old = r.value() while True: try: val_new = r.value() if SW.value()==0: print("Button Pressed") print("Selected Number is : ",val_new) while SW.value()==0: continue if val_old != val_new: val_old = val_new print('result =', val_new) time.sleep_ms(50) except KeyboardInterrupt: break |