В этот статье поговорим о инкрементальном энкодере EC11 с AliExpress. Данный энкодер служит для передачи точного значения, с помощью которого можно управлять каким-либо механизмом с шаговым режимом работы, выбора параметров работы устройства, управления навигационным меню и т.д. Наличие кнопки дополнительно расширяет функционал этого энкодера. Например, можно обыграть короткое нажатие на кнопку, как подтверждение выбранного режима, а длительное нажатие - как отмену.
У данного энкодера 5 ножек: две для подключения плюса и земли, две для выходного сигнала вращения энкодера и одна, отвечающую за нажатие кнопки энкодера. Преимущество этого энкодера в том, что он уже смонтирован на плате, с обратной стороны которой размещены цепочки из конденсаторов и резисторов, устраняющие возможный дребезг контактов на аппаратном уровне. А значит нам не придется устранять его программно, дополнительно усложняя скетч.
По принципу передаваемых данных, энкодеры делятся на абсолютные и инкрементальные. У абсолютного энкодера, значения, соответствующие углу поворота, заданы заранее и эти значения передаются контроллеру.
У инкрементального энкодера значения не заданы и передается только цифровой сигнал поворота. В зависимости от того, в какую сторону осуществляется поворот, энкодер передает различный сигнал. Именно его и будет анализировать микроконтроллер, определяя направление поворота и увеличивая или уменьшая необходимое нам значение переменной.
Когда мы поворачиваем ручку энкодера по часовой стрелке, то сначала подключается контакт S2, а затем контакт S1. Когда поворачиваем ручку против часовой стрелки, сначала подключается контакт S1, а затем контакт S2.Отслеживая, очередность подключения контактов, мы можем определить, в каком направлении вращается энкодер.
Т.е. в тот момент, когда мы зафиксировали сигнал, на выходе S1, мы сравниваем его с сигналом на выходе S2. И если сигнал S1 равен сигналу S2, то ручка энкодера повернута по часовой стрелке, а если не равен, то против часовой. Речь идет об этой модели энкодера, у другой последовательность подключения контактов может быть обратной. Но принцип тот же.
Собираем схему с энкодером на макетной плате. Крайние ножки 5V и GND соединяем с соответствующими пинами Arduino UNO . S1 подключаем к 5 порту, S2 к 6-му.
Открываем Arduino IDE и пишем небольшой скетч. Определяем постоянные, связанные с теми портами, куда мы подключили энкодер, и переменные, фиксирующие прошлое и текущее состояние выходов S1 и S2 для отслеживания их изменения. В переменную val мы и будем записывать текущее значение, соответствующее повороту ручки энкодера.
В функции setup производим достаточно стандартную инициализацию.
И фиксируем начальное значение сигнала выхода S1 энкодера.
В функции loop считываем текущее значение сигнала выхода S1 энкодера. И сравниваем с начальным. Если значение не равно начальному, значит осуществляется поворот энкодера. И в этом случае считываем значение выхода S2 энкодера. Если S1 равен S2, значит вращение осуществляется по часовой стрелке и переменной val мы добавляем единицу, если нет, то вращение против часовой стрелки и мы вычитаем единицу из переменной val.
Подключаем Arduino к компьютеру, загружаем скетч и открываем монитор порта. Поворачиваем по часовой стрелке и видим, как значение увеличивается дважды. При вращении в обратную сторону значение уменьшается дважды.
Происходит это из-за того, что при повороте на каждый шаг, передается 4 импульса, 2 из которых совпадают с предыдущим значение, поэтому не проходят по нашему условию (curS1!=prevS1), а два проходят данное условие и изменяют дважды значение переменной. Это хорошо видно на данной картинке.
Добавляем булеву переменную flag, которая и будет отсекать повторное изменение значения val. И пишем дополнительное условие – если flag == true, то следующий блок кода срабатывает и flag становится false, а если нет, то переменной flag присваиваем значение true и значение переменной val изменится только один раз за шаг.
Загружаем скетч в Ардуино, открываем монитор порта и видим, что значение меняется на единицу при вращении в ту или иную сторону.
Теперь соединим выход энкодера Key с портом номер 7 Ардуино.
Добавляем в наш скетч соответствующие постоянную и переменную. И еще одну переменную, фиксирующую время нажатия кнопки.
В функцию loop добавляем блок кода, в котором мы будем отслеживать сигнал с кнопки и при появлении низкого уровня сигнала, считать кнопку нажатой и выводить соответствующее сообщение. Фиксация времени текущего нажатия и сравнивание его с таймером Ардуино, необходима для предотвращения многочисленных срабатываний данного условия в пределах одного нажатия.
Загружаем скетч в Ардуино, открываем монитор порта, нажимаем на ручку энкодера, и видим как монитор порта фиксирует нажатие.
В следующей статье мы снова вернемся с LED матрице и с помощью энкодера будем управлять различными режимами ее работы.
Скетч из статьи можно загрузить по ссылке - https://yadi.sk/d/firAa6UXM9l-Gw
Ниже размещено видео по материалам данной статьи. Спасибо, что дочитали до конца! Всем пока!