General Electronics

Сенсорная клавиатура на AVR

sensor keyboard
Сенсорная клавиатура с подсветкой
English version here

Современные микроконтроллеры имеют все, что необходимо для реализации сенсорной клавиатуры, чувствительной к прикосновению пальцев. Существует несколько методов реализации емкостных датчиков — многие фирмы-производители микроконтроллеров рекомендуют использовать свои библиотеки. Мне было любопытно попробовать самостоятельно реализовать сенсорную матрицу основываясь только на теоретическом описании технологии и вот что из этого получилось.

Теория

В качестве базового варианта я выбрал QMatrix, который просто и доступно описан в QMatrix™ Technology White Paper. Смысл состоит в постепенном переносе заряда через емкость сенсорной клавиши на накопительную емкость, которая заряжается до определенного значения. Это значение можно измерить разряжая накопительную емкость через сопротивление и измеряя время, которое проходит до пересечения нуля. Прикосновение пальца к поверхности диэлектрика отводит часть электрического заряда на тело, где он рассеивается. Таким образом, при прочих равных, накопленный заряд на емкости при касании датчика пальцем будет меньше, что можно будет увидеть по укороченному времени ее разряда.

В QMatrix Whitepaper приведена отличная иллюстрация происходящего, но для удобства я перерисовал условную схему на свой лад. Ckey — это сенсор, узор на односторонней печатной плате (трогать его будем со стороны диэлектрика). Ctank — накопительная емкость. Ключи: Sdrive — служит для подачи импульсов через Ckey; Sslope — включает ток заряда для измерения; Stop, Sbottom — «переворачивают» конденсатор в процессе накопления заряда; Sc — подключает вход компаратора. Rslope — служит для медленной разрядки конденсатора.

Схема зарядки Ctank больше всего напоминает работу зарядового насоса (см. Хоровиц и Хилл. Искусство схемотехники §6.23).

Схема
Изначально все ключи открыты, ток не течет. Замыкаем Sbottom, затем Sdrive. Положительный фронт импульса проходит через Ckey и чуть-чуть заряжает Ctank. Если теперь переключить Sdrive на землю, ничтожный заряд, попавший на Ctank, точно таким же путем уплывет обратно. Его надо «поймать». Для этого перед тем, как переключить Sdrive на землю, надо открыть Sbottom и закрыть Stop. Конденсатор «перевернулся» — заряд сохранился, но теперь он виден со стороны нижней обкладки и, относительно земли, он будет отрицательным. Разрядиться через накачивающую цепь он теперь не может, поэтому спокойно даем пройти заднему фронту импульса — переключаем Sdrive на землю. Этот процесс изображен на диаграмме справа.

Так, кроха за крохой, заряд на Ctank будет постепенно накапливаться и, допустим через 50 итераций, напряжение на нижней обкладке будет равно —достаткол вольт (см. нижнюю часть диаграммы). Тогда приходит время включить компаратор, взвести таймер и детектор событий и замкнуть Sslope, ток через который потечет в Ctank и постепенно разрядит его до 0, а затем зарядит и до +Vdd. Нам интересен момент перехода через 0, который отловит компаратор. Значение таймера, которое окажется в момент пересечения нуля и будет измеряемой величиной. По разнице во времени разряда емкости можно будет судить о том, какие клавиши «нажаты». Эта же схема легко превращается в матрицу клавиш. Все накачивающие линии будут называться X, а линии датчиков — Y.

Реализация

В качестве тестовой платформы я выбрал ATmega8 на 16МГц. Матрицу клавиш я изначально хотел сделать 5x4, но, как всегда тут и там недосмотрел, поэтому успешно получилось сделать только 4x3. Итак, что же позволяет реализовать этот проект в одном AVR без лишних деталей?

Самое важное, это встроенный компаратор. С его помощью отлавливается момент перехода через 0. Не менее важным является наличие мультиплексора входов АЦП: с его помощью можно во-первых отключить компаратор на время накопления заряда и, во-вторых, реализовать несколько столбцов матрицы. Так же очень удобно иметь во-первых таймер и модуль захвата событий, вход которого к тому же можно подключить к выходу компаратора. За каждое из этих неслучайных совпадений воздадим хвалу инженерам, которые разрабатывали периферию AVR.

В этот момент всплывает одна деталь: все входы микроконтроллера снабжены диодами Шотки для защиты от пробоя. Это значит, что даже если вход находится в состоянии высокого импеданса, он отключен только пока напряжение на нем будет больше Vss-0.2V, или меньше Vdd+0.2V. Фактически это означает, что достаткол < 0.2V, или ничего не выйдет.

sensor pad layout Осталось соорудить схему, и определиться с выбором портов. Входы не оставляют сомнений, они должны быть среди аналоговых входов, чтобы их можно было завести на компаратор. Накачивающие выходы могут быть совершенно любыми. Выход, который обеспечивает разряд емкости, Sslope, не должен быть ножкой, которая используется для захвата внешних событий (ICP1). Нельзя забывать, что аналоговые входы обязательно должны быть коммутируемыми: иначе невозможно реализовать ключи Stop и Sbottom. Например, ножки AIN1 и AIN2 у ATmega8 не годятся, потому что они не имеют цифровой части схемы и не могут быть переведены с режим выхода, или входа с высоким импедансом. При разводке печатной платы следует прочитать рекомендации для QMatrix. Сторона сенсорной области должна быть не менее 10мм, обкладка X должна образовывать собой рамку толщиной примерно равной толщине слоя диэлектрика вокруг обкладки Y. Обратная сторона платы должна быть пустой, или содержать минимум проводников.

Программная часть

Программное обеспечение клавиатуры автоматически калибруется при включении, чтобы корректно отличать нейтральное состояние каждой кнопки от нажатого. Сложность заключается в том, что в отличие от простых контактов, каждая кнопка обладает индивидуальным характером, который зависит от ее геометрического расположения на плате, соседства с другими компонентами и т.п. При калибровке базовое значение таймера для каждой клавиши семплируется несколько (4-16) раз и усредняется для исключения случайностей.

Также предусмотрена возможность определять насыщение накопительной емкости, чтобы использовать последовательность импульсов максимально осмысленной длительности. Эксперименты показали, что длительность заряда не так существенна, как определение базового уровня, поэтому эта возможность вынесена в условную компиляцию.

За критерий касания принято отличие более 10% от базового уровня. В зависимости от условий, для повышения помехоустойчивости, можно повышать порог чувствительности до 20-25%. Кроме того для уменьшения числа ложных срабатываний реализован обычный алгоритм устранения дребезга контактов. В ситуации, когда время срабатывания важнее, например если датчик должен понимать скольжение пальцем, определение дребезга можно отключить.

Cканирование матрицы осуществляется клавиша за клавишей. Измерять несколько линий Y одновременно при такой схеме невозможно потому, что компаратор только один, а разряжаются все конденсаторы одновременно. Положительным свойством такого сканирования является возможность независимо чувствовать нажатие нескольких клавиш. Отрицательным — большое время сканирования всей матрицы.

Результаты

Сенсорная клавиатура на mega8
В целом эксперимент удался. Получилось сделать надежную матрицу 4×3 клавиши. Матрица большего размера не удалась по двум причинам: 1) я не учел, что последние два аналоговых входа на ATmega8 не могут быть цифровыми и 2) оказалось, что использование ножки ICP1 одновременно, или незадолго до работы Input Capture, даже при том, что вход последнего соединен с выходом компаратора, вызывает помеху.

0.2V оказалось достаточно, чтобы надежно отличать прикосновение не только к непосредственно к текстолиту, но и к миллиметровому листу пластика поверх тыльной стороны текстолита. Число слоев, вернее наличие неизбежных воздушных прослоек между ними, влияет на чувствительность схемы больше, чем их толщина. Некторые материалы категорически не годятся в качестве рабочей поверхности. Так, не получилось чувствовать ничего через полиэтилен от упаковки CompactFlash, наверное из-за того что он обработан антистатиком. Почему-то не получилось ничего и с черной бумагой от старой советской фотопленки. Коробка от компакт-диска и полиэтиленовый пакет оказались хорошими, подходящими диэлектриками. Прижимать дополнительные слои диэлектрика надо с тыльной стороны текстолита.

Количество клавиш на контроллере с большим числом пинов вполне может быть увеличено до 8×8, однако не следует забывать, что при этом время сканирования матрицы может возрасти до существенно больших величин. В то же время, опроса можно ускорить оптимизацией кода и сокращением времени заряда конденсаторов. Эксперимент был проведен на AVR, работающем на частоте 16 МГц, но вполне возможно, что все то же самое можно повторить и используя встроенный осциллятор на 4 МГц. Благодаря самокалибровке, схема нечувствительна к отклонениям частоты осциллятора. Это позволило бы существенно уменьшить размер платы.

Помехозащищенность колеблется в зависимости от выбранного порога чувствительности и качества рабочей поверхности. В целом, ожидается, что такая клавиатура может надежно работать в составе какого-нибудь прибора в корпусе.

Опенсорс



-*-*-
Viacheslav Slavinsky 2009 svofski on gmail
Updated: Wed Mar 25 03:07:00 MSK 2009