С этой статьи я начинаю новую серию устройств под условным названием «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.zip (7422 Загрузки)
060-TH-T2313-Touch-Me.zip (6326 Загрузок)
В прошлой статье я попробовал ЛУТом нанести монтажный рисунок на плату. Вышло хорошо! Теперь буду стараться включать слой монтажного рисунка в свои сплановские рисунки печатных плат.
Монтажный рисунок и готовая, запаянная плата выглядят вот так:
На плате есть два разъема. Один разъем (12 каналов) предназначен для подключения контактных площадок-«сенсоров». Второй разъем служит для подключения программатора, входа-выхода UART, питания схемы. Еще есть места для подключения светодиодов индикации и выхода сигнала нажатия клавиш. Тут как Вам удобней, или разъем не ставить – светодиоды паять прямо на плату, или вынести светодиоды куда удобней и подключать их через разъем.
Вы заметили, что на плате драйвера появились два новых пина со стороны подключения сенсорных каналов? Это линии GND и Vcc (для питания схемы подключенной к драйверу). Я ввел их для удобства. Файлы рисунков плат я подправил. Если Вы сделали плату без этого разъема, добавить его очень просто – просверлить два отверстия, вставить 2 пина разъема и навесным монтажом, проводами, припаять их параллельно боковому разъему питания. Этот разъем можно и не ставить, а питание взять с бокового разъема управления – смотрите сами.
Плата собрана — готова для прошивки!
Прошивки будут выкладываться для каждого конкретного устройства, поэтому ищите их в статье выбранного Вами устройства.
Ссылки к статье:
Проект ЭЛМ Чана сенсорных клавиш.
Что можно сделать с этим драйвером:
1 Простой сенсорный кейпад
2 063-12-ти канальный генератор эффектов на ATtiny2313.
По этому устройству делалось много модификаций — поищите в соответствующем разделе
http://www.forum.getchip.net/viewforum.php?f=24&sid=8b9cec619daed5c31114fe0c5f3d63d9
— поможет разобраться
там можно создать и свою тему для модификации
Евгений, здравствуйте, спасибо за быстрый ответ! Сегодня бегло глянул проект. Попробую конечно и сам поразбираться, но боюсь будет куча вопросов! Мне не нужно ни функция Шифта, ни автоповтор. Если будут вопросы по коду, куда Вам можно писать чтоб можно было прикреплять свой вариант «алгоритма»?
Первую свою ошибку уже понял, меги8 мне не хватит, нужны камни в «сороканогом» корпусе мега 8515, мега8535, мега16.
Добрый день. Для такого количества кнопок нужно немного другой способ опроса применять.
Необходимо значительно переделывать программу.
В ближайшее время я таким заняться, к сожалению, не смогу.
Добрый день. У меня возникла необходимость сделать сенсорную клавиатуру 5х5. Возможно ли перенести данный проект на другой камень, например на Мегу8, чтоб хватило выводов? Если это возможно, по подскажите как, или если у Вас есть время то сделайте это сами. Заранее огромное спасибо!
У этого устройства есть куча модификаций — смотрите что может Вам подойти http://www.forum.getchip.net/viewforum.php?f=24
Еще http://www.getchip.net/posts/065-chetyrekhkanalnyjj-sensornyjj-pereklyuchatel-nagruzok/
можно ли эту схему схему реализовать под имеющуюся кнопки для независимого включения и выключения каждой кнопкой т.е. вкл. и выкл. одной и той же кнопкой?
@xorkrus
Я как обычно поторопился. Нашел на форуме тему про мод #065
Не мог бы кто-нибудь переделать код чтоб было так http://www.youtube.com/watch?v=tTjkMKllRGY
коснулся-диод загорелся. Я сам алгоритм билдер не осиливаю от слова совсем :\
Я никогда не вычислял абсолютное значение времени заряда — для устройства это не нужно было. Все расчеты в алгоритме ведутся в относительных величинах — количествах циклов опроса состояния порта.
Уважаемый Евгений, сообщите пожалуйста примерное значение временени зарядки сенсора без пальца и с пальцем.
По моему на форуме чегото-такое скрещивали — нужно искать там.
Всем приветь. А этом проекте можно добавить IR.
http://algrom.net/russian.html
Зачем изучать новую среду? Алгоритм опроса ножки сенсора прост до безобразия и реализуется на любом языке программирования. Тоже касается и автоматической подстройки сенсоров под постоянные составляющие.
Прочитал внимательно весть топик. Имел дело с сенсорами. Но увы, они уже недоступны. Надо делать свое. Помню что на вашем форуме это обсуждалось. За тем и пришел. С аппаратной реализацией конечно все понятно. Простота подкупает. А вот программная. Алгоритм калибровки в общем понятен. Но есть нюансы. Параметры и характеристики того на что наклеен сенсор (сенсоры) могут меняться. Влажность, температура, загрязнения. Нужна автоматическая самокалибровка по времени на медленно изменяющиеся параметры. И нужен учет помех, которые одновременно действуют на все сенсоры. Вы говорите за алгоритм буилдер. Ох, придется еще одну среду изучать…Так как вы работаете на нем. Ну да ладно, не впервой. Где его качнуть можно?
Я так понимаю будут сильные помехи
С таким принципом как используется это будет проблематично — нужны специализированные схемы охранных устройств.
Здравствуйте GetChiper тут такой вопрос а можно ли как то увеличить дальность датчика чтобы реагировал не на палец а скажем на человека который за шел в комнату. На сколько это реально и что для этого понадобится.
Обычно на такие высокоомные входы здорово наводится помеха, особенно ВЧ. Да, нужно только пробовать. Спасибо за ответ.
Это нужно практически опробовать, но принцип каков, что позволяет надеяться на нормальную работу в таких условиях.
Добрый день, уважаемый GetChiper! А как себя ведёт данные сенсоры при воздействии на них сильных эл.-маг. полей. Скажем, рядом работает 1кВт. передатчик?
В принципе можно попробовать, но чем меньше номинал, тем меньше время заряда площадки, а это может сказаться на надежности срабатывания сенсоров. Если есть, то лучше поставить большего номинала.
Уважаемый GetChiper, резисторы какого номинала подойдут для схемы? С 1мОм напряг, есть на 470кОм. Пойдут такие?
я решил взяться за пайку смд впервые, поэтому даже не догадался бы о таком трюке. Я изменил немного рисунок платы, но за ответ спасибо, буду иметь ввиду на будущее!
Да, перемычки. Резисторы соединяются очень просто — припаиваешь их все, потом берешь не толстый залуженный проводок, кладешь сверху резисторов и пропаиваешь сверху. Да, немного, по колхозному 🙂 зато меньше платка и меньше перемычек.
Подскажите пожалуйста — в рисунке печатки под смд две желтые линии это перемычки как я понимаю, не могу вкурить как этой перемычкой мегаомные резисторы соединить?
Сделать-то можно, но вот времени на все не хватает… но как нибудь займусь.
Классная идея. Есть предложение-сделать законченое устройство: расширить кол-во кнопок до 15-ти за счет светодиодов и бипера, а вывод осуществлять при помощи 2-х тригеров 595, на свободный 16 выход прицепить бипер. И будет полностью готовый законченный клавиатурный модуль, кнопки можно сделать как с фиксацией так и без, в зависимости для чего применять(для выбора режима работы кнопок использовать конфигурационное слово, меняем конф. биты перекомпилируем и готово..). Также вместо вывода через 74hc595 можно организовать I2C слейв. Благо времени на сканирование уходит мало. Сканирование засунуть в прерывание, скажем каждые 100 мсек (10 раз в секунду) для 99% случаев достаточно. Где то так…..
Прошу прощения за то, что пытался ввести в заблуждение. Компилятор все верно считает. Операция сравнения выше по приоритету битовых операций
@GetChiper
Спасибо Вам огромное за ответы. Я все таки нашел в чем причина всего того цирка, о котором я писал выше. Оказывается никаких наводок в 2.4В у меня дома нет (слава Богу), просто конструкция:
if (PINB & btnPin == 0) {} //#define btnPin (1 << PINB4)
возвращала мне false
Компилятор наверное вообще наплевал на приоритеты операций и считал так:
if (PINB & (btnPin == 0)) {} // false
вместо
if ((PINB & btnPin) == 0) {} // true
Но, насколько я помню, по приоритету идут сначала унарные операции, потом бинарные, а потом уж все остальное.
Еще интересно как Вы на пищалку подаете сигнал?
У Вас замечательный ресурс, спасибо огромное, что с Вашей помощью люди могут пополнить копилку своих знаний и интересов.
P.S. И да, сенсор все таки у меня получился 🙂 Правда при такой вычислительной нагрузке навряд ли можно еще что-то на камень повесить.
Уж так конкретно «ТОЛЬКО через резистор» сказать нельзя, так как в заряде принимает участие и внутренняя реализация порта МК. Другое дело эта внутренняя составляющая для конкретной ножки постоянная величина и ее легко учитывать. А вот между собой ножки, будем условно говорить «по емкости» разнятся бывает в разы.
Зачастую у меня стоит 8МГц. Я таймером не пользуюсь — напрямую в глухом цикле опрашиваю порт. Так получается наибольшая разрешающая способность + отсутствие каких либо задержек связанных с обработкой таймера.
@GetChiper
Спасибо большое за ответ. Я понимаю, конечно, что там не четкая 1, но я же в первом эксперименте подтягивал ее к питанию. Кстати, тут такой вопрос, если нога подтянута к питанию, то наводок там уже не будет и нога будет заряжаться ТОЛЬКО через резистор? Хотелось бы у Вас узнать на какой частоте работает МК и какой предделить стоит на таймер, чтобы понимать где вообще ловить момент заряда. Может есть способы увеличить емкость или еще что?
Еще раз спасибо
Если ножку оставить в Z- состоянии ни к чему не привязанную — она будет «болтаться» ловя на себя электромагнитные наводки. То что горит светодиод это не значит что на ножке 1 — там каша.
Скорость заряда действительно большая (емкость-то ничтожно маленькая) и ловить этот заряд приходится буквально в десятках тактов генератора.
Здравствуйте всем! Прошу помощи тех кто знает. Ситуация следующая:
я решил сделать подобный сенсор, но люблю все делать сам и по этому стараюсь всегда разобраться в деталях. И чтобы лучше понять как оно все работает сделал одну сенсорную кнопку и повесил ее на 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. Это что помехи такие или как это понимать? Получается что какие бы я не ставил резисторы, в обход них пин будет заряжаться? Я, правда, в схеме не использовал емкостей. Где я что не так делаю или чего не понимаю? Подскажите пожалуйста кто что может. Заранее благодарен.
Не знаю что посоветовать. Может попробовать реализовать такую штуку в CodeVision?
CodeVisionAVR
Слишком сложно что-то сказать… Вы как в билдере?
Здравствуйте! Собрал я ваш сенсорный девайс и такая проблема.Всё работает отлично,всё срабатывает нужным образом ,кроме одной клавиши решётки #.При множественном нажатии или долгом удержании она просто блокируется и горит красный светодиод.Ни на одно прикосновение сенсоры больше не реагируют.Помогает только перезагрузка драйвера.По UART всё проходит без проблем,и диагностика показывает впорядке.Монтаж проверил 10 раз,всё в полном порядке.Что можете посоветовать?
Алгоритм билдер позволяет отлаживать программу прямо в кристалле, чем я и пользуюсь.
А в какой среде возможно сэмулировать этот проект? В proteuse не получилось настроить реакцию контроллера на изменение логического уровня. Какими средствами вы пользовались при разработке этого проекта?
Про 3.3В нужно проверять, но теоретически должно работать. Места остается достаточно.
Токой вопрос — нормальная работа сенсоров а также чувствительность страдают если питание понизить до +3,3В?
такой вопрос (ещё не успел глянуть в код потому и спрашиваю): там хватит места в памяти и ресурсов для мульти-микроконтроллерного UART?
Спасибо за разъяснения, на форуме не мог зарегится, так как не работал сервис проверки картинок, уже все ок
Каждый канал перед запуском в «работу» необходимо откалибровать. Как показывает опыт даже с одинаковыми сенсорными площадками значения каналов довольно сильно разнятся.
Делается это просто: производится последовательно N-замеров канала, результаты замеров складываются и делятся на N (среднее значение). Получившееся значение делим на два (или другой коэффициент исключающий ложные срабатывания и позволяющий надежно определять нажатие — нужно пробовать на практике)- это и будет пороговое значение.
А что там с форумом?
И каким образом делаете усреднение?