ESP8266:Примеры/Использование ESP8266 вместе с энкодером KY-040: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
 
Нет описания правки
 
(не показано 7 промежуточных версий 2 участников)
Строка 2: Строка 2:
{{Перевод от Сubewriter}}
{{Перевод от Сubewriter}}
{{Myagkij-редактор}}
{{Myagkij-редактор}}
{{Черновик}}


=Использование ESP8266 вместе с энкодером KY-040<ref>[https://blog.squix.org/2016/05/esp8266-peripherals-ky-040-rotary-encoder.html blog.squix.org - ESP8266 Peripherals: KY-040 Rotary Encoder]</ref>=
=Использование ESP8266 вместе с энкодером KY-040<ref>[https://blog.squix.org/2016/05/esp8266-peripherals-ky-040-rotary-encoder.html blog.squix.org - ESP8266 Peripherals: KY-040 Rotary Encoder]</ref>=
[[File:KY-040.jpg|center]]


[[ESP8266]] штурмом взял сердца членов [[DIY]]-сообщества – благодаря привлекательной цене, возможности подключения к интернету и относительно большому количеству свободных '''GPIO'''-контактов. Но ценность устройства, способного подключиться к интернету, сомнительна, если у него нет средств для взаимодействия с окружающим миром. Впрочем, благодаря стандартизированным протоколам вроде [[I2C]], [[SPI]] и последовательной коммуникации, а также трудам сообщества [[Arduino]], на рынке очень много датчиков и устройств вывода данных, которые стоят относительно недорого. Но насколько хорошо они совместимы с [[ESP8266]]?
[[ESP8266]] штурмом взял сердца членов [[DIY]]-сообщества – благодаря привлекательной цене, возможности подключения к интернету и относительно большому количеству свободных '''GPIO'''-контактов. Но ценность устройства, способного подключиться к интернету, сомнительна, если у него нет средств для взаимодействия с окружающим миром. Впрочем, благодаря стандартизированным протоколам вроде [[I2C]], [[SPI]] и последовательной коммуникации, а также трудам сообщества [[Arduino]], на рынке очень много датчиков и устройств вывода данных, которые стоят относительно недорого. Но насколько хорошо они совместимы с [[ESP8266]]?
Строка 13: Строка 9:
В данной статье этот вопрос будет раскрыт на примере [[энкодер]]а (датчика угловых перемещений) [[KY-040]] – устройства для ввода данных. В нем, на удивление, нет каких-то особо мудреных  технологий, но оно предлагает очень удобный способ для настройки экранных показателей, не используя при этом слишком большое количество '''GPIO'''-контактов.
В данной статье этот вопрос будет раскрыт на примере [[энкодер]]а (датчика угловых перемещений) [[KY-040]] – устройства для ввода данных. В нем, на удивление, нет каких-то особо мудреных  технологий, но оно предлагает очень удобный способ для настройки экранных показателей, не используя при этом слишком большое количество '''GPIO'''-контактов.


[[File:KY-040.jpg|center|frame|Энкодер KY-040]]
[[File:KY-040.jpg|center|frame|'''Рис. 1.''' Энкодер KY-040|alt=Рис. 1.]]


== Что такое энкодер? ==
== Что такое энкодер? ==
Строка 25: Строка 21:
[[Энкодер]]ы бывают разных типов. Некоторые могут определять абсолютную позицию/угол поворотной ручки, не следя за ее перемещением. Но [[KY-040]] гораздо проще. Считывая сигналы, идущие на два контакта микроконтроллера, мы можем определить, в какую сторону был повернут потенциометр – влево или вправо. При помощи третьего контакта можно определить состояние кнопки. Форма волны на двух '''«поворотных»''' контактах выглядит примерно так:
[[Энкодер]]ы бывают разных типов. Некоторые могут определять абсолютную позицию/угол поворотной ручки, не следя за ее перемещением. Но [[KY-040]] гораздо проще. Считывая сигналы, идущие на два контакта микроконтроллера, мы можем определить, в какую сторону был повернут потенциометр – влево или вправо. При помощи третьего контакта можно определить состояние кнопки. Форма волны на двух '''«поворотных»''' контактах выглядит примерно так:


[[File:wave form clockwise.jpg|frame|center|Форма волны энкодера при повороте по часовой стрелке]]
[[File:wave form clockwise.jpg|frame|center|'''Рис. 2.''' Форма волны энкодера при повороте по часовой стрелке|alt=Рис. 2. Форма волны энкодера при повороте по часовой стрелке]]


[[File:wave form counter clockwise.jpg|frame|center|Форма волны энкодера при повороте по против часовой стрелки]]
[[File:wave form counter clockwise.jpg|frame|center|'''Рис. 3.''' Форма волны энкодера при повороте по против часовой стрелки|alt=Рис. 3. Форма волны энкодера при повороте по против часовой стрелки]]


Таким образом, когда вы поворачиваете ручку вправо, первой в состояние '''HIGH''' переходит '''линия B''', а лишь затем – '''линия A'''. После этого, соответственно, '''линия B''' первой переходит в состояние '''LOW''', а следом за ней – '''линия A'''. В результате последовательность сигналов при повороте ручки по часовой стрелке получается такой: '''00, 01, 11, 10, 00'''. Но если повернуть ручку против часовой стрелки, то последовательность получается такой: '''00, 10, 11, 01, 00'''. Более подробно смотрите на картинках выше.
Таким образом, когда вы поворачиваете ручку вправо, первой в состояние '''HIGH''' переходит '''линия B''', а лишь затем – '''линия A'''. После этого, соответственно, '''линия B''' первой переходит в состояние '''LOW''', а следом за ней – '''линия A'''. В результате последовательность сигналов при повороте ручки по часовой стрелке получается такой: '''00, 01, 11, 10, 00'''. Но если повернуть ручку против часовой стрелки, то последовательность получается такой: '''00, 10, 11, 01, 00'''. Более подробно смотрите на картинках выше.
Строка 39: Строка 35:
Теперь давайте приступим к проекту. Подключите [[энкодер]] к [[NodeMCU]] как показано на картинке ниже. Только подключайте контакты согласно надписям, а не порядку контактов:
Теперь давайте приступим к проекту. Подключите [[энкодер]] к [[NodeMCU]] как показано на картинке ниже. Только подключайте контакты согласно надписям, а не порядку контактов:


[[File:RotaryEncoderKY-040-1.png|center]]
[[File:RotaryEncoderKY-040-1.png|frame|center|'''Рис. 4.''' Подключение энкодера к плате ESP8266|alt=Рис. 4. Подключение энкодера к плате ESP8266]]


* '''Контакт + на энкодере''' – к контакту 3.3V
* '''Контакт + на энкодере''' – к контакту 3.3V
Строка 51: Строка 47:
В данном случае можно воспользоваться разными библиотеками. Лично я предпочитаю '''«Encoder»''', и скачать [[ZIP]]-архив с нею можно [https://github.com/PaulStoffregen/Encoder отсюда]. Скачав архив, распакуйте его и поместите в папку с библиотеками [[IDE Arduino]]. Перезапустите [[IDE Arduino]] и скопируйте в нее код ниже:
В данном случае можно воспользоваться разными библиотеками. Лично я предпочитаю '''«Encoder»''', и скачать [[ZIP]]-архив с нею можно [https://github.com/PaulStoffregen/Encoder отсюда]. Скачав архив, распакуйте его и поместите в папку с библиотеками [[IDE Arduino]]. Перезапустите [[IDE Arduino]] и скопируйте в нее код ниже:


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#include <Encoder.h>
#include <Encoder.h>


Строка 90: Строка 86:
Загрузив скетч, откройте монитор порта [[IDE Arduino]], поверните ручку вправо и влево, а затем нажмите на него, чтобы сбросить счетчик. В результате данные в мониторе порта будут выглядеть примерно так:
Загрузив скетч, откройте монитор порта [[IDE Arduino]], поверните ручку вправо и влево, а затем нажмите на него, чтобы сбросить счетчик. В результате данные в мониторе порта будут выглядеть примерно так:


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Basic Encoder Test:
Basic Encoder Test:


Строка 118: Строка 114:


<references />
<references />
{{Навигационная таблица/Портал/ESP8266}}


[[Категория:ESP8266]]
[[Категория:ESP8266]]

Текущая версия от 12:35, 18 июня 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Использование ESP8266 вместе с энкодером KY-040[1]

ESP8266 штурмом взял сердца членов DIY-сообщества – благодаря привлекательной цене, возможности подключения к интернету и относительно большому количеству свободных GPIO-контактов. Но ценность устройства, способного подключиться к интернету, сомнительна, если у него нет средств для взаимодействия с окружающим миром. Впрочем, благодаря стандартизированным протоколам вроде I2C, SPI и последовательной коммуникации, а также трудам сообщества Arduino, на рынке очень много датчиков и устройств вывода данных, которые стоят относительно недорого. Но насколько хорошо они совместимы с ESP8266?

В данной статье этот вопрос будет раскрыт на примере энкодера (датчика угловых перемещений) KY-040 – устройства для ввода данных. В нем, на удивление, нет каких-то особо мудреных технологий, но оно предлагает очень удобный способ для настройки экранных показателей, не используя при этом слишком большое количество GPIO-контактов.

Рис. 1.
Рис. 1. Энкодер KY-040

Что такое энкодер?

С первого взгляда KY-040 можно перепутать с регулируемым резистором, т.е. с потенциометром, потому что у него тоже есть круглый регулятор, который можно поворачивать влево и вправо. Но, в отличие от настоящих потенциометров, KY-040 можно бесконечно вращать по кругу, не натыкаясь ни на какие пределы. Кроме того, включив KY-040, вы будете чувствовать позиции, на которых регулятор будет легонько фиксироваться, а вот ручка потенциометра будет мягко крутиться, пока не достигнет «конечной остановки».

Есть и еще одно отличие – у KY-040 (как и у большинства других энкодеров) есть переключатель, который меняет свое состояние при вертикальном нажатии (как кнопка). Я видел подобные энкодеры встроенными в современные радиоприемники и автомобильные навигационные системы. Одним из главных преимуществ энкодеров значится относительно легкое встраивание в цифровые системы, особенно если сравнивать с АЦП, которые используется для считывания значений с потенциометра. Кроме того, у вас могут возникнуть проблемы вроде температурного дрейфа и т.д. Образно говоря, энкодер – это такой молодой (миллиениал, чья молодость приходится на цифровую эру) брат потенциометра.

Как использовать энкодер?

Энкодеры бывают разных типов. Некоторые могут определять абсолютную позицию/угол поворотной ручки, не следя за ее перемещением. Но KY-040 гораздо проще. Считывая сигналы, идущие на два контакта микроконтроллера, мы можем определить, в какую сторону был повернут потенциометр – влево или вправо. При помощи третьего контакта можно определить состояние кнопки. Форма волны на двух «поворотных» контактах выглядит примерно так:

Рис. 2. Форма волны энкодера при повороте по часовой стрелке
Рис. 2. Форма волны энкодера при повороте по часовой стрелке
Рис. 3. Форма волны энкодера при повороте по против часовой стрелки
Рис. 3. Форма волны энкодера при повороте по против часовой стрелки

Таким образом, когда вы поворачиваете ручку вправо, первой в состояние HIGH переходит линия B, а лишь затем – линия A. После этого, соответственно, линия B первой переходит в состояние LOW, а следом за ней – линия A. В результате последовательность сигналов при повороте ручки по часовой стрелке получается такой: 00, 01, 11, 10, 00. Но если повернуть ручку против часовой стрелки, то последовательность получается такой: 00, 10, 11, 01, 00. Более подробно смотрите на картинках выше.

Таким образом, аккуратно отслеживая эти сигналы, вы можете определять направление, в котором вращается ручка энкодера, а также определять 4 промежуточных состояния между двумя кликами. Если ваше устройство поддерживает прерывания, то с их помощью можно выводить уведомления об изменении сигнала на линиях, но для этого также понадобится дополнить программный код. Если прерывания не поддерживаются, можно воспользоваться техникой под названием «поллинг» (от англ. «polling»), при которой выполняется частое считывание сигнала, чтобы как можно быстрее определить его изменение.

Но есть еще одна трудность – мы живем в неидеальном мире (на тот случай, если вы не в курсе :D). Механические контакты KY-040 время от времени «дают осечку», и причина этого дефекта может быть, например, в том, что на контакт попала пыль, или в том, что на медном припое есть какая-то выбоина. В результате микроконтроллер может получить «грязный» сигнал и сделать неверное «умозаключение». Этот дефект зовется «дребезгом контактов». Справиться с дребезгом контактов можно и на аппаратном, и на программном уровне. Аппаратное решение – это воспользоваться маленьким конденсатором, способным немного смягчить шум сигнала. Программное решение – это задать временной период, в течение которого ожидается изменение сигнала, и в нашем проекте эту задачу будет выполнять библиотека «Encoder». Я специально заострил ваше внимание на этой проблеме, чтобы вы знали, что вы можете столкнуться с нею в своем проекте.

За дело!

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

Рис. 4. Подключение энкодера к плате ESP8266
Рис. 4. Подключение энкодера к плате ESP8266
  • Контакт + на энкодере – к контакту 3.3V
  • Контакт GND – к контакту GND
  • Контакт SW – к контакту D3
  • Контакт DT – к контакту D2
  • Контакт CLK – контакт D1

Установка библиотеки

В данном случае можно воспользоваться разными библиотеками. Лично я предпочитаю «Encoder», и скачать ZIP-архив с нею можно отсюда. Скачав архив, распакуйте его и поместите в папку с библиотеками IDE Arduino. Перезапустите IDE Arduino и скопируйте в нее код ниже:

#include <Encoder.h>

Encoder myEnc(D1, D2);

long oldPosition  = -999;
boolean isButtonPressed = false;
long lastUpdateMillis = 0;

void handleKey() {
  isButtonPressed = true;  
}

void setup() {
  Serial.begin(115200);
  Serial.println("Basic Encoder Test:");
             //  "Базовый тест энкодера:" 
   pinMode(D3, INPUT_PULLUP);
   attachInterrupt(D3, handleKey, RISING);
}

void loop() {
  long newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    oldPosition = newPosition;
    Serial.println(newPosition);
  }
  // программное устранение дребезга:
  if (isButtonPressed &amp;&amp; millis() - lastUpdateMillis &gt; 50) {
    isButtonPressed = false;
    lastUpdateMillis = millis();
    // сбрасываем счетчик:
    myEnc.write(0);
  }
}

Загрузив скетч, откройте монитор порта IDE Arduino, поверните ручку вправо и влево, а затем нажмите на него, чтобы сбросить счетчик. В результате данные в мониторе порта будут выглядеть примерно так:

Basic Encoder Test:

0
1
2
3
2
3
4
0 - Knob pressed
1
2
3
4
0 - Knob pressed

Возможное применение KY-040

  • Управление блоками данных погодной станции. Допустим, вы используете несколько разных блоков данных. В результате, чтобы добраться до нужного блока, может понадобиться некоторое время. Энкодер может прийтись тут весьма кстати – с его помощью можно будет переключаться между разными блоками, при этом не добавляя в скетч слишком много кода.
  • Селектор открытых точек доступа WiFi. Допустим, у вас есть система из ESP8266, дисплея и вы хотите быстро выбрать и подключиться к незащищенной WiFi-сети, не используя для этого веб-интерфейс. Просто создайте небольшое меню, а затем подключите энкодер: вращая его, вы сможете перемещать курсор между разными SSID, а нажимая на него – выбирать SSID, к которой хотите подключиться.

См.также

Внешние ссылки