Как подключить энкодер к Ардуино

Содержание

Энкодер — это устройство, которое преобразует вращательное движение вала в серию электрических импульсов. Некоторые знают определенные виды оборудования, где ручка способна вращаться при настройке какого-то параметра (например, аудиоусилителя). Некоторые из них также оснащены кнопкой, где при нажатии на ось происходит контакт (например, в устройствах, использующихся на многих музыкальных контроллерах). Они бывают всех видов разрешений, считывают от 16 до 1024 сигналов при полном обороте.

Энкодеры также очень часто используются для подсчета угла поворота в двигателях. В автоматизации и робототехнике, это крайне необходимые устройства. Далее рассмотрен принцип работы и подключения устройства.

Типы поворотных энкодеров и как они работают

Прежде чем разбирать принцип подключения энкодера, стоит рассмотреть основные виды этих устройств и разобрать их конструкцию.

Механический поворотный энкодер

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

Механический поворотный энкодер

Механический поворотный энкодер — это распространенный, недорогой вариант, который состоит из металлического диска и работает следующим образом:

  1. Металлический диск, расположенный на вале, используется вместе со стационарным подборщиком и вращается.
  2. Во время вращения, создается уникальный сигнал преобразуемый в код.
  3. Это означает, что каждое изменение положения фиксируется.
  4. Код используется для определения точного положения вала.

Приведенное выше объяснение относится к принципу работы механического датчика абсолютного вращения, но есть два других способа, с помощью которых можно обнаружить изменение положения и изменения оптических либо магнитных датчиков.

Оптические поворотные энкодеры

Оптические энкодеры состоят из диска, вала, стекла либо пластика с прозрачными и непрозрачными поверхностями, что позволяет источнику света и фотодетектору обнаруживать оптические сигналы. Такое обнаружение помогает определить позицию вала в любое время.

Механический поворотный энкодер

Процесс определения положения с помощью оптических энкодеров:

  1. Диск, прикрепленный к валу, вращается.
  2. В зависимости от положения диска, проходящий свет либо пропускается, либо блокируется.
  3. Полученный проходящий свет преобразуется в электрический сигнал.
  4. Преобразованный сигнал затем становится цифровым. Это используется для определения положения, скорости, угла и прочих параметров.

Магнитные энкодеры

Магнитные приборы состоят из серии магнитных полюсов для обозначения положения устройства и датчиков, которые обычно работают на эффекте Холла. Данное устройство имеет тот же принцип работы, что и оптические энкодеры, но вместо света, датчики обнаруживают изменение магнитных полей.

Магнитные энкодеры

Процесс определения положения с помощью магнитных энкодеров:

  1. Присоединенный диск вращается.
  2. Магнитные датчики обнаруживают изменение магнитного поля из-за вращения.
  3. Такие изменения преобразуются в синусоидальные волны и преобразуются в цифровые сигналы для получения желаемого результата.

Инкрементальный энкодер

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

Инкрементальный энкодер, также известный как квадратурный, имеет два выходных сигнала, A и B, которые генерируют прямоугольные волны при вращении вала. Частота прямоугольной волны указывает скорость вращения вала, а соотношение фаз AB указывает направление вращения.

схема

Поворотные инкрементальные энкодеры определяют количество вращений через отдельный счетчик, который подсчитывает количество импульсов, выдаваемых в ответ на величину вращательного смещения вала.

Инкрементальные энкодеры проходят процесс определения положения с помощью магнитных угловых устройств:

  1. Происходит вращательное смещение вала.
  2. В результате кодер выдает соответствующую последовательность импульсов.
  3. Отдельный счетчик, помещенный в контрольную точку, подсчитывает количество импульсов для получения желаемого результата.

Различия поворотного энкодера и потенциометра

Чтобы лучше понять описываемое устройство, стоит сравнить его с похожим — потенциометром. Не вдаваясь в подробности описания, можно сказать, почему поворотные энкодеры в настоящее время являются более предпочтительным вариантом:

  1. Цифровой вход у энкодера более современен по сравнению с аналоговым у потенциометра. Это позволяет легко использовать микроконтроллер для преобразования выходных данных.
  2. Возможность непрерывного вращения.
  3. Четкое угловое положение, с более высокой точностью и без ограничения угла поворота.

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

