ESP-IDF: компонент Knob для подключения поворотного энкодера |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||
Knob это компонент, который предоставляет программный PCNT, его можно использовать на недорогих чипах (наподобие esp32c2, esp32c3), у которых нет аппаратной фичи PCNT. Благодаря компоненту knob вы можете быстро подключить и использовать физический энкодер (knob), такой как EC11. Применение Knob подойдет для сценариев подключения низкоскоростных поворотных энкодеров, где частота импульсов не превышает 30 импульсов в секунду (обычный энкодер для пользовательского интерфейса, такой как EC11). В таких сценариях допускается не 100% точность подсчета импульсов. Примечание: для точного или быстрого подсчета импульсов используйте аппаратный PCNT, который поддерживается чипами ESP32, ESP32-C6, ESP32-H2, ESP32-S2, ESP32-S3. Энкодер подключается по следующей простой схеме: Примечание: компонент Knob подключает на входах фаз энкодера внутренний pull-up, ток замыкания на GND составляет порядка 0.07 мА. Сигнал C от кнопки энкодера в компоненте Knob не обрабатывается. Для обработки кнопки необходимо подключать отдельный обработчик, например на основе OneButton [2]. [События Knob Event] Каждый knob имеет 5 событий, перечисленных в следующей таблице:
Каждому knob можно привязать функцию обратного вызова (callback) для обработки событий. Причем каждое событие может иметь отдельный callback, вызываемый при возникновении этого события. Такой способ эффективен в реальном времени, так что ни одно событие не потеряется. [Элементы конфигурации] KNOB_PERIOD_TIME_MS: длительность цикла сканирования. [Пример применения] Создайте дескриптор Knob: knob_config_t cfg = { .default_direction =0, .gpio_encoder_a = GPIO_KNOB_A, .gpio_encoder_b = GPIO_KNOB_B, }; s_knob = iot_knob_create(&cfg); Зарегистрируйте callback-функцию: static void _knob_left_cb(void *arg, void *data) { ESP_LOGI("", "KNOB: KNOB_LEFT,count_value:%d", iot_knob_get_count_value((knob_handle_t)arg)); } iot_knob_register_cb(s_knob, KNOB_LEFT, _knob_left_cb, NULL); Аналогично подключается callback для события KNOB_RIGHT. Пример вывода в лог: ... I (2171) : KNOB: KNOB_LEFT,count_value:-2 I (2221) : KNOB: KNOB_LEFT,count_value:-3 I (2231) : KNOB: KNOB_LEFT,count_value:-4 I (2281) : KNOB: KNOB_LEFT,count_value:-5 I (2291) : KNOB: KNOB_LEFT,count_value:-6 I (2761) : KNOB: KNOB_RIGHT,count_value:-5 I (2781) : KNOB: KNOB_RIGHT,count_value:-4 I (2871) : KNOB: KNOB_RIGHT,count_value:-3 I (2891) : KNOB: KNOB_RIGHT,count_value:-2 I (3011) : KNOB: KNOB_RIGHT,count_value:-1 I (3041) : KNOB: KNOB_RIGHT,count_value:0 I (3181) : KNOB: KNOB_RIGHT,count_value:1 I (3201) : KNOB: KNOB_RIGHT,count_value:2 I (3371) : KNOB: KNOB_RIGHT,count_value:3 [Поддержка пониженного энергопотребления] В режиме light_sleep таймер esp_timer выводит CPU из сна, что приводит к повышенному потреблению энергии. Компонент Knob предоставляет поддержку режима пониженного потребления через функцию пробуждения от изменения уровня на ножке порта (GPIO level wake-up). Для использования этой функции разрешите опцию enable_power_save в структуре конфигурации knob_config_t. [Разрешение и запрет Knob] Поддержка компонента может быть в любой момент разрешена и запрещена. // Остановка knob: iot_knob_stop(); [API компонента Knob] Для использования компонента необходимо подключение заголовка components/knob/include/iot_knob.h: #include "iot_knob.h"
В сдедующей таблице приведено краткое описание API-функций. Полное описание параметров этих функций, используемых структур и определений типов см. в документации [1].
[Ссылки] 1. Knob component software PCNT site:espressif.com. |