Ky 040 энкодер: Подключение энкодера KY-040 к Arduino – RobotChip

Энкодер ky-040 приручаем сноровистую лошадку.

Мне очень нравятся энкодеры. Гениальная штука для управления. Везде хорош, хоть в крошечном самодельном устройстве, хоть в BMW. В большинстве случаев ничего больше для управления не нужно. И при этом мы имеем дело не с холодными цифровыми кнопками, а с теплой ламповой крутилкой. Хочу рассказать о том, как я дрессировал одного из представителей славного семейства энкодеров. У ky-040 есть несомненное преимущество- он очень дешевый и мелкий недостаток- он очень капризный. Работает кое-как, лажает и глючит. Попробуем приручить и обуздать его скверный характер.


Кто-то подумает, что это схема зачатия робота. Но на самом деле это приблизительная схема работы энкодера.

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

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

Диск привязан к ручке и крутится вместе с ней. Что же происходит в момент вращения? Если диск крутится по часовой стрелке, то сперва красный контакт подключенный к выводу А замыкается на диск и, соответственно, на зеленый контакт С, потом синий контакт В также замыкается на диск. Диск фиксируется в следующем положении, когда оба контакта, красный и синий оказываются замкнуты на диск. В следующий шаг сперва красный контакт разомкнется с диском, вслед за ним синий. И так в цикле будет продолжаться до тех пор, пока вы крутите ручку энкодера по часовой стрелке, если вы крутите ручку против часовой стрелки, все происходит точно также, но с точностью до наоборот. В данном случае контакты замыкаются и размыкаются в обратной последовательности.

Что нам надо? Понять в какую сторону крутиться ручка и подсчитать количество шагов. Подключаем наш энкодер к контролеру.

Контакт С подключаем к массе, или минусовому проводу. Контакт А будет у нас ведущим, подключаем его к GPIO которое можно настроить на прерывание по изменению уровня сигнала. Контакт В к любому GPIO на котором можно проверить цифровой уровень сигнала.


Я буду иллюстрировать работу с энкодером на примере конторлера esp8266, на основе прошивки NODEMCU LUA. Но это в принципе не имеет особого значения, если понять суть, то не так важно каким языком и каким контролером вы пользуетесь. А суть в том, что наша функция обработки будет вызвана в тот момент когда изменится потенциал на контакте А, и в этот момент, мы измерим потенциал на контакте В. Если диск крутится по часовой стрелке. То в тот момент когда контакт А замкнется на диск, контакт В не будет замкнут, или на следующем шаге, когда контакт А разомкнется с диском, контакт В еше будет замкнут на диск. То-есть потенциал на контактах А и В будет разным. Еслиже диск крутиться против часовой стрелки. То сперва на диск будет замкнут контакт В и когда замкнется контакт А и мы будем обрабатывать и проверять, оба контакта уже будут замкнуты на диск. На следующем шаге, в тот момент когда придет прерывание на контакт А, контакт В уже будет разомкнут. Значит оба контакта будут в одинаковом состоянии.

Это значит в момент прерывания на контакте А, проверяем потенциал контакта В и если они не совпадают, значит ручка крутится по часовой стрелке, иначе против часовой.

gpio.mode(4,gpio.INT,gpio.PULLUP) -- Устанавливает 4 вывод в режим прерывания. Если на этом выводе изменится потенциал прерывании вызовет нашу функцию и мы обработаем ситуацию.
gpio.trig(4, "both",function(level) -- Собственно сама функция которая будет вызвана
if gpio.read(3)==level -- level - состояние контакта А. Проверяем равно ли оно контакту В?
then print('left') -- если потенциалы равны, значит крутиться против часовой 
else print('rigth') -- иначе крутится по часовой
end
end) 

Но так происходит в идеальном мире. В реальности с энкодером ky-040 это работать не будет. Точнее будет глючить дергаться и дрыгаться в разные стороны. Первая проблема дребезг контактов. Это такая неприятность, когда вместо одного четкого сигнала, на контакты приходит серия беспорядочных всплесков. Она решается использованием таймера.

