[SLOT_n]
mode = encoderIncПрограммный модуль инкрементального (обычно оптического) энкодера с квадратурным выходом.
Совместимость
- Модуль два цифровых входа — канал A на
ch_0, B наch_1 - Модуль три цифровых входа — канал A на
ch_0, B наch_1
Принцип работы
Импульсы каналов A (ch_0) и B (ch_1) считаются аппаратным счётчиком PCNT,
направление вращения определяется по их фазе. Опция divider задаёт число импульсов на один шаг
позиции, glitchFilter отсекает короткие помехи на входе.
Режим задаётся флагом absolute:
- без флага — инкрементальный: рапортуется приращение с прошлого отсчёта;
- с флагом — абсолютный: рапортуется позиция в пределах minVal–maxVal.
Флаг linearCounter останавливает счёт на границах диапазона; без него счётчик
зацикливается. Команда reset обнуляет позицию.
Ограничения по периферии
Счётчиков PCNT в ESP32-S3 всего четыре, и они делятся между
encoderInc, tachometerstepper]] — суммарно этих модулей в конфигурации может быть не больше четырёх. Модуль ставится в любой слот; если свободного счётчика не осталось, модуль в этом слоте не запускается: в консоль и лог на SD-карте пишется ошибка, а после подключения к брокеру публикуетсяencoder_<slot>/event/warningс текстомinit failed, no free PCNT unit (4 total for encoderInc, tachometer, stepper). Остальные слоты продолжают работать.
Топики
База топика события:
<deviceName>/encoder_<slot>— напримерmoduleBox/encoder_0
База топика действия:
<deviceName>/encoder_<slot>— напримерmoduleBox/encoder_0
Полный топик — база плюс направление и имя: moduleBox/encoder_0/event/val.
Опции
Доступные опции:
- disableOnStart — флаг, стартовать в выключенном состоянии и ждать
action/enableсо значением1. По умолчанию модуль активен сразу. - absolute — флаг, флаг - абсолютный режим.
- dirInverse — флаг, флаг - инверсия направления счета.
- linearCounter — флаг, флаг - линейный счетчик (стоп на краях) вместо зацикленного.
- glitchFilter — число(int), аппаратный фильтр дребезга в наносекундах. Диапазон 1–4095. По умолчанию 800.
- divider — число(int), делитель импульсов на один шаг позиции. Диапазон 1–65535. По умолчанию 1.
- zeroShift — число(int), смещение нуля после делителя. Диапазон −32768–32767. По умолчанию 0.
- minVal — число(int), минимальное значение позиции. По умолчанию не ограничено (−2147483648).
- maxVal — число(int), максимальное значение позиции. По умолчанию не ограничено (2147483647).
- refreshRate — число(int), период опроса значений в Гц. Диапазон 1–100. По умолчанию 20.
События
| Топик | Payload | Описание |
|---|---|---|
encoder_<slot>/event/val | строка | Текущее значение позиции (абс) или приращение (инкр) |
encoder_<slot>/event/enable | 0 / 1 | Состояние модуля - активен 1 или спит 0 |
encoder_<slot>/event/warning | строка | Причина, по которой модуль не работает (нет свободного PCNT) |
Пример: топик moduleBox/encoder_0/event/val, payload -3.
Команды
| Топик | Payload | Описание |
|---|---|---|
encoder_<slot>/action/reset | — | Обнулить счетчик |
encoder_<slot>/action/enable | 0 / 1 | Включить (1) или выключить (0) модуль |
Примеры
[SLOT_0]
mode = encoderInc
options = absolute, linearCounter, minVal:0, maxVal:100, divider:4
;позиция энкодера задаёт целевую позицию шагового двигателя
crosslink = encoder_0/event/val:@->stepper_1/action/moveToAbs:@Абсолютный режим с линейным счётчиком: позиция не выходит за 0–100, четыре импульса энкодера дают один шаг позиции.
[SLOT_1]
mode = encoderInc
options = dirInverse, glitchFilter:1500
;каждый щелчок энкодера листает трек
crosslink = encoder_1/event/val:@->player_0/action/shift:@Подробнее — внутренние связи (crossLink).