- Необходимые материалы
- Как работает поворотный энкодер?
- Типы поворотных энкодеров
- Распиновка и описание поворотного энкодера KY-040
- Принципиальная схема поворотного энкодера Arduino
- Программирование вашего Arduino для поворотного энкодера
- Работа поворотного энкодера с Arduino
Вращающийся регулятор представляет собой устройство ввода, которое позволяет пользователю взаимодействовать с системой. Он больше похож на радиопотенциометр, но выдает последовательность импульсов, что делает его применение уникальным. Когда ручка энкодера вращается, она вращается в виде небольших шагов, что помогает использовать ее для управления шаговым / серводвигателем, навигации по последовательности меню, увеличения / уменьшения значения числа и многого другого.
В этой статье мы узнаем о различных типах поворотных энкодеров и о том, как они работают. Мы также будем взаимодействовать с Arduino и контролировать значение целого числа, вращая энкодер и отображая его значение на ЖК-экране 16 * 2. В конце этого урока вы научитесь использовать Rotary Encoder для своих проектов. Итак, приступим…
Необходимые материалы
- Поворотный энкодер (KY-040)
- Arduino UNO
- 16 * 2 буквенно-цифровой ЖК-дисплей
- Потенциометр 10к
- Макетная плата
- Соединительные провода
Как работает поворотный энкодер?
Поворотный энкодер - это электромеханический преобразователь, что означает, что он преобразует механические движения в электронные импульсы. Он состоит из ручки, которая при вращении будет двигаться шаг за шагом и генерировать последовательность импульсных последовательностей с заранее определенной шириной для каждого шага. Существует много типов кодировщиков, каждый со своим собственным рабочим механизмом, мы узнаем о типах позже, но пока давайте сосредоточимся только на инкрементальном кодировщике KY040, поскольку мы используем его в нашем руководстве.
Внутренняя механическая структура энкодера показана ниже. По сути, он состоит из круглого диска (серого цвета) с токопроводящими площадками (медного цвета), помещенных поверх этого круглого диска. Эти токопроводящие площадки размещаются на равном расстоянии, как показано ниже. Выходные штифты закреплены на вершине этого круглого диска таким образом, что при вращении ручки токопроводящие площадки соприкасаются с выходными штырями. Здесь есть два выходных контакта, выход A и выход B, как показано на рисунке ниже.
Форма выходного сигнала, создаваемого выходным контактом A и выходом B, отображается синим и зеленым цветом соответственно. Когда токопроводящая площадка находится непосредственно под штифтом, она поднимается высоко, что приводит к своевременности, а когда токопроводящая площадка удаляется, штифт опускается вниз, что приводит к отключению сигнала, показанного выше. Теперь, если мы посчитаем количество импульсов, мы сможем определить, на сколько шагов был перемещен энкодер.
Теперь может возникнуть вопрос, зачем нам два импульсных сигнала, когда одного достаточно для подсчета количества шагов, сделанных при вращении ручки. Это потому, что нам нужно определить, в каком направлении была повернута ручка. Если вы посмотрите на два импульса, вы увидите, что они оба сдвинуты по фазе на 90 °. Следовательно, когда ручка вращается по часовой стрелке, сначала на выходе A будет высокий уровень, а при повороте ручки против часовой стрелки - на выходе B.
Типы поворотных энкодеров
На рынке существует множество типов поворотных энкодеров, и разработчик может выбрать тот, который подходит для его применения. Наиболее распространенные типы перечислены ниже.
- Инкрементальный кодировщик
- Абсолютный кодировщик
- Магнитный энкодер
- Оптический кодировщик
- Лазерный кодировщик
Эти энкодеры классифицируются на основе выходного сигнала и сенсорной технологии, инкрементные энкодеры и абсолютные энкодеры классифицируются на основе выходного сигнала, а магнитные, оптические и лазерные энкодеры классифицируются на основе сенсорной технологии. Здесь используется энкодер инкрементального типа.
Распиновка и описание поворотного энкодера KY-040
Распиновка энкодера инкрементального типа KY-040 показана ниже.
Первые два контакта (земля и Vcc) используются для питания энкодера, обычно используется питание +5 В. Помимо вращения ручки по часовой стрелке и против часовой стрелки, энкодер также имеет переключатель (активный низкий уровень), который можно нажать, нажав ручку внутри. Сигнал от этого переключателя поступает через контакт 3 (переключатель). Наконец, он имеет два выходных контакта, которые формируют сигналы, как уже обсуждалось выше. Теперь давайте узнаем, как взаимодействовать с Arduino.
Принципиальная схема поворотного энкодера Arduino
Полная принципиальная схема для взаимодействия поворотного энкодера с Arduino показана на рисунке ниже.
Поворотный энкодер имеет 5 контактов в порядке, указанном на этикетке выше. Первые два контакта - это земля и Vcc, который подключен к земле и контакту + 5V Arduino. Переключатель энкодера подключен к цифровому выводу D10 и также имеет высокий уровень через резистор 1 кОм. Два выходных контакта подключены к D9 и D8 соответственно.
Чтобы отобразить значение переменной, которое будет увеличиваться или уменьшаться при повороте поворотного энкодера, нам нужен модуль отображения. Здесь используется широко доступный буквенно-цифровой ЖК-дисплей 16 * 2. Мы подключили дисплей для работы в 4-битном режиме и запитали его с помощью вывода + 5V Arduino. Потенциометр используется для регулировки контрастности ЖК-дисплея. Если вы хотите узнать больше о взаимодействии ЖК-дисплея с Arduino, перейдите по ссылке. Полную схему можно построить на макетной плате, я выглядел примерно так, как только были выполнены все соединения.
Программирование вашего Arduino для поворотного энкодера
Довольно легко и просто запрограммировать плату Arduino для взаимодействия с ней поворотного энкодера, если вы понимаете принцип работы поворотного энкодера. Нам просто нужно считать количество импульсов, чтобы определить, сколько оборотов сделал энкодер, и проверить, какой импульс поднялся первым, чтобы определить, в каком направлении был повернут энкодер. В этом руководстве мы будем отображать число, которое увеличивается или уменьшается в первой строке ЖК-дисплея, а направление энкодера - во второй строке. Полная программу для делать то же самое можно найти в нижней части этой страницы с демонстрацией видео, не требует какой - либо библиотеки. Теперь давайте разделим программу на небольшие части, чтобы понять, как работает.
Поскольку мы использовали ЖК-дисплей, мы включили библиотеку жидких кристаллов, которая по умолчанию присутствует в IDE Arduino. Затем мы определяем контакты для подключения ЖК-дисплея к Arduino. Наконец, мы инициализируем ЖК-дисплей на этих контактах.
#включают
Затем внутри функции настройки мы отображаем вводное сообщение на ЖК-экране, а затем ждем 2 секунды, чтобы это сообщение было доступно для чтения пользователем. Это необходимо для правильной работы ЖК-дисплея.
lcd.print («Поворотный энкодер»); // Вступительное сообщение, строка 1 lcd.setCursor (0, 1); lcd.print («С Arduino»); // Вводное сообщение, строка 2, задержка (2000); lcd.clear ();
Поворотный энкодер имеет три выходных контакта, которые будут входными контактами для Arduino. Эти три контакта представляют собой переключатель, выход A и выход B соответственно. Они объявляются как Input с использованием функции pinMode, как показано ниже.
// Объявление режима вывода pinMode (Encoder_OuputA, INPUT); pinMode (Encoder_OuputB, INPUT); pinMode (Encoder_Switch, ВХОД);
Внутри функции настройки void мы читаем состояние вывода A для проверки последнего состояния вывода. Затем мы будем использовать эту информацию для сравнения с новым значением, чтобы проверить, какой вывод (выход A или выход B) стал высоким.
Предыдущий_вывод = digitalRead (Encoder_OuputA); // Считываем начальное значение выхода A
Наконец, внутри функции основного цикла мы должны сравнить значение выхода A и выхода B с предыдущим выходом, чтобы проверить, какой из них первым переходит в высокий уровень. Это можно сделать, просто сравнив значение текущего выхода A и B с предыдущим выходом, как показано ниже.
if (digitalRead (Encoder_OuputA)! = Previous_Output) { if (digitalRead (Encoder_OuputB)! = Previous_Output) { Encoder_Count ++; lcd.clear (); lcd.print (Encoder_Count); lcd.setCursor (0, 1); lcd.print («По часовой стрелке»); }
В приведенном выше коде второе условие if выполняется, если выход B изменился по сравнению с предыдущим выходом. В этом случае значение переменной энкодера увеличивается, и на ЖК-дисплее отображается, что энкодер вращается по часовой стрелке . Точно так же, если что, если условие не выполнено, в последующем еще условия мы уменьшаем переменные и дисплей, датчик вращается в против часовой стрелки направления. Код для того же показан ниже.
иначе { Encoder_Count--; lcd.clear (); lcd.print (Encoder_Count); lcd.setCursor (0, 1); lcd.print («Против часовой стрелки»); } }
Наконец, в конце основного цикла мы должны обновить предыдущее выходное значение текущим выходным значением, чтобы цикл можно было повторить с той же логикой. Следующий код делает то же самое
Предыдущий_вывод = digitalRead (Encoder_OuputA);
Еще одна необязательная вещь - проверить, нажат ли переключатель на кодировщике. Это можно контролировать, проверив штифт переключателя на поворотном кодере. Этот вывод является активным низким выводом, что означает, что он будет понижаться при нажатии кнопки. Если не нажат, контакт остается высоким, мы также использовали подтягивающий резистор, чтобы убедиться, что он остается высоким, когда переключатель не нажат, что позволяет избежать состояния с плавающей запятой.
если (digitalRead (Encoder_Switch) == 0) {lcd.clear (); lcd.setCursor (0, 1); lcd.print («Переключатель нажат»); }
Работа поворотного энкодера с Arduino
Когда оборудование и код будут готовы, просто загрузите код на плату Arduino и включите плату Arduino. Вы можете включить его через USB-кабель или использовать адаптер 12 В. При подаче питания на ЖК-дисплее должно отображаться вступительное сообщение, а затем он должен быть пустым. Теперь поверните поворотный энкодер, и вы должны увидеть, что значение начинает увеличиваться или уменьшаться в зависимости от направления вращения. Вторая строка покажет вам, вращается ли энкодер по часовой стрелке или против часовой стрелки. На картинке ниже показано то же самое
Также, когда кнопка нажата, во второй строке будет отображаться, что кнопка нажата. Полную работу можно посмотреть на видео ниже. Это всего лишь пример программы для взаимодействия кодировщика с Arduino и проверки правильности его работы. Как только вы попадете сюда, вы сможете использовать кодировщик для любого из ваших проектов и программ соответственно.
Надеюсь, вы поняли руководство, и все сработало так, как должно. Если у вас возникли проблемы, используйте раздел комментариев или форумы для технической помощи.