Выбор лучших энкодеров для Ардуино

Чтобы упростить процесс выбора энкодера к Arduino, здесь будет подборка каждого варианта.

Поворотный энкодер EC11

Поворотный энкодер EC11

Нужен простой угловой энкодер, который поможет начать распознавать вращающийся вал с помощью Ардуино? Тогда стоит выбрать EC11.

Устройство имеет в общей сложности 5 контактов, 3 с одной стороны для вращательного кодирования, которым требуется простая цепь для подачи постоянного тока 5В. Два других замыкаются при нажатии, поэтому нет недостатка в какой-либо функциональности при использовании этого энкодера с Ардуино.

Магнитный энкодер Grove AS5600

Нужно устройство, которое может одновременно работать как магнитный потенциометр или магнитный энкодер с отличной надежностью и долговечностью? Тогда это устройство отлично подойдет.

Магнитный энкодер Grove AS5600

Оно не только работает в обоих направлениях, но по сравнению с традиционным энкодером/потенциометром, Grove AS5600 бесконтактный, без ограничения угла поворота, обеспечивает высокоточный сигнал. Все это стало возможным благодаря встроенному AS5600, основанному на эффекте Холла.

Grove — оптический поворотный прибор

Этот оптический датчик угла поворота (для уно, нано и других) включает в себя инфракрасный излучатель и два фототранзисторных детектора. Подходит не только для определения скорости/вращения, но и для определения направления вращения.

Grove — оптический поворотный прибор

  • двойные фототранзисторные детекторы, могут определять направление вращения;
  • встроенные светодиодные индикаторы;
  • интерфейс Grove для простоты использования с Ардуино.

Подключение поворотного энкодера с Ардуино

Теперь, когда принципы работы различных энкодеров изучены, можно приступить к описанию схемы подключения к Ардуино.

Для этого понадобятся:

подключение

  • любое устройство Ардуино, например, Arduino UNO, Arduino Mega, Arduino Leonardo, Arduino 101, Arduino Due;
  • любой энкодер Ардуино.

Обзор поворотного энкодера

Поворотный энкодер — это датчик, используемый для определения углового положения вала, подобный потенциометру.

поворотный эндокер

Пины, и что они означают:

  • CLK: выход A (цифровой);
  • DT: выход B (цифровой);
  • SW: нажатие кнопки (цифровой);
  • + : VCC-напряжение питания;
  • GND: заземление.

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

Данное устройство определяет угловое положение вращающегося вала с помощью серии прямоугольных импульсов. Он по существу имеет равномерно расположенные контактные зоны, соединенные с общим узлом, а также два дополнительных контакта, называемых A и B, которые находятся на 90 градусов вне фазы. Когда вал вращается вручную, контакты A и B синхронизируются с общим контактом и генерируют импульс. Подсчитав количество импульсов любого из этих выходов, можно определить положение вращения.

Чтобы определить направление и проверить, вращается ли штифт по часовой стрелке или против часовой стрелки, нужно сделать следующее:

схема

  • Если вращающийся вал движется по часовой стрелке, то сигнал A опережает B. В одни и те же моменты времени, A и B будут находиться на противоположных частях прямоугольной волновой функции.
  • Если вал движется против часовой стрелки, то сигнал B опережает A.

Подключение

Если говорить в общем, то CLK, DT и SW, должны быть подключены к цифровым выводам на Ардуино, + должен быть подключен к 5V, а GND заземлен.

Пошаговая инструкция подключения проводов энкодера к Ардуино:

подключение эндокера к Ардуино

  1. CLK: подключите конец провода к пину CLK на поворотном энкодере, затем к любому цифровому выводу на Arduino (оранжевый провод).
  2. DT: подключите конец провода к пину DT, затем к любому цифровому контакту на Arduino (желтый провод).
  3. SW: подключите конец провода к пину SW, далее к любому цифровому контакту на Arduino (голубой провод).
  4. + : подключите провод к пину +, затем к контакту +5V на Arduino (красный провод).
  5. GND: подключите конец провода к пину GND на энкодер с контактом GND на Arduino. (Черный провод).

Как кодировать

