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 6 898 times, 5 visits today)

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

  1. yuzd

    И каким образом делаете усреднение?

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

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

    А что там с форумом?

  3. yuzd

    Спасибо за разъяснения, на форуме не мог зарегится, так как не работал сервис проверки картинок, уже все ок

  4. Arcanum

    Токой вопрос — нормальная работа сенсоров а также чувствительность страдают если питание понизить до +3,3В?
    такой вопрос (ещё не успел глянуть в код потому и спрашиваю): там хватит места в памяти и ресурсов для мульти-микроконтроллерного UART?

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

    Про 3.3В нужно проверять, но теоретически должно работать. Места остается достаточно.

  6. lea111

    А в какой среде возможно сэмулировать этот проект? В proteuse не получилось настроить реакцию контроллера на изменение логического уровня. Какими средствами вы пользовались при разработке этого проекта?

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

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

  8. Rkjey

    Здравствуйте! Собрал я ваш сенсорный девайс и такая проблема.Всё работает отлично,всё срабатывает нужным образом ,кроме одной клавиши решётки #.При множественном нажатии или долгом удержании она просто блокируется и горит красный светодиод.Ни на одно прикосновение сенсоры больше не реагируют.Помогает только перезагрузка драйвера.По UART всё проходит без проблем,и диагностика показывает впорядке.Монтаж проверил 10 раз,всё в полном порядке.Что можете посоветовать?

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

    Слишком сложно что-то сказать… Вы как в билдере?

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

    Не знаю что посоветовать. Может попробовать реализовать такую штуку в CodeVision?

  11. Lex.org100h

    Здравствуйте всем! Прошу помощи тех кто знает. Ситуация следующая:
    я решил сделать подобный сенсор, но люблю все делать сам и по этому стараюсь всегда разобраться в деталях. И чтобы лучше понять как оно все работает сделал одну сенсорную кнопку и повесил ее на tiny13 PINB0, подтянул ее через 1Мом к Vcc. Первое что я хотел проверить, за сколько зарядится емкость ножки без прикосновений. Выставил DDRB = 0x01; PORTB = 0 для разряда емкости и далее сделал небольшую задержку, после чего выставил DDRB = 0x00. И тут начался цирк: пришлось выставить 9.6MHz (без делителя частоты), чтобы поймать, что PINB0 становится в 1 уже меньше чем через 2 * 10^-7 сек… быстрее уже без кварца работать камень не сможет. Я отключил кнопку и все провода от камня… оставил только Vсс и Gnd. На PINB2 повесил светодиод, и подправил исходник так, чтобы он загорался, если на PINB0 будет 1. PORTB0 при этом в Hi-z. Как только МК старует, то загорается светодиод, что свидетельствует о том, что на PINB0 1. Это что помехи такие или как это понимать? Получается что какие бы я не ставил резисторы, в обход них пин будет заряжаться? Я, правда, в схеме не использовал емкостей. Где я что не так делаю или чего не понимаю? Подскажите пожалуйста кто что может. Заранее благодарен.

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

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

  13. Lex.org100h

    @GetChiper
    Спасибо большое за ответ. Я понимаю, конечно, что там не четкая 1, но я же в первом эксперименте подтягивал ее к питанию. Кстати, тут такой вопрос, если нога подтянута к питанию, то наводок там уже не будет и нога будет заряжаться ТОЛЬКО через резистор? Хотелось бы у Вас узнать на какой частоте работает МК и какой предделить стоит на таймер, чтобы понимать где вообще ловить момент заряда. Может есть способы увеличить емкость или еще что?
    Еще раз спасибо

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

    Уж так конкретно «ТОЛЬКО через резистор» сказать нельзя, так как в заряде принимает участие и внутренняя реализация порта МК. Другое дело эта внутренняя составляющая для конкретной ножки постоянная величина и ее легко учитывать. А вот между собой ножки, будем условно говорить «по емкости» разнятся бывает в разы.
    Зачастую у меня стоит 8МГц. Я таймером не пользуюсь — напрямую в глухом цикле опрашиваю порт. Так получается наибольшая разрешающая способность + отсутствие каких либо задержек связанных с обработкой таймера.

  15. Lex.org100h

    @GetChiper
    Спасибо Вам огромное за ответы. Я все таки нашел в чем причина всего того цирка, о котором я писал выше. Оказывается никаких наводок в 2.4В у меня дома нет (слава Богу), просто конструкция:
    if (PINB & btnPin == 0) {} //#define btnPin (1 << PINB4)
    возвращала мне false
    Компилятор наверное вообще наплевал на приоритеты операций и считал так:
    if (PINB & (btnPin == 0)) {} // false
    вместо
    if ((PINB & btnPin) == 0) {} // true
    Но, насколько я помню, по приоритету идут сначала унарные операции, потом бинарные, а потом уж все остальное.
    Еще интересно как Вы на пищалку подаете сигнал?

    У Вас замечательный ресурс, спасибо огромное, что с Вашей помощью люди могут пополнить копилку своих знаний и интересов.

    P.S. И да, сенсор все таки у меня получился 🙂 Правда при такой вычислительной нагрузке навряд ли можно еще что-то на камень повесить.

  16. Lex.org100h

    Прошу прощения за то, что пытался ввести в заблуждение. Компилятор все верно считает. Операция сравнения выше по приоритету битовых операций

  17. roma2005

    Классная идея. Есть предложение-сделать законченое устройство: расширить кол-во кнопок до 15-ти за счет светодиодов и бипера, а вывод осуществлять при помощи 2-х тригеров 595, на свободный 16 выход прицепить бипер. И будет полностью готовый законченный клавиатурный модуль, кнопки можно сделать как с фиксацией так и без, в зависимости для чего применять(для выбора режима работы кнопок использовать конфигурационное слово, меняем конф. биты перекомпилируем и готово..). Также вместо вывода через 74hc595 можно организовать I2C слейв. Благо времени на сканирование уходит мало. Сканирование засунуть в прерывание, скажем каждые 100 мсек (10 раз в секунду) для 99% случаев достаточно. Где то так…..

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

    Сделать-то можно, но вот времени на все не хватает… но как нибудь займусь.

  19. arestant

    Подскажите пожалуйста — в рисунке печатки под смд две желтые линии это перемычки как я понимаю, не могу вкурить как этой перемычкой мегаомные резисторы соединить?

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

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

  21. arestant

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

  22. chukcha1979

    Уважаемый GetChiper, резисторы какого номинала подойдут для схемы? С 1мОм напряг, есть на 470кОм. Пойдут такие?

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

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

  24. SAMCAT

    Добрый день, уважаемый GetChiper! А как себя ведёт данные сенсоры при воздействии на них сильных эл.-маг. полей. Скажем, рядом работает 1кВт. передатчик?

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

    Это нужно практически опробовать, но принцип каков, что позволяет надеяться на нормальную работу в таких условиях.

  26. SAMCAT

    Обычно на такие высокоомные входы здорово наводится помеха, особенно ВЧ. Да, нужно только пробовать. Спасибо за ответ.

  27. gavrilCbwd78

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

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

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

  29. gavrilCbwd78

    Я так понимаю будут сильные помехи

  30. kosmogon

    Прочитал внимательно весть топик. Имел дело с сенсорами. Но увы, они уже недоступны. Надо делать свое. Помню что на вашем форуме это обсуждалось. За тем и пришел. С аппаратной реализацией конечно все понятно. Простота подкупает. А вот программная. Алгоритм калибровки в общем понятен. Но есть нюансы. Параметры и характеристики того на что наклеен сенсор (сенсоры) могут меняться. Влажность, температура, загрязнения. Нужна автоматическая самокалибровка по времени на медленно изменяющиеся параметры. И нужен учет помех, которые одновременно действуют на все сенсоры. Вы говорите за алгоритм буилдер. Ох, придется еще одну среду изучать…Так как вы работаете на нем. Ну да ладно, не впервой. Где его качнуть можно?

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

    http://algrom.net/russian.html

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

  32. o.merganov

    Всем приветь. А этом проекте можно добавить IR.

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

    По моему на форуме чегото-такое скрещивали — нужно искать там.

  34. Gnusmas

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

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

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

  36. xorkrus

    Не мог бы кто-нибудь переделать код чтоб было так http://www.youtube.com/watch?v=tTjkMKllRGY
    коснулся-диод загорелся. Я сам алгоритм билдер не осиливаю от слова совсем :\

  37. xorkrus

    @xorkrus
    Я как обычно поторопился. Нашел на форуме тему про мод #065

  38. Евгений-Пашков

    можно ли эту схему схему реализовать под имеющуюся кнопки для независимого включения и выключения каждой кнопкой т.е. вкл. и выкл. одной и той же кнопкой?

  39. MarkAntoniy

    Добрый день. У меня возникла необходимость сделать сенсорную клавиатуру 5х5. Возможно ли перенести данный проект на другой камень, например на Мегу8, чтоб хватило выводов? Если это возможно, по подскажите как, или если у Вас есть время то сделайте это сами. Заранее огромное спасибо!

  40. admin Автор записи

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

  41. MarkAntoniy

    Евгений, здравствуйте, спасибо за быстрый ответ! Сегодня бегло глянул проект. Попробую конечно и сам поразбираться, но боюсь будет куча вопросов! Мне не нужно ни функция Шифта, ни автоповтор. Если будут вопросы по коду, куда Вам можно писать чтоб можно было прикреплять свой вариант «алгоритма»?
    Первую свою ошибку уже понял, меги8 мне не хватит, нужны камни в «сороканогом» корпусе мега 8515, мега8535, мега16.

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