Жила-была мышь, и звали её Defender MM-525. Стойко тянула она свою мышиную лямку — на ссылки кликала, страницы прокручивала, курсор перемещала. Но однажды случилась беда — вместо одного клика она стала делать два, а то и больше. Бывало, захочешь приостановить видео на ютубе — а оно вместо этого на весь экран открывается. Или выделяешь текст — а в последний момент выделение сбрасывается. Понятно, что дальше так продолжаться не могло.
Что же делать? Интернет предлагает такие варианты:
- Использовать программные средства фильтрации лишних кликов. Но это не решение проблемы, а лишь борьба с симптомами, к тому же только под Windows, так что этот вариант я отмёл.
- Подогнуть пружину микровыключателя.
- Кое-кто даже грешит на клавиатуру. Я даже ради приличия проверил — результат ожидаемо отрицательный.
- Большинство же советует просто заменить микровыключатель. Что я и сделал, поставив кнопку от старой мышки.
Но радость моя была недолгой — через несколько дней двойной клик вернулся. Пораскинув мозгами, я решил, что дело в механических вибрациях, и наклеил под кнопку толстый скотч. И снова это помогло лишь на несколько дней. Стало ясно, что надо искать радикальное решение. А для этого надо сначала понять, что происходит.
Как обычно делаются кнопки у цифровой электроники? Приблизительно так:
Вверху питание, внизу земля, вправо — провод ко входу процессора. А на входе у него — затвор полевого транзистора. В нашем случае можно считать, что это попросту идеальный измеритель напряжения. Напряжение больше заданного — значит, делает вывод процессор, на входе единица, а если меньше — то ноль.
Но если вход у процессора идеальный, то выключатель таковым при всём уважении считать не получится. Когда выключатель замыкается — это означает, что один кусок металла соприкасается с другим куском металла. Но между состояниями «выключено» и «включено» есть тот неловкий момент, когда эти два куска соприкасаются едва-едва. И если сейчас контакт есть, то через микросекунду он может пропасть, а затем снова восстановиться. А порой и вовсе один контакт ударяется об другой и по законам Ньютона отскакивает от него, а то и несколько раз. Что подумает мама процессор? Правильно — он подумает, что выключатель включили, выключили, включили, выключили, включили, выключили и т. п. Хотя «на самом деле» его включили всего один раз. Это явление даже имеет своё название — дребезг контактов.
Постойте, ничего не напоминает? Ах да, аналогичный случай как раз произошёл с нашей мышкой! Значит, наша рабочая гипотеза будет в том, что разработчики мышки либо вовсе не вспоминали про возможность дребезга, либо их старания по борьбе с ним были тщетны. И нам придётся побороться с этим врагом за них.
Заметим две вещи. Во-первых, скорость нашего кликания ограничена. Вряд ли мы будем нажимать на мышь более десяти раз в секунду. Во-вторых, выключатели стараются делать так, чтобы момент дребезга проходил как можно скоротечнее, и уж наверняка за одну десятую секунды кнопка мыши успеет успокоиться. Таким образом, наша задача сводится к отделению высокочастотных нажатий от низкочастотных, то есть нам нужен фильтр низких частот. Простейший способ это сделать — впаять конденсатор:
Именно этим мы и займёмся.
Вот она — наша кнопка:
А это она же, но без крышки:
Подпишем номера контактов для удобства:
Принцип работы налицо — в состоянии покоя замкнуты контакты 1 и 3, при нажатии кнопки на некоторое время все контакты размыкаются, а затем замыкаются контакты 1 и 2. При отжатии происходит всё то же в обратном порядке.
Вскрыли мы кнопку не для того, чтобы что-то подгибать, а для того, чтобы воочию увидеть, как она работает, а если повезёт, то и посмотреть на дребезг. А поможет нам в этом фотоаппарат Samsung WB2000 и объектив И96У. Упомянутый аппарат умеет снимать видео с частотой 1000 кадров в секунду. Правда, не ахти как, но, как говорится, чем богаты.
Сложнейшая установка для высокоскоростной съёмки:
И, собственно, кино:
Как видим, контакт успевает пролететь всё положенное расстояние за пять кадров (сиречь 5 миллисекунд), и никакого видимого дребезга не наблюдается. Возможно, дребезг можно было бы увидеть на осциллограмме, но, к сожалению, я вспомнил о том, что у меня есть осциллограф, только тогда, когда мышь была уже собрана. Но так или иначе понятно, что характерное время дребезга явно меньше, чем минимальное время клика, и что граница между ними проходит приблизительно на пяти миллисекундах.
Лирическое отступление. Как бы я сделал мышь, если бы у меня был выключатель вышеприведённой конструкции? А вот так:
Дёшево и сердито. Вход процессора — это не только идеальный вольтметр, это ещё и конденсатор на несколько пикофарад. Так что за те миллисекунды, пока один контакт летит от второго к третьему, напряжение не успеет заметно измениться, а когда он прилетит, конденсатор зарядится, и даже если контакт будет прыгать, разрядиться он всё равно не сможет, так что никакого дребезга не будет. Ну разве что только он подпрыгнет ажно до противоположного контакта, но это, как мы видели, крайне маловероятная ситуация.
Но доблестные разработчики мыши, как мы сейчас увидим, не ищут лёгких путей.
Измерим наш выключатель мультиметром. Во-первых, находим, что ни один из контактов не закорочен на питание. Ну да ладно. В состоянии покоя на втором контакте 2,5 вольта питания, на остальных — ноль. В нажатом состоянии на всех контактах ноль. Это говорит о том, что разработчики не пошли по моему пути, и входом процессора, видимо, служит второй контакт, а третий контакт вовсе не используется. Но самое смешное — после отжатия кнопки ноль на втором контакте сохраняется ещё пять секунд! К сожалению, механизм работы и преимущества такого решения и мотивация разработчиков остаются для меня тайной. Надеюсь, кто-то из сведущих людей меня просветит.
Таким образом, вся наша стройная схема борьбы с дребезгом разбивается о глухую стену непонимания современных схемотехнических решений. Но, в самом деле, не останавливаться же, когда дело почти сделано. Так что будем паять без понимания.
Паять конденсатор будем между контактами 1 и 2. А для измерения эффекта воспользуемся скриптом наподобие вот такого, слегка его подправив так, чтобы он реагировал как на отжатие, так и на нажатие кнопки, и убрав искусственные ограничения по времени.
Конденсатор в 0,1 мкФ даёт время клика 600 мс. То есть как бы быстро мы ни жали, кнопка «отлипнет» не ранее чем через 0,6 секунды. Это многовато. Методом линейной экстраполяции предполагаем, что 3,3 нФ дадут время в 20 мс. Паяем — и видим время около 100 мс. Но это время включает в себя и время собственно движения пальцем, и без конденсатора оно ненамного меньше. Перепробовав ещё несколько номиналов, я решил остановиться на 3,3 нФ.
Поскольку SMD-конденсаторов не было, пришлось паять ногастый:
На этом, собственно, всё. Мышь была успешно собрана и продолжает свою нехитрую, но ответственную службу. Надеюсь, вышеприведённый рецепт будет полезен не только моей мышке.
Автор: wormball