[SLOT_n]
mode = encoderInc

Программный модуль инкрементального (обычно оптического) энкодера с квадратурным выходом.

Совместимость

Принцип работы

Импульсы каналов A (ch_0) и B (ch_1) считаются аппаратным счётчиком PCNT, направление вращения определяется по их фазе. Опция divider задаёт число импульсов на один шаг позиции, glitchFilter отсекает короткие помехи на входе.

Режим задаётся флагом absolute:

  • без флага — инкрементальный: рапортуется приращение с прошлого отсчёта;
  • с флагом — абсолютный: рапортуется позиция в пределах minValmaxVal.

Флаг 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/enable0 / 1Состояние модуля - активен 1 или спит 0
encoder_<slot>/event/warningстрокаПричина, по которой модуль не работает (нет свободного PCNT)

Пример: топик moduleBox/encoder_0/event/val, payload -3.

Команды

ТопикPayloadОписание
encoder_<slot>/action/resetОбнулить счетчик
encoder_<slot>/action/enable0 / 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).