060-Драйвер сенсорной клавиатуры «Touch Me» на ATtiny2313.

Автор: | 16.11.2010

ТитлС этой статьи я начинаю новую серию устройств под условным названием «Touch Me» (Коснись Меня). Серия «Touch Me» будет включать в себя различные сенсорные устройства ввода: кейпады, клавиши, датчики прикосновения … ну и еще, чего позже придумаю.
В качестве основы для сенсорных устройств данной серии я буду применять принцип замера паразитной емкости контактных площадок «сенсоров». Впервые такой способ контроля прикосновения я подсмотрел в проекте на сайте ЭЛМ Чана. Не знаю, Чан ли это придумал, но идея мне понравилась своей простотой. Не стану вдаваться в подробности, все можно посмотреть в первоисточнике, но, если кратко, то суть в замере времени заряда паразитной емкости цепей ножки микроконтроллера от нуля до уровня логической единицы. Паразитная емкость заметно возрастает, если поднести палец к электрическим цепям (контактной площадке) ножки, что служит сигналом прикосновения. На картинке это будет понятней:

Принцип работы сенсорной клавиши

Схемотехнически это реализуется необычайно просто. От ножки микроконтроллера на плюс питания подключается резистор большого сопротивления (подтяжка), к этой же ножке «подключена» токопроводящая площадка (наша сенсорная «кнопка»), которая изолируется от прямого прикосновения диэлектриком (скотч, лак, самоклейка и т.д.) – это все!

Подключение сенсорной панели

Программно, алгоритм работы следующий (x — буква порта, n — номер бита порта):
1. Порт ножки переводится на вывод (1 -> DDRxn) и сбрасывается в ноль (0 -> PORTxn);
2. Порт ножки переводится на ввод, в высокоимпедансное Z-состояние (0 -> DDRxn). Так как до этого на ножке был ноль, а элементы электрической цепи ножки имеют определенную емкость, то начинается процесс заряда этой емкости через внешний резистор подтяжки;
3. С момента переключения ножки на ввод начинается отсчет времени с контролем состояния ножки (PINxn), как только на ножке появилась единица (PINxn = 1) — останавливается счетчик;
4. Полученное значение счетчика и есть емкость ножки в относительных единицах. По величине этого значения и можно судить о том есть ли прикосновение к сенсору или нет.

С теорией разобрались —
Перейдем к физической реализации данного принципа – плате «Touch Me»-драйвера.
Как и в варианте преобразователя USB to UART на ATtiny2313, плата которого разрабатывалась как универсальное устройство работы с USB (преобразователь, программатор …), плата «Touch Me»-драйвера должна в будущем послужить драйвером для других сенсорных устройств.

Возможно, у Вас создается впечатление, что я страстный поклонник универсализации (судя по универсальным платам), но, на самом деле, это не так (я даже никогда не заморачивался изготовлением или покупкой отладочных плат, все делаю под конкретное устройство). Причина тяги к универсальным платам банальна: я планирую делать много разнообразных устройств в разных вариантах исполнения, а на изготовление новой платы и покупку деталей под каждое устройство тратятся время и деньги. Поэтому, чтобы устройства разрабатывались быстро и много, я буду делать их на вот таких универсальных платах. Уж извините 🙂 Если Вас устраивает само устройство, но не подходит плата — свою печатку всегда можно развести по схеме, я думаю это будет не сложно.


Схема драйвера
до безобразия проста, что, несомненно, является ее большим плюсом! Кроме микроконтроллера, из внешних компонентов в схеме, есть только резисторы, пару светодиодов и пьезоизлучатель (светодиоды и пьезоизлучатель могут не ставиться вообще).

Схема драйвера сенсорной клавиатуры

Плата устройства изначально разрабатывалась для SMD-компонентов, но из-за того, что у меня под рукой не оказалось ни одного ATtiny2313 в SOIC-корпусе (смотри предыдущий пост), чтобы не останавливать проект сделал плату и в TH-варианте. По такой оказии теперь есть два варианта платы драйвера

060-SMD-T2313-Touch-Me.lay - Плата "Touch Me"-драйвера на ATtiny2313 в SMD
060-TH-T2313-Touch-Me.lay - Плата "Touch Me" драйвера на ATtiny2313 в TH