Код изменяет высоту тона в зависимости от того, в каком направлении повернут энкодер. Когда он поворачивается против часовой стрелки, шаг уменьшается, а когда он поворачивается по часовой стрелке, шаг увеличивается.

  • датчик поворотного энкодера;
  • Ардуино;
  • пьезодатчик;
  • провода.

Вот сам код:

int buzzer_pin = 3;
int pinA = 7;
int pinB = 6;
int pinC = 5;
int pitch = 956;
int aState;
int aLastState; void setup() <
pinMode (pinA,INPUT);
pinMode (pinB,INPUT);
//pinMode (pinC,INPUT);
//digitalWrite(pinC, HIGH);
pinMode(buzzer_pin, OUTPUT);
Serial.begin (9600);
// Starts output
aLastState = digitalRead(pinA);
> void loop() <
aState = digitalRead(pinA); if (aState != aLastState) <
// outputB != outputA state, encoder is rotating clockwise
if (digitalRead(pinB) != aState) <
movedClockwise();
//counter ++;
>
else <
//counter —;
movedCounterClockwise();
>
play_specific_pitch(pitch);
>
aLastState = aState;
>void movedClockwise() <
if ((pitch) 3000) <
pitch = pitch + 100;
>
>void movedCounterClockwise() <
if ((pitch) 100) <
pitch = pitch — 100;
>
>void play_specific_pitch(int pitch) <
for (long i = 0; i 300000L; i += pitch * 2) <
digitalWrite(buzzer_pin, HIGH);
delayMicroseconds(pitch);
digitalWrite(buzzer_pin, LOW);
delayMicroseconds(pitch);
>
Serial.println(pitch);
>

Описание кода

Итак, сначала нужно определить контакты, к которым подключен кодер, и назначить некоторые переменные, необходимые для работы программы. В разделе «Настройки» нужно определить два контакта в качестве входных данных, и запустить последовательную связь для печати результатов на последовательном мониторе. Также нужно прочитать начальное значение вывода A, затем поместить это значение в переменную aLastState.

Далее в разделе цикла снова изменить вывод A, но теперь поместить значение в переменную aState. Таким образом, если повернуть вал и сгенерировать импульс, эти два значения будут отличаться. Сразу после этого, используя второй параметр «if», определить направление вращения. Если выходное состояние B отличается от A, счетчик будет увеличен на единицу, в противном случае он будет уменьшен. В конце, после вывода результатов на мониторе, нужно обновить переменную aLastState с помощью переменной aState.

Это все, что нужно для этого примера. Если загрузить код, запустить монитор и начать вращать вал, значения станут отображаться на мониторе.

Упрощенный пример

Следующий пример кода продемонстрирует, как считывает сигналы Arduino на датчике энкодера. Он просто обновляет счетчик (encoder0Pos) каждый раз, когда энкодер поворачивается на один шаг, а параметры вращения отправляются на порт ПК.

Код:

/ * Чтение квадратурного энкодера
Подключите энкодер к контактам encoder0PinA, encoder0PinB и + 5V.
* /
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
void setup () <
pinMode (encoder0PinA, INPUT);
pinMode (encoder0PinB, INPUT);
Serial.begin (9600);
>
void loop () <
n = digitalRead (encoder0PinA);
if ((encoder0PinALast == LOW) (n == HIGH)) <
if (digitalRead (encoder0PinB) == LOW) <
encoder0Pos—;
> else <
encoder0Pos ++;
>
Serial.print (encoder0Pos);
Serial.print ("/");
>
encoder0PinALast = n;
>

Следует обратить внимание на то, что приведенный выше код не является высокопроизводительным. Он предоставлен для демонстрационных целей.

Дальнейшее описание, включая форму волны энкодера

Ниже приведено изображение, показывающее формы сигналов каналов A и B кодера:

схема

Это может прояснить, как работает выше указанный код. Когда устройство обнаруживает переход от низкого к высокому уровню на канале A, он проверяет, перешел ли канал к B высоким или низким уровням. Затем происходит увеличение/уменьшение переменной, чтобы учесть направление, в котором кодер должен вращаться. Это нужно, чтобы генерировать найденную форму волны. Также на изображении показаны переходы красным или зеленым цветом. Они зависят от того, в каком направлении движется кодировщик.

Одним из недостатков приведенного выше кода является то, что на самом деле он учитывает только одну четверть возможных переходов.

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


Источник: osensorax.ru