bash.im ithappens.me zadolba.li
13303

Дебаунсинг, Карл!

Я смотрю, последнее время популярны истории, в которых авторы ставят знак равенства между множествами «почти всегда это так» и «изредка это так», например, вольно сравнивая undo для IT и не IT. Что же, проблема эта известная и широко распространённая. Расскажу и я свою историю.

Коллеги-разработчики! Мы часто ноем, сталкиваясь с чужими багами и «особенностями дизайна», с проблемами, уходящими корнями вглубь. Порой, в настройке софта или в организации библиотеки/фреймворка нет никакой видимой логики или глубокой задумки — просто автору так захотелось, потом захотелось другому автору, потом третьему, и вот этот мутный франкенштейн коллективного творчества предстаёт перед нами с прилагающейся к нему шестисотстраничной документацией, забитой исключениями, отступлениями от POSIX и удивительно корявыми решениями. Их невозможно понять, их надо просто запомнить. И потом, через полгода, троллить новичков, решая «элементарные» проблемы. Но всё равно стресс копился, копилось раздражение, и тогда по совету коллеги я занялся микроэлектроникой в качестве хобби.

Карл, даже обычная кнопка оказалась проблемной. Вместо одного события нажатия прилетает десяток по прерываниям! Дебаунсинг, Карл! Хуже того — в простой кнопке нет состояния 0/1, там есть или что-то (например, 1, если цепь замыкается на +3,3 В) и floating, который определяется то как 0, то как 1. Это решается лишь чисто механически.

Разобрался с кнопкой? Призовая игра — rotary encoder (например, колёсико мышки), который шлёт несколько событий, позволяющих определить, в какую сторону он вращается. Из-за того же баунсинга зачастую приходят противоречивые сигналы. Типа, сперва +1 и тут же −1 (тут я понял, почему у меня так же глючит скролл на одной дешёвой мышке). Попытки дебаунсить приводят к тому, что «шаги» проглатываются или неверно определяется направление.

Универсального решения нет.

Ультразвуковой сенсор позволяет измерить расстояние до объекта с точностью до миллиметра… в теории. На практике из пяти измерений одно вернёт 0, одно — какое-то запредельное значение, ещё три выдадут результат с разбросом в пару сантиметров. Более-менее стабильной работы удалось добиться, проводя семь измерений и забирая медианное значение. А ведь ещё бывает эхо…

Когда я добрался до простых дисплеев (TFT, OLED) — это оказался просто праздник! Ни один не заработал сразу. Везде приходилось долго искать конкретную модель, драйверы-библиотеки под неё, а некоторые даже исправлять и дописывать.

Теперь обычные проблемы разработчика воспринимаются с улыбкой. Подумаешь, прочитать документацию — она хотя бы есть и даже не на китайском. Подумаешь, с первого раза не запустилось что-то — сейчас покурим маны и посмотрим логи… (О, как же приятно, когда есть логи!) Снова ошибка? Ничего страшного, по крайней мере, из-за неё чип ценой в десяток долларов не превратился в бесполезный кусок горячего пластика.

В общем, хобби оказалось удачным. Рекомендую.