Антидребезг сигналов и кнопок
Урок про подавление ложных срабатываний механических контактов и дискретных датчиков.
Антидребезг (debounce) — приём, при котором изменение состояния признаётся, только если новое значение продержалось стабильно несколько отсчётов подряд.
Механическая кнопка не замыкается мгновенно: контакты «дребезжат» миллисекунды, и наивный код насчитает десяток нажатий вместо одного. То же с дискретными датчиками — концевиками, герконами, датчиками препятствия. Антидребезг отсекает эту трескотню.
Стабильность как критерий
Идея: считаем, сколько отсчётов подряд держится новое значение. Меняем состояние, только когда счётчик достиг порога стабильности $N$. Короткие всплески не доживают до $N$ и игнорируются.
def debounce(samples, stable_n=3):
state = samples[0]
count = 0
out = [state]
for s in samples[1:]:
if s != state:
count += 1
if count >= stable_n:
state = s # новое значение устоялось
count = 0
else:
count = 0 # вернулось к старому — сброс
out.append(state)
return out
# дребезг при нажатии: 0->1 с помехами
raw = [0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1]
print(debounce(raw, stable_n=3))Вывод:
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
Выбор окна стабильности
Порог $N$ связан с частотой опроса $f_s$ и длительностью дребезга $t_d$:
$$ N \ge t_d \cdot f_s $$
Например, дребезг до 5 мс при опросе 1 кГц требует $N \ge 5$.
t_d = 0.005 # 5 мс дребезга
fs = 1000 # опрос 1 кГц
N = int(t_d * fs)
print("нужно держать стабильным минимум", N, "отсчётов")Вывод:
нужно держать стабильным минимум 5 отсчётов
Как работает под капотом
Антидребезг — это, по сути, фильтр нижних частот для дискретного сигнала: он пропускает устойчивые уровни и режет короткие переходы. Есть два подхода: программный (счётчик стабильности, как выше) и аппаратный (RC-цепочка или триггер Шмитта на входе). Программный гибче и не требует деталей, но «съедает» немного времени реакции — ровно $N$ отсчётов задержки. Для быстрых событий (энкодеры) задержку держат минимальной, для кнопок человека $20$–$50$ мс незаметны.
Частые ошибки
- Совсем не делать антидребезг кнопок — одно нажатие посчитается как несколько.
- Брать слишком большое $N$ — кнопка станет «тормозной», пропустит быстрые нажатия.
- Сбрасывать счётчик неверно — при возврате к старому значению он должен обнуляться.
Итог
- Антидребезг признаёт смену состояния только после $N$ стабильных отсчётов.
- Порог $N$ выбирают по длительности дребезга и частоте опроса: $N \ge t_d f_s$.
- Это фильтр нижних частот для дискретного сигнала; цена — задержка в $N$ отсчётов.