В прошлой статье я попробовал ЛУТом нанести монтажный рисунок на плату. Вышло хорошо! Теперь буду стараться включать слой монтажного рисунка в свои сплановские рисунки печатных плат.

Монтажный рисунок и готовая, запаянная плата выглядят вот так:

Монтажный рискнок на плате Пайка платы готовая плата драйвера

На плате есть два разъема. Один разъем (12 каналов) предназначен для подключения контактных площадок-«сенсоров». Второй разъем служит для подключения программатора, входа-выхода UART, питания схемы. Еще есть места для подключения светодиодов индикации и выхода сигнала нажатия клавиш. Тут как Вам удобней, или разъем не ставить – светодиоды паять прямо на плату, или вынести светодиоды куда удобней и подключать их через разъем.

Распайка платы

Вы заметили, что на плате драйвера появились два новых пина со стороны подключения сенсорных каналов? Это линии GND и Vcc (для питания схемы подключенной к драйверу). Я ввел их для удобства. Файлы рисунков плат я подправил. Если Вы сделали плату без этого разъема, добавить его очень просто – просверлить два отверстия, вставить 2 пина разъема и навесным монтажом, проводами, припаять их параллельно боковому разъему питания. Этот разъем можно и не ставить, а питание взять с бокового разъема управления – смотрите сами.

Плата собрана — готова для прошивки!
Прошивки будут выкладываться для каждого конкретного устройства, поэтому ищите их в статье выбранного Вами устройства.  

Файлы к статье:
060-SMD-T2313-Touch-Me.lay - Плата "Touch Me"-драйвера на ATtiny2313 в SMD
060-TH-T2313-Touch-Me.lay - Плата "Touch Me" драйвера на ATtiny2313 в TH

Ссылки к статье: 
Проект ЭЛМ Чана сенсорных клавиш.

Что можно сделать с этим драйвером:
1 Простой сенсорный кейпад
2 063-12-ти канальный генератор эффектов на ATtiny2313.


(Visited 5 073 times, 14 visits today)

060-Драйвер сенсорной клавиатуры «Touch Me» на ATtiny2313.: 90 комментариев

  1. elektromonstr

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

  2. GetChiper Автор записи

    запросто! чем хороша сенсорная клавиатура — ее делать можно десятками способов.

  3. elektromonstr

    Тогда с нетерпением жду продолжения статьи. Сам сейчас собираю программатор Громова чтоб прошить тини2313 для вашего USBtiny. А такого вида сенсорная клавиатура при надлежащем исполнении будет в разы долговечнее чем на тактовых кнопках. Кстати подам вам идею. Если сделать например 8 контактов в ряд и написать софт получиться чтото типо энкодера. Проводишь вправо или влево дрыгаются разные ножки.

  4. GetChiper Автор записи

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

  5. Hryam

    Всё бы ничего, да вот только как-то западло такое кол-во пинов убивать только на клавиатуру… Это ладно если клавиатура 12 кнопок, а если поболее и ещё вдруг захочется тот же энкодер замутить, это ещё как минимум 3 контакта… Может возможно этот вопрос как-то решить стробированием?

  6. GetChiper Автор записи

    Нет. Только так! Именно такая плата позволит в будущем реализовать много интересных устройств.

    По поводу стробирования — не получиться, такой уж принцип работы…
    Но есть способ увеличить количество кнопок на 12 каналах до нескольких десятков — позже покажу.

    По поводу «убивать только на клавиатуру…» я, если честно, тоже получаю моральное удовлетворение от того, что получается запихнуть в один микроконтроллер максимальное количество примочек (не успокаиваюсь, пока память не закончится :)). Только недавно понял насколько удобно иметь модульную структуру устройства. Всегда можно заменить часть не нарушая общей работоспособности, да и отлаживать проще — в общем-то блог как раз об этом.
    В защиту отдельного микроконтроллера для сенсорной клавиатуры можно привести то, что опросы сенсорных каналов довольно ресурсоемкое занятие (правда можно обрабатывать в фоне, но изваратиться придется, а это уже затраты памяти…).

    Если каналов мало 3-5, то можно всунуть кусок кода и в основной микроконтроллер.
    В конце статьи есть ссылка на проект Элм Чана — там можно взять код на Си, в следующей статье есть исходник сенсорного тачпада на Algorithm Builder`е — все в Ваших руках 🙂

  7. ankar

    Здравствуйте. Все отлично. Единственно, что я сделал это увеличил толщину дорожек ( просто при использовании старой фотопленки ппроходиои пропуски). Еще раз СПАСИБО. И с наступающим НОВЫМ ГОДОМ!!!

  8. GetChiper Автор записи

    Скоро выложу 12-ти канальный генератор световых эффектов на этой плате — на новогодние праздники пригодится :)!
    Только боюсь не успею до Нового Года. Меня понесло с этим проектом — оставшееся свободная память как красная тряпка — добиваю дополнительные навороты.

  9. GetChiper Автор записи

    Добавил два новых пина со стороны подключения сенсорных каналов. Это линии GND и Vcc (для питания схемы подключенной к драйверу). Я ввел их для удобства. Файлы рисунков плат я подправил. Если Вы сделали плату без этого разъема, добавить его очень просто – просверлить два отверстия, вставить 2 пина разъема и навесным монтажом, проводами, припаять их параллельно боковому разъему питания. Этот разъем можно и не ставить, а питание взять с бокового разъема управления – смотрите сами.

  10. don

    Попалась схемка одной немецкой магнитолки с интересным решением клавиатуры: резистивный делитель с отводами от каждого плеча кнопки на землю. Как я понимаю, компаратором анализируется падение на входе и принимается решение, что нажато. На одном входе сидит четыре клавиши, но, я так думаю, это не предел. Резистивный делитель простейший: всё на 1кОм, лишь тот, который непосредственно на ноге контроллера, 680 Ом. Нет желания реализовать? Было бы интересно, просто, боюсь, моих знаний AVR еще очень недостаточно. 🙂

  11. pinco

    Ghостейший-то оно конечно простейший , но по работе скажу что ненадежно это — при износе какой-нибудь из кнопок ее сопротивление начинает «мерцать» при нажатии на нее и тогда контроллер запросто выполняет сработку как будто нажали совсем другую кнопку а не эту — из-за того что действительное текущее сопротивление цепи при нажатой кнопке уплыло от того на которое должен реагировать контроллер и делать привязанное именно к этой кнопке действие , таким образом например нажимаешь к примеру кнопку перестройки приемника а открывается кассетник , или еще что не то срабатывает .Если опрос кнопок как в обычной матрице — то таких ляпов не бывает , даже если кнопка немного поизносится и назначенная ей функция четко срабатывает и никакая другая .Резистивные цепочки с гирляндой кнопок на одном входе АЦП на одном выводе микроконтроллера применяются обычно для удешевления изделий в дешевых магнитолках и музык центрах , но по надежности — отвратные , хотя сама по себе идея так делать неплоха .

  12. Евгений

    А возможно ли обьединение либо увеличение каналов? к примеру количество клавишь обыкновенной 104 клавишной клавиатуре?

  13. GetChiper Автор записи

    Да, можно. Все 12 каналов опрашиваются одновременно. Поэтому если, например, сделать сенсорную площадку наполовину 1го и 3го канала, то при приходе сигналов с этих каналов можно считать нажатой именно эту клавишу. Представляете сколько вариантов?! Мало того на этом драйвере можно сделать тачпад, который помимо нажатий будет выдавать еще и направление перемещения пальца.

  14. Сергей

    Я бы добавил защиту от статики. Защитные диоды в AVR-ках слабенькие (~1мА).

  15. GetChiper Автор записи

    Мегаомные резисторы снимают статическое электричество. Дополнительные элементы будут уменьшать чувствительность клавиш. Но если действительно есть вероятность пробоя, можно в разрыв канала ставит небольшой емкости конденсатор.

  16. kosmogon

    Приветствую. А есть какие либо соображения по толщине диэлектрика? В каких пределах она (толщина) может реально изменятся. Скотч, самоклейка это конечно хорошо. А если что то толще будет, то насколько может?

  17. GetChiper Автор записи

    Порядка миллиметра еще работает, дальше уже будет ненадежно (увеличение площади площадки увеличит чувствительность).

  18. AlekS

    Можно ли в баскоме получить тот же эффект?
    Не могу добиться. Можете пояснить алгоритм работы?
    Если сильны бейсеком, то куском проги.

  19. anatoliy

    @AlekS
    Да хоть на Java 😀 Алгоритм работы в статье! и в первоисточнике

  20. GetChiper Автор записи

    Алгонритм действительно элементарный — реализовать не составит трудности. В статье я описал все по пунктам:
    «Программно, алгоритм работы следующий (x – буква порта, n – номер бита порта):
    1. Порт ножки переводится на вывод (1 -> DDRxn) и сбрасывается в ноль (0 -> PORTxn); …» и т.д.

    Если на баскоме не будет хватать скорости опроса можно в разрывы сенсорных каналов поставить небольшие конденсаторы — это увеличит время перезарядки.

  21. anatoliy

    @GetChiper
    Не смотрел алгоритм но судя по вашему описанию у вас все реализовано тупым перебором. Но можно сделать эффективнее. порт B на прерываниях а оставшиеся 4 ноги опрашивать в главном цикле. Надеюсь у вас время по таймеру считается ? 😉

  22. GetChiper Автор записи

    Можно и так как Вы говорите, но в данном случае, это как раз тот случай когда лучше сделать именно простым перебором. И таймер не используется. Проблема в точности замера и невозможности делать что-то во время сканирования в фоне (или делать само сканирование фоновым).

  23. anatoliy

    Я как-то с дуру делал частотомер на Ttiny2313 так пришлось все прерывания по выключать иначе ошибается. А тут В принципе даже на 8 мегагерцах пока на прерывания пока обратно пока обсчитать. Задержки минимум. ИМХО расточительство МК расходовать на одну клаву. Хотя-бы целиком морду там Дисплей,клаву,МК. Думаю может взять на каком-нибудь универсальном регистре сделать сенсорную клаву. Типа задвинул через SPI разряд на индикатор а прочитал состояние клавы. Регенерировал весь индикатор, сбросил сенсоры. Ато на такую задачу тратить хоть и копеечный МК жаба душит 🙂

  24. GetChiper Автор записи

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

  25. anatoliy

    @GetChiper
    А программный таймер ресурсы не отнимает? МК только и делает что его обслуживает. Хотя проект ваш вам решать 🙂
    Я бы реализовал по вашей концепции. Сканирование по таймеру через промежутки времени. Как-раз быстренько просканировали и побежали дальше 🙂
    Совет:»Учите своих пользователей простым и элегантным решениям»
    Ато будут заниматься быдлокодингом 🙁 А людям потом этот код разбирать :-(((

  26. GetChiper Автор записи

    Ну не обижайте меня так 🙂 Я тут стараюсь как-то код попроще сделать…

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

  27. anatoliy

    @GetChiper
    Ну я немного со своей колокольни 🙂 я про то что там ещё у меня будет Индикация UART и протокол обмена и бибикалка.
    Зачем тупить когда можно просто уснуть 😀

    ИМХО алгоритм такой; Проверяем 1000раз в секунду клаву. По таймеру. Зарядилась сбрасываем. Обнаружили нажатие. Скинули биты клавы в переменную. Нужно измеритель подключить и порядок изменения ёмкости померить. Тогда будет проще фантазировать.
    Теоритически клаву нужно проверять 3-4 раза. Как сбросили. И на уровне когда сенсор гарантированно не сработал. И когда разница в ёмкости максимально заметна.

    Я иногда корпуса из фольгированного стеклотекстолита делаю, очень хорошо с концепцией сенсорной клавы состыкуется.

  28. prik

    GetChiper А возможно ли получить прошивку которая работает по принципу кодового замка тоесть при правельном наборе кода записанного в контроллер он вкл нагрузку в данном случии открывает замок при неверном наборе кода 3 раза он вкл сирену

  29. GetChiper Автор записи

    Да запросто! У меня тут зреет девайс включающий комп по коду на сенсорной клавиатуре (клавиатура должна вставать на место для ДВД привода) — вот Вам и будет то, что Вы хотели!

  30. prik

    ну значит подождем кстати вкл сирены там тоже будет или вы потом доделаете?

  31. GetChiper Автор записи

    Все что нужно допилим потом.

  32. Andrey

    Можно узнать?
    А когда вы закончите делать этот девайс?

  33. GetChiper Автор записи

    Я его еще и не начинал. Но там ничего сложного. Закончу текущий проект — сразу сделаем кодовый замок (с сиреной и набором кода как с панели, так и с включением/отключением пультом-брелком)

  34. godkilller

    GetChiper :
    и энкодер будет, обязательно. и еще много чего интересного. я планирую эту плату использовать по максимуму

    Очень ждём!

  35. geovas

    GetChiper, подскажите пожалуйста, сколько по времени занимает заряд «емкости» у вас? Я пробую собрать (пока чисто из интереса) нечто подобное на msp430g2211. Все в принципе работает, но касание пальцем изменяет время заряда довольно незначительно, это нормально? Я использую аналоговый компаратор для фиксации перехода. Ну так вот: напряжение питания схемы 3.6В, при опорном напряжении 1.8В заряд занимает 57мкС, абсолютно такое же время я получаю при опорном напряжении 0.9В. Мне это кажется несколько странным. При касании пальцем, время заряда становится равным 57-63мкС (постоянно скачет).

  36. GetChiper Автор записи

    Да, процесс довольно нестабилен, вот поэтому и нужно усреднять замеров эдак 30 — 50. Емкость в разы не изменяется. Фактически нужно ориентироваться на изменение времени, при касании пальца, порядка 1/3.

  37. geovas

    @GetChiper
    Ясно, я так и подумал, что надо усреднять. Однако время у меня оказалось значительно меньшим! Я не учел время на на некоторые операции, в итоге получает 20мкС без пальца и 21-22мкС с пальцем. Я в качестве сенсора использую обертку от шоколадки 5×5см она бумажная с очень тонкой металлизацией с одной стороны, видимо это тоже влияет 🙂 Надо будет на текстолите попробовать. Хотя я уже добился довольно высокой чувствительности без усреднения: сенсор лежит на столе, я касаюсь всей пятерней стола с противоположной стороны и сенсор срабатывает!

  38. Aleks_Crow

    Все чудно кроме одного но! — отдавать UART основного МК под драйвер клавиатуры душит жаба, почему бы не использовать TWI? Для простых дополняющих функций вроде часов реального времени или той же самой клавиатуры — самое то! Специально ведь для подобных вещей и разрабатывался.

  39. GetChiper Автор записи

    Будут задействованы одинаковое количество ног МК, в чем выгода?

  40. Aleks_Crow

    Выгода в том, что TWI позволяет подключать к одному порту до 128 устройств, а UART — соединение типа «точка-точка». Но дело конечно же Ваше, я просто предложил, и если Вам этот пунктик не актуален, то соглашусь с Вашей реализацией.

  41. GetChiper Автор записи

    Это да, это верно. И возможно будут варианты и с TWI. Но на данный момент применение UART преследует лишь одну цель — сделать использование моих устройств как можно более простым.

  42. prik

    Добрый день когда все таки появится прошивка для кодового замка посути там немного изменить прошивку что бы при правельном вводе пароля вкл реле

  43. GetChiper Автор записи

    Есть в ближайших планах такое устройство — сделаю по свободе.

  44. SergejGost

    Никто не пытался сделать что либо с резистивным сенсором…от какого либо китайского телефона?Или что подобное.
    Сами то сенсоры не дорогие и очень даже интересно было бы разобраться в таком устройстве.Ведь так же его можно прилепить на соответствующий дисплей и выводить информацию работы устройства.

  45. GetChiper Автор записи

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

  46. SergejGost

    Хоть ссылочку дайте на такую радость!
    Кучу информации перевернул,но только протают там тачи по завышенным ценам.
    Может и не в тему просьба,но очень интересна эта тема.

  47. GetChiper Автор записи

    Наберите в Гугле «AVR резистивный» — Вас удивит разнообразие проектов 🙂

  48. yuzd

    Попробовал по изложенному в статье принципу сделать сенсорную клавиатуру.

    Сначала калибровка:
    перевожу ножку в выход, потом запускаю таймер, перевожу в Z состояние жду появления единицы на ножке, при появлении записываю натиканое время в регистр(напр.R20), потом прибавляю к натиканому числу 10, и храню уже прибавленное значение в том же регистре.

    Потом опрос:
    перевожу ножку в выход, потом запускаю таймер, перевожу в Z состояние жду появления единицы на ножке, при появлении записываю натиканое время в регистр(напр.R21), сравниваю R21 с R20, если R21 больше чем R20, то принимаю это за нажатие. Верчусь в этом цикле опроса.

    Вроде все работает. Собственно вопрос, как сделано у вас?
    Калибровку проводите по одной кнопке или по всем?
    Что принимаете за нажатие? просто число больше калибровочного или как-то по другому?

Добавить комментарий