В этой статье мы узнаем, как работает энкодер и как подключить его к Ардуино без применения библиотек.

Что такое энкодер
Угловой энкодер — это тип датчика положения, который используется для определения углового положения вращающегося вала. Он генерирует электрический сигнал, аналоговый или цифровой, в зависимости от вращательного движения.
Существует множество различных типов энкодеров, которые классифицируются либо по выходному сигналу, либо по сенсорной технологии. Конкретный поворотный энкодер, который мы будем использовать в этой статье, представляет собой инкрементальный угловой энкодер, и это самый простой датчик положения для измерения вращения.
Этот угловой энкодер также известен как квадратурный энкодер или относительный угловой энкодер. Сигнал с его выход представляет собой серию прямоугольных импульсов.

Как работает поворотный энкодер
Давайте подробнее рассмотрим энкодер и разберемся, как он работает. Вот как генерируются прямоугольные импульсы: энкодер имеет диск с равномерно расположенными контактными зонами, которые подключены к общему контакту C и двум другим отдельным контактам A и B, как показано ниже:
Когда диск начнет шаг за шагом вращаться, контакты A и B замыкаются с общим контактом, в результате чего происходит генерация двух выходных сигналов прямоугольной формы.
Любой из двух выходов может использоваться для определения повернутого положения, если мы просто подсчитываем количество импульсов сигнала. Однако, если мы хотим также определить направление вращения, нам нужно рассматривать оба сигнала одновременно.
Мы можем заметить, что оба выходных сигнала смещены по фазе на 90 градусов друг относительно друга. Если энкодер вращается по часовой стрелке, сигнал с выход A будет опережать сигнал с выхода B:
Поэтому, если мы будем считать шаги каждый раз, когда сигнал изменяется (с высокого на низкий или с низкого на высокий), мы можем заметить, что в это время два выходных сигнала имеют противоположные значения.
Учитывая это, мы можем легко запрограммировать Ардуино на считывание положения энкодера и направления вращения.
Подключение энкодера к Ардуино без библиотек
Давайте проверим это на практическом примере, используя Ардуино. Конкретный модуль энкодера, который мы будем использовать в этом примере, поставляется на коммутационной плате и имеет пять контактов.
Рассмотрим распиновку данного энкодера:
- выход A
- выход B
- кнопка
- VCC
- GND
Мы можем подключить выходные контакты к любому цифровому выводу платы Ардуино.
Скетч для проверки работы энкодера:
#define outputA 6 #define outputB 7 int counter = 0; int aState; int aLastState; void setup() { pinMode (outputA,INPUT); pinMode (outputB,INPUT); Serial.begin (9600); // Считывает начальное состояние выхода A aLastState = digitalRead(outputA); } void loop() { aState = digitalRead(outputA); // Считывает "текущее" состояние выхода A // Если предыдущее и текущее состояние выхода A различаются, это означает, что произошел импульс. if (aState != aLastState){ // Если состояние выхода B отличается от состояния выхода A, это означает, что энкодер вращается по часовой стрелке. if (digitalRead(outputB) != aState) { counter ++; } else { counter --; } Serial.print("Position: "); Serial.println(counter); } aLastState = aState; // Обновляет предыдущее состояние выхода A текущим состоянием }
Разбор кода: Итак, сначала нам нужно определить контакты, к которым подключен наш поворотный энкодер, и определить некоторые переменные, необходимые для программы.
В разделе setup() нам нужно определить два контакта в качестве входов, запустить последовательную связь для печати результатов в монитор последовательного порта, а также прочитать начальное значение выхода «A» и поместить значение в переменную aLastState.
Затем в разделе цикла мы снова читаем состояние вывода «A», но теперь мы помещаем значение в переменную aState. Таким образом, если мы повернем энкодер и будет сгенерирован импульс, эти два значения будут отличаться, и первое утверждение «if» станет истинным.
Сразу после этого с помощью второго оператора «if» мы определяем направление вращения. Если состояние выхода «B» отличается от состояния выхода «A», счетчик будет увеличен на единицу, иначе он будет уменьшен.
В конце, после печати результатов в монитор последовательного порта, нам нужно обновить переменную aLastState с помощью переменной aState.
Это все, что нам нужно для этого примера. Если мы загрузим скетч в Ардуино, запустим Serial Monitor и начните вращать энкодер, то мы начнем получать значения в последовательном мониторе. Конкретный модуль, который у нас есть в наличии, делает 30 отсчетов за каждый полный цикл.