TM=tmr.now() -- запоминаем текущее время
gpio.mode(4,gpio.INT,gpio.PULLUP)
gpio.trig(4, "both",function(level)
if tmr.now()-TM<50000 then return end -- если прошло меньше чем 50000 микросекунд ничего не обрабатываем
TM=tmr.now() -- запоминаем новую метку времени 
if gpio.read(3)==level
then print('left') 
else print('rigth') 
end
end) 

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

Я сделал это примерно так

VL=1 Эта переменная будет хранить направление движения на предыдущем шаге.

TM=tmr.now() 
gpio.mode(4,gpio.INT,gpio.PULLUP)
gpio.trig(4, "both",function(level)
if tmr.now()-TM<50000 then return end 
TM=tmr.now()
if VL==1 then -- Если предыдущий шаг был вращением против часовой 
if gpio.read(3)==level -- Если Сигнал на контакте В соответствует движению против часовой 
then print('left') -- Тогда фиксируем поворот против часовой 
else VL=0 return -- Иначе устанавливаем поворот по часовой, но при этом пока ничего не фиксируем, это может быть ошибка 
end
else -- Иначе, если предыдущий шаг был вращением по часовой происходит аналогичная обработка поворота по часовой стрелки.
if gpio.read(3)~=level 
then print('Right') 
else VL=1 return 
end
end
end) 

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

Я использовал энкодер пока для управлением ШИМ регулировкой яркости TFT дисплея.

Энкодер модуль шилд KY-040 Arduino

Энкодер модуль шилд KY-040 Arduino

Контакты
Заказать звонок
Написать письмо
Оптовикам
Статьи

  • Личный кабинет
  • 34

    890

    Описание

    Модуль KY-040 представляет собой плату с простым механическим энкодером, и предназначен для простого добавления энкодера к любой отладочной плате (ARM, PIC, STM8, AVR, Arduino и т.п.). Конструкция модуля позволяет легко добавить его к любой макетной плате. Угол поворота энкодера не ограничен (в отличие от потенциометра, которые часто применяют для задания уровня какого либо параметра), поэтому Применение энкодера часто дает более удобный и понятный интерфейс управления. Эта особенность часто применяется для реализации удобного вариативного управления в меню разрабатываемого прибора, но может также применяться для любых других задач.

    Технические характеристики

    • Рабочее напряжение: 3-15В
    • Число импульсов на оборот: 20
    • Размеры: 2х3х3 см

    Дополнительно

    org/PropertyValue»>

    Материал корпусаПластик + металл
    СовместимостьWindows
    Страна регистрации брендаКитай
    Страна-производитель товараКитай
    ТипАксессуары для Роботов

    Комментарии

    0

    Пока не было комментариев.

    Для покупки регистрация не обязательна! Если хотите сделать заказ, — просто добавьте нужные вам товары в корзину, укажите свои данные и нажмите кнопку «Оформить заказ». Мы свяжемся с вами в ближайшее время.

    Оплата

    — перевод на карту-ключ счета ПБ

    — онлайн без комиссии картой любого банка (LiqPay)

    — безналичный расчет без НДС для юридических лиц

    — наличными или картой при доставке (только Новой Почтой при заказе от 100 грн)

    — наличными или через терминал в нас в магазине

    Нашли дешевле? Напишите нам об этом в чат — кнопка в левом нижнем углу экрана. В сообщении укажите ссылку на активную страницу такого же товара в украинском интернет-магазине и мы пересмотрим цену.

    Доставка

    — Новая Почта

    — Укрпочта (только при предоплате)

    — Самовывоз (можете также вызвать курьера Глово по Ивано-Франковску)

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

    Гарантия и возврат

    — возврат в течение 14 дней, если товар не подошел

    — гарантия от 6 месяцев на товары собственного изготовления

        Тип контакта

        Описание

        КЛК

        Контакт А энкодера

        ДТ

        Контакт В энкодера

        SW

        Нет кнопочного выключателя

        ВКК(+)

        Вход напряжения (+5 В)

        ЗЕМЛЯ

        Заземление (контакт C энкодера)