меню в ардуино управление энкодером
Подключение энкодера к Arduino. GyverEncoder v4.9
ОБНОВЛЕНИЯ
ТЕОРИЯ
Энкодер (от англ. encode – преобразовывать) – это устройство для преобразования угловых положений или линейных перемещений в цифровой сигнал, т.е. энкодер – это датчик угла или линейного перемещения, соответственно есть крутильные и линейные энкодеры. Принцип работы энкодера заключается в преобразовании механического перемещения в электрические сигналы, у обычного инкрементального энкодера, который мы будем рассматривать, этот сигнал представляет собой два квадратных сигнала (при равномерном вращении), сдвинутых по фазе на 90 градусов.
Самым хорошим модулем с энкодером на Aliexpress является вот такой, на круглой плате:
ПОДКЛЮЧЕНИЕ
Подключается модуль энкодера очень просто: питание на питание (GND и VCC), логические пины CLK, DT (тактовые выводы энкодера) и SW (вывод кнопки) на любые пины Arduino (D или A). У круглых модулей выводы энкодера подписаны как S1 и S2, а вывод кнопки как Key, подключаются точно так же. От порядка подключения тактовых выводов энкодера зависит “направление” его работы, но это можно поправить в программе.
У модулей энкодера тактовые выводы подтянуты к питанию и дают низкий сигнал при срабатывании, также на них стоят RC цепи для гашения дребезга. Вывод кнопки никуда не подтянут! Промышленный энкодер подключается точно так же, чёрный и красный провода у него питание, остальные – тактовые выходы.
У модулей энкодеров тактовые выходы и кнопка подтянуты к питанию, у круглого модуля также стоят RC цепи для аппаратного подавления дребезга контактов, у KY-40 (прямоугольный) распаяна только подтяжка. Если нужно подключить “голый” энкодер к плате – в целом можно подключить напрямую без обвязки, как на схеме ниже, моя библиотека отработает и подтяжку средствами микроконтроллера (INPUT_PULLUP), и программный антидребезг. Но рекомендуется всё-таки делать RC цепи для кнопки и для тактовых выходов энкодера.
Энкодер управление меню на дисплее
Рассмотрим, как сделать меню с энкодером Ардуино на дисплее LCD 1602 I2C. Мы представим два примера: меню для включения светодиодов и меню на дисплее с управлением от энкодера яркостью светодиодов. Рекомендуем вам ознакомиться с подключением к Arduino дисплея LCD 1602 Arduino и модуля энкодер Ардуино. Если вы уже подключали данные модули, то можно приступать к этому мини проекту.
Меню на Ардуино LCD 1602 с энкодером
Примеры меню с модулем энкодера и жк дисплеем, размещенные на этой странице, вы сможете адаптировать под свои нужды. Во многих проектах на Ардуино требуется для пользователя создать возможность для настройки или управления устройством на микроконтроллере. Энкодер позволяет сделать простое и нативное меню на LCD дисплее для управления светодиодами, микро серво Ардуино или для других задач.
Как сделать меню с энкодером на дисплее
Для этого проекта нам потребуется:
Скетч. Управление энкодером меню дисплея LCD
В первом, более простом примере, в меню дисплея имеется три пункта которые можно менять с помощью вращения ручки энкодера. При нажатии на тактовую кнопку энкодера, включается выбранный цвет RGB светодиода. В зависимости от положения курсора на дисплее, при помощи условного оператора if включается нужный цвет. Соберите схему, как показано на картинке выше и загрузите следующую программу.
Пояснения к коду:
Скетч. Двухуровневое меню с энкодером Ардуино
В следующем примере меню имеет второй уровень для регулировки яркости каждого светодиода отдельно. Переход из одного меню в другое происходит при нажатии кнопки энкодера, при котором меняется значение глобальной переменной w в скетче. Схема подключения светодиодов и модулей к микроконтроллеру остается прежней, как на картинке выше, следует лишь загрузить в плату следующий код программы.
Пояснения к коду:
Заключение. Мы рассмотрели два примера создания меню с энкодером на дисплее 1602 IIC Arduino. Если вы уловили всю суть управления меню с помощью энкодера (датчик угла поворота), то легко сможете использовать представленные примеры в своих собственных проектах с дисплеем на Ардуино. Если у вас еще остались вопросы по данной теме, то вы можете их оставлять в комментариях к этой записи.
Создание меню для Ардуино с энкодером и ЖКИ Nokia 5110
В предыдущей статье мы рассмотрели, как создать меню для вашего проекта Arduino на ЖК-дисплее Nokia 5110 с кнопками для навигации по нему. В этой статье мы сделаем модифицированную версию меню, которая будет использовать энкодер вместо кнопок для навигации.
Меню является одним из самых простых способов, с помощью которых пользователи могут взаимодействовать с устройствами с различными характеристиками. От смартфонов до ПК и даже телевизоров, меню используется почти в каждом электронном устройстве с экраном, а навигация по нему обычно выполняется нажатием определенных кнопок для перемещения вверх/вниз, вправо/влево и выбора. Однако, в некоторых приборах, или для эстетики или для улучшения форм-фактора, для навигации использован подход, похожий на ручку регулировки. В сегодняшнем уроке мы объясним, как создать меню с управлением в стиле ручки регулировки, используя вращающийся энкодер.
Необходимые компоненты
Для построения этого проекта требуются следующие компоненты;
Схема подключения энкодера к Ардуино
Схема для сегодняшнего проекта почти аналогична схеме из предыдущей статьи. Мы уберемтри кнопки и добавим вращающийся энкодер. Соедините компоненты, как показано на схеме ниже.
Используемый энкодер является аналоговым устройством, и по этой причине все его три вывода подключены аналоговые пины на Arduino.
Для того чтобы сделать соединения более легким следовать, карта Штыря между компонентами обеспечена ниже.
Чтобы упростить / уменьшить объем работы, мы будем использовать четыре библиотеки. Две из библиотек: Adafruit GFX library и Nokia 5110 LCD library, будут использоваться для взаимодействия с дисплеем, в то время как другие две: Encoder Library и TimerOne library, позволят уменьшить количество кода для взаимодействия с энкодером. Каждую из библиотек можно загрузить по ссылкам, прикрепленным к ним, или установить через менеджер библиотек Arduino.
Код проекта мало чем отличается от предыдущей статьи, поэтому по частям мы его разбирать не будем, а приведем сразу весь:
encoder = new ClickEncoder(A1, A0, A2);
encoder->setAccelerationEnabled(false);
display.begin();
display.clearDisplay();
setContrast();
Timer1.initialize(1000);
Timer1.attachInterrupt(timerIsr);
if (middle) //Middle Button is Pressed
<
middle = false;
if (page == 1 && menuitem==5) // Backlight Control
<
if (backlight)
<
backlight = false;
menuItem5 = «Light: OFF»;
turnBacklightOff();
>
else
<
backlight = true;
menuItem5 = «Light: ON»;
turnBacklightOn();
>
>
if(page == 1 && menuitem ==6)// Reset
<
resetDefaults();
>
else if (page == 1 && menuitem service();
>
void displayIntMenuPage(String menuItem, int value)
<
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(15, 0);
display.print(menuItem);
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(5, 15);
display.print(«Value»);
display.setTextSize(2);
display.setCursor(5, 25);
display.print(value);
display.setTextSize(2);
display.display();
>
void displayStringMenuPage(String menuItem, String value)
<
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(15, 0);
display.print(menuItem);
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(5, 15);
display.print(«Value»);
display.setTextSize(2);
display.setCursor(5, 25);
display.print(value);
display.setTextSize(2);
display.display();
>
void displayMenuItem(String item, int position, boolean selected)
<
if(selected)
<
display.setTextColor(WHITE, BLACK);
>else
<
display.setTextColor(BLACK, WHITE);
>
display.setCursor(0, position);
display.print(«>»+item);
>
void readRotaryEncoder()
<
value += encoder->getValue();
if (value/2 > last) <
last = value/2;
down = true;
delay(150);
>else if (value/2
Полный код для проекта также прилагается для загрузки в конце статьи.
Демонстрация
Еще раз проверьте правильность подключения. После этого подключите плату к компьютеру и загрузите в нее эскиз. Вы должны увидеть экран, на котором отображается меню. Попробуйте повернуть ручку в разных направлениях для навигации по меню и используйте нажатие на ручку для выбора функций.
Про Ардуино и не только
четверг, 4 января 2018 г.
Текстовое меню на Ардуино
Меню верхнего уровня в данном скетче содержит 2 элемента: первый для решения квадратных уравнений, второй просто как пример построения многоуровнего меню. Параметр ReturnFromMenu установлен в 0 и при выборе пунктов меню вызываются соответствующие обработчики. Так осуществляется задание коэффициентов квадратного уравнения и нахождение его корней (функции InputA, InputB, InputC, Solve). В обработчиках следует помнить об управлении подсветкой дисплея, для этого регулярно вызывается функция LCDBacklight. Функция loop содержит единственный вызов DrawMenu. Вся дальнейшая работа будет заключаться в отрисовке меню и выполнении функций-обработчиков.
Вот в общем-то и всё, остальное должно быть понятно из примера. Ну и в заключение дочитавшим до конца предлагаю видео работы этого меню:
90 комментариев:
Здравствуйте тёзка. Я «полный новичок» в ардуино, самостоятельно накидать менюшку с управлением энкодером, для меня, как-то сложновато. Поиск дал кучу вариантов.
Но Ваша работа наиболее качественная, и фишки в виде бегущего текста, вообще супер.
Но, сходу использовать скетч, не прокатило.
На версии IDE 1.6.7 (Uno R3) заругалась на строку «eMenuKey DrawMenu(eMenuKey Key)» словами «does not name a type». Подскажите, что можно сделать? И ой, чувствую, вопросов будет куча.
Попробовал оба варианта путей к скетчу, и с «C:\Новая папка\Arduino_KY040_Menu» и просто из корневухи С:\Arduino_KY040_Menu. Не выходит. Выдает целый список «недовольств»:
Arduino: 1.6.7 (Windows 7), Плата:»Arduino/Genuino Uno»
Arduino_KY040_Menu:192: error: ‘eMenuKey’ does not name a type
eMenuKey DrawMenu(eMenuKey Key) < // Отрисовка указанного уровня меню и навигация по нему
^
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
>;
^
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
Arduino_KY040_Menu:172: error: invalid conversion from ‘void* (*)()’ to ‘void (*)()’ [-fpermissive]
C:\Users\foto\AppData\Local\Temp\arduino_0e105e996471fbde0dc2a2dfa2384703\Arduino_KY040_Menu.ino: In function ‘void LCDBacklight(byte)’:
Arduino_KY040_Menu:175: error: default argument given for parameter 1 of ‘void LCDBacklight(byte)’ [-fpermissive]
^
Arduino_KY040_Menu:30: error: after previous specification in ‘void LCDBacklight(byte)’ [-fpermissive]
void LCDBacklight(byte v = 2);
^
exit status 1
‘eMenuKey’ does not name a type
Я использую версию 1.6.12. Она таких ошибок не выдавала, как и web редактор create.arduino.cc.
Скачал 1.6.7, немного изменил скетч, скомпилировалось без ошибок. Пробуйте.
Но это всё так, навскидку.
Разумеется, заголовок прокручиваться не будет, это надо учитывать. Добавить прокрутку можно, но, мне кажется, это перегрузит меню.
Инкрементальный энкодер: принцип действия, схемы подключения, работа с Arduino
У данной статьи есть видеоверсия! Подписывайтесь на канал, чтобы быть в курсе обновлений! |
Инкрементальный ( или инкрементный, от англ. increment — « увеличение») энкодер ( датчик угла поворота) — это устройство, которое преобразовывает вращательное движение вала в серию электрических импульсов, позволяющих определить направление и угол его вращения. Также, исходя из найденных величин, можно определить и скорость вращения. Основным отличием инкрементальных энкодеров от абсолютных является то, что они могут сообщать лишь о величине изменения их положения, а не об абсолютном своем состоянии. Самым популярным примером использования инкрементального энкодера в повседневной жизни, является ручка регулировки громкости автомобильной магнитолы.
Также энкодеры идеально подходят для реализации навигации по различным меню.
Инкрементальные энкодеры бывают оптическими, магнитными, механическими и т.д. Вне зависимости от принципа устройства все инкрементальные энкодеры на выходе генерируют 2 линии ( A и B) с импульсами смещенными относительно друг друга. Именно по смещению импульсов можно судить о направлении вращения. А по количеству импульсов — об угле поворота.
В данной статье будет рассмотрен механический инкрементальный энкодер EC11 с переключателем ( кнопкой) и пошаговой фиксацией положения вала ( между каждой серией импульсов).
Каждый инкрементальный энкодер имеет следующую основную характеристику — дискретность ( количество шагов, положений между импульсами, на один оборот вала). Благодаря дискретности, можно вычислить угол единичного изменения положения. В нашем примере, энкодер ЕС11 за полный оборот генерирует 20 серий импульсов. А это значит, что каждый шаг эквивалентен повороту на 18°. Помимо этого, вал энкодера фиксируется в каждом положении между каждой серией импульсов.
Внешний вид устройства:
Сердцем энкодера являются 2 пары контактов и металлическая пластина с засечками. При вращении вала, каждая пара контактов замыкается и размыкается. Но эти пары контактов расположены таким образом, что при вращении вала в разные стороны порядок замыкания/размыкания контактов разный — и, благодаря этому, можно определить направление вращения.
Поскольку подключение кнопки вала энкодера ( контакты D и E) не отличаются от подключения обычной кнопки, информация по ней будет опущена.
Схематично работу инкрементального энкодера можно представить следующим образом:
Как видно из рисунка, в состоянии покоя обе пары контактов разомкнуты, а значит сигнальные линии A и B пребывают в высокоомном состоянии ( состоянии Z). Поэтому их необходимо притягивать к логической единице подтягивающими резисторами. Стандартная схема подключения энкодера выглядит следующим образом:
После чего в состоянии покоя на обоих сигнальных выходах будет присутствовать логическая единица ( 5 В). При вращении по часовой, или против часовой стрелки на сигнальных линиях, с противоположным смещением друг относительно друга, будут появляться отрицательные импульсы — по одному на 1 шаг на каждой линии:
Реальная осциллограмма вращения энкодера немного отличается от идеальной.
При подключении энкодера к МК со встроенными подтягивающими резисторами, их можно исключить из схемы, не забыв при этом включить встроенные подтягивающие резисторы:
Как и в любой кнопке, контакты энкодера также подвержены дребезгу при смыкании/размыкании. И, поскольку, подавляющее большинство программных реализаций взаимодействия энкодера с Arduino использует прерывания, дребезг будет мешать корректной работе самого отлаженного и работоспособного кода.
Программное устранение дребезга
В отличие от программного устранения дребезга обычной кнопки дребезг энкодера можно устранить программно, при этом серьезно не нагружая ресурсы микроконтроллера. И программное устранение будет работать на прерываниях и флагах.
После того как энкодер подключен к Arduino ( на примере Arduino Uno):
Сигнальные линии энкодера подключены к 2 и 3 пину Arduino Uno, так как на этих выходах реализованы прерывания. Замена пинов подключения приведет к неработоспособности примера. Скетч:
Суть работы кода можно изобразить графически:
Аппаратное устранение дребезга
Несмотря на незатратное, по отношению к ресурсам МК, программное решение устранения дребезга на прерываниях, более предпочтительным является его аппаратное устранение. Решение строится по принципу устранения дребезга обычной кнопки и выглядит так:
После того, как дребезг подавлен аппаратно, программная реализация может быть значительно упрощена.
Дополнительным бонусом может служить высвобождение одного из двух ( для Arduino Uno) пинов с функционалом прерывания. Таким образом прерывание будет провоцироваться импульсом только одной линии, а далее, в обработчике, можно смотреть на состояние второй линии и делать выводы:
Этот пример работает корректно.
Навигация при помощи энкодера
Теперь можно организовать управление чем-либо при помощи энкодера. Его уникальность состоит в том, что одним элементом управления можно запрограммировать 4 реакции на действия: вращение вправо/влево, короткое нажатие и длинное нажатие ( реакция на нажатия реализуется программно).
В строках 59-67 можно настроить реакцию программы на длительное удержание кнопки энкодера:
Энкодер и навигация по меню
Для того чтобы продемонстрировать навигационные возможности энкодера необходимо создать меню. Для примера будем создавать такое меню:
Для этого объявим структуру menu одного пункта и далее, создадим массив из элементов структуры menu :
Скетч и результат работы выглядит так:
Бонус — как заменить энкодером кнопки
Задача выглядит следующим образом:
Сделать без участия микроконтроллера ( на микросхемах ТТЛ-логики) так, чтобы вращение энкодера конвертировалось в положительные импульсы на двух разных выходах — по часовой стрелке на одном выходе, против часовой — на другом, таким образом имитируя нажатия двух отдельных кнопок:
Для выполнения этой задачи понадобятся 2 микросхемы, реализующие стандартную логику и 1 микросхема — D-триггер ( D от англ. delay — задержка):