Dave Vanden Bout
В одном из проектов мне понадобилось сканировать 16-кнопочную клавиатуру с помощью микроконтроллера (МК) с ограниченным числом выводов. Я решил проблему, подключив последовательную цепочку одинаковых резисторов между двумя двунаправленными выводами МК.
В показанном примере (см. рисунок) для простоты использованы пять резисторов для сканирования четырех сенсорных кнопок. Сенсоры образованы площадками металлизации между каждой парой соседних резисторов. При касании площадки емкость человеческого тела образует RC цепочку, и соответствующие изменения состояния схемы фиксируются МК.
Сначала вывод P1 МК конфигурируется как выход, а P2 как вход. На P1 подается высокий уровень, которым заряжается емкость через часть резисторной цепочки между P1 и той площадкой, до которой дотронулись в данный момент. В нашем примере, сопротивление части цепочки равно 2R. В это же время запускается таймер, который фиксирует время, за которое напряжение на P2 (и что то же, на конденсаторе) достигнет уровня "лог. 1". Это время T2, пропорциональное 2R × C, запоминается. P2 на время заряда конденсатора существенного влияния не оказывает, т.к. входное сопротивление вывода очень велико.
Затем оба вывода P1 и P2 переключают на выход и подают на них низкие уровни, чтобы как можно быстрее разрядить конденсатор. И наконец, P2 делают выходом, а P1 входом. Время заряда конденсатора до напряжения переключения входа P1 будет пропорционально 3R × C. МК вычисляет соотношение T1 и T2:
T1/T2 = (3RC)/(2RC) = 3/2.
Соотношение не зависит ни от емкости человека, ни от номинала резисторов (при условии, что резисторы идентичны). МК просматривает таблицу соотношений T1/T2 для всех кнопок, выбирает ближайшее и определяет номер нажатой кнопки.
Если емкость человеческого тела равна 100 пФ, при сопротивлении 10 кОм приращение времени заряда между соседними кнопками будет иметь порядок микросекунды. Это время может быть зафиксировано большинством микроконтроллеров.
Я уже говорил, что описанный метод использовался для сканирования клавиатуры из 16 клавиш. Очевидным ограничивающим фактором здесь является паразитная емкость цепочки резисторов и выводов МК. Кроме того, необходимо использовать резисторы с хорошо согласованными номиналами, с допуском 1%, а еще лучше, 0.1%. (Выбор допусков определяется и числом кнопок). Напряжения переключения входов МК должны быть одинаковыми. Кроме того, если есть возможность, неплохо было бы организовать "обучение" контроллера, и запомнить соотношения T1/T2 для каждой кнопки в EEPROM или флеш-памяти.
Резисторы в цепочке выполняют еще и функцию ослабления электростатических разрядов, которые возникают при прикосновении человека к незащищенным металлическим площадкам. Если же проблема электростатического разряда все же существует, вместо металлических контактов можно использовать обычные кнопки, подключающие общий конденсатор к земле схемы. В этом случае есть смысл емкость C конденсатора взять побольше, а сопротивления резисторов R наоборот, поменьше. Таким образом можно ослабить влияние паразитных емкостей.
Если в вашем распоряжении есть еще один свободный вывод МК (P3), вы сможете сканировать до 32 кнопок, подключив одну цепочку резисторов между выводами P1-P2, а другую между P1-P3. В общем случае, задействовав N выводов МК, вы можете обслуживать 16N•(N – 1) кнопок.