С этой статьи я начинаю новую серию устройств под условным названием «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 (6936 Загрузок)
060-TH-T2313-Touch-Me.zip (5800 Загрузок)
В прошлой статье я попробовал ЛУТом нанести монтажный рисунок на плату. Вышло хорошо! Теперь буду стараться включать слой монтажного рисунка в свои сплановские рисунки печатных плат.
Монтажный рисунок и готовая, запаянная плата выглядят вот так:
На плате есть два разъема. Один разъем (12 каналов) предназначен для подключения контактных площадок-«сенсоров». Второй разъем служит для подключения программатора, входа-выхода UART, питания схемы. Еще есть места для подключения светодиодов индикации и выхода сигнала нажатия клавиш. Тут как Вам удобней, или разъем не ставить – светодиоды паять прямо на плату, или вынести светодиоды куда удобней и подключать их через разъем.
Вы заметили, что на плате драйвера появились два новых пина со стороны подключения сенсорных каналов? Это линии GND и Vcc (для питания схемы подключенной к драйверу). Я ввел их для удобства. Файлы рисунков плат я подправил. Если Вы сделали плату без этого разъема, добавить его очень просто – просверлить два отверстия, вставить 2 пина разъема и навесным монтажом, проводами, припаять их параллельно боковому разъему питания. Этот разъем можно и не ставить, а питание взять с бокового разъема управления – смотрите сами.
Плата собрана — готова для прошивки!
Прошивки будут выкладываться для каждого конкретного устройства, поэтому ищите их в статье выбранного Вами устройства.
Ссылки к статье:
Проект ЭЛМ Чана сенсорных клавиш.
Что можно сделать с этим драйвером:
1 Простой сенсорный кейпад
2 063-12-ти канальный генератор эффектов на ATtiny2313.
Попробовал по изложенному в статье принципу сделать сенсорную клавиатуру.
Сначала калибровка:
перевожу ножку в выход, потом запускаю таймер, перевожу в Z состояние жду появления единицы на ножке, при появлении записываю натиканое время в регистр(напр.R20), потом прибавляю к натиканому числу 10, и храню уже прибавленное значение в том же регистре.
Потом опрос:
перевожу ножку в выход, потом запускаю таймер, перевожу в Z состояние жду появления единицы на ножке, при появлении записываю натиканое время в регистр(напр.R21), сравниваю R21 с R20, если R21 больше чем R20, то принимаю это за нажатие. Верчусь в этом цикле опроса.
Вроде все работает. Собственно вопрос, как сделано у вас?
Калибровку проводите по одной кнопке или по всем?
Что принимаете за нажатие? просто число больше калибровочного или как-то по другому?
Наберите в Гугле «AVR резистивный» — Вас удивит разнообразие проектов 🙂
Хоть ссылочку дайте на такую радость!
Кучу информации перевернул,но только протают там тачи по завышенным ценам.
Может и не в тему просьба,но очень интересна эта тема.
Резистивные сенсорные экраны довольно просты и им не нужен специальный отдельный контроллер — обработкой запросто может заниматься микроконтроллер устройства параллельно с основной задачей. В нете есть много проектов на таких экранчиках.
Вот к примеру Интегральные контроллеры сенсорных экранов http://www.cec-mc.ru/1.pdf
Никто не пытался сделать что либо с резистивным сенсором…от какого либо китайского телефона?Или что подобное.
Сами то сенсоры не дорогие и очень даже интересно было бы разобраться в таком устройстве.Ведь так же его можно прилепить на соответствующий дисплей и выводить информацию работы устройства.
Есть в ближайших планах такое устройство — сделаю по свободе.
Добрый день когда все таки появится прошивка для кодового замка посути там немного изменить прошивку что бы при правельном вводе пароля вкл реле
Это да, это верно. И возможно будут варианты и с TWI. Но на данный момент применение UART преследует лишь одну цель — сделать использование моих устройств как можно более простым.
Выгода в том, что TWI позволяет подключать к одному порту до 128 устройств, а UART — соединение типа «точка-точка». Но дело конечно же Ваше, я просто предложил, и если Вам этот пунктик не актуален, то соглашусь с Вашей реализацией.
Будут задействованы одинаковое количество ног МК, в чем выгода?
Все чудно кроме одного но! — отдавать UART основного МК под драйвер клавиатуры душит жаба, почему бы не использовать TWI? Для простых дополняющих функций вроде часов реального времени или той же самой клавиатуры — самое то! Специально ведь для подобных вещей и разрабатывался.
@GetChiper
Ясно, я так и подумал, что надо усреднять. Однако время у меня оказалось значительно меньшим! Я не учел время на на некоторые операции, в итоге получает 20мкС без пальца и 21-22мкС с пальцем. Я в качестве сенсора использую обертку от шоколадки 5×5см она бумажная с очень тонкой металлизацией с одной стороны, видимо это тоже влияет 🙂 Надо будет на текстолите попробовать. Хотя я уже добился довольно высокой чувствительности без усреднения: сенсор лежит на столе, я касаюсь всей пятерней стола с противоположной стороны и сенсор срабатывает!
Да, процесс довольно нестабилен, вот поэтому и нужно усреднять замеров эдак 30 — 50. Емкость в разы не изменяется. Фактически нужно ориентироваться на изменение времени, при касании пальца, порядка 1/3.
GetChiper, подскажите пожалуйста, сколько по времени занимает заряд «емкости» у вас? Я пробую собрать (пока чисто из интереса) нечто подобное на msp430g2211. Все в принципе работает, но касание пальцем изменяет время заряда довольно незначительно, это нормально? Я использую аналоговый компаратор для фиксации перехода. Ну так вот: напряжение питания схемы 3.6В, при опорном напряжении 1.8В заряд занимает 57мкС, абсолютно такое же время я получаю при опорном напряжении 0.9В. Мне это кажется несколько странным. При касании пальцем, время заряда становится равным 57-63мкС (постоянно скачет).
Очень ждём!
Я его еще и не начинал. Но там ничего сложного. Закончу текущий проект — сразу сделаем кодовый замок (с сиреной и набором кода как с панели, так и с включением/отключением пультом-брелком)
Можно узнать?
А когда вы закончите делать этот девайс?
Все что нужно допилим потом.
ну значит подождем кстати вкл сирены там тоже будет или вы потом доделаете?
Да запросто! У меня тут зреет девайс включающий комп по коду на сенсорной клавиатуре (клавиатура должна вставать на место для ДВД привода) — вот Вам и будет то, что Вы хотели!
GetChiper А возможно ли получить прошивку которая работает по принципу кодового замка тоесть при правельном наборе кода записанного в контроллер он вкл нагрузку в данном случии открывает замок при неверном наборе кода 3 раза он вкл сирену
@GetChiper
Ну я немного со своей колокольни 🙂 я про то что там ещё у меня будет Индикация UART и протокол обмена и бибикалка.
Зачем тупить когда можно просто уснуть 😀
ИМХО алгоритм такой; Проверяем 1000раз в секунду клаву. По таймеру. Зарядилась сбрасываем. Обнаружили нажатие. Скинули биты клавы в переменную. Нужно измеритель подключить и порядок изменения ёмкости померить. Тогда будет проще фантазировать.
Теоритически клаву нужно проверять 3-4 раза. Как сбросили. И на уровне когда сенсор гарантированно не сработал. И когда разница в ёмкости максимально заметна.
Я иногда корпуса из фольгированного стеклотекстолита делаю, очень хорошо с концепцией сенсорной клавы состыкуется.
Ну не обижайте меня так 🙂 Я тут стараюсь как-то код попроще сделать…
По таймеру сканирование можно запросто запускать. Можно сканирование производить в теле процедуры обработки прерывания по таймеру. Но использовать таймер для расчета промежутка времени перезарядки сенсора избыточно, и не потому, что сложно или памяти больше уходит, а по причине того, что во время замера ничем заниматься нельзя — так зачем запускать таймер, что-бы потом тупить в пустом цикле — вот о чем я говорю.
@GetChiper
А программный таймер ресурсы не отнимает? МК только и делает что его обслуживает. Хотя проект ваш вам решать 🙂
Я бы реализовал по вашей концепции. Сканирование по таймеру через промежутки времени. Как-раз быстренько просканировали и побежали дальше 🙂
Совет:»Учите своих пользователей простым и элегантным решениям»
Ато будут заниматься быдлокодингом 🙁 А людям потом этот код разбирать :-(((
Смешно звучит, но реализуя алгоритм «в лоб» я как раз и заботился о экономии ресурсов. При таком способе все таймеры остаются для основной программы, код значительно меньше (чем при реализации по прерываниям и с таймером), а само сканирование занимает немного времени (быстренько просканировал сенсоры и занимай контроллер основной задачей — та-же индикация).
Я как-то с дуру делал частотомер на Ttiny2313 так пришлось все прерывания по выключать иначе ошибается. А тут В принципе даже на 8 мегагерцах пока на прерывания пока обратно пока обсчитать. Задержки минимум. ИМХО расточительство МК расходовать на одну клаву. Хотя-бы целиком морду там Дисплей,клаву,МК. Думаю может взять на каком-нибудь универсальном регистре сделать сенсорную клаву. Типа задвинул через SPI разряд на индикатор а прочитал состояние клавы. Регенерировал весь индикатор, сбросил сенсоры. Ато на такую задачу тратить хоть и копеечный МК жаба душит 🙂
Можно и так как Вы говорите, но в данном случае, это как раз тот случай когда лучше сделать именно простым перебором. И таймер не используется. Проблема в точности замера и невозможности делать что-то во время сканирования в фоне (или делать само сканирование фоновым).
@GetChiper
Не смотрел алгоритм но судя по вашему описанию у вас все реализовано тупым перебором. Но можно сделать эффективнее. порт B на прерываниях а оставшиеся 4 ноги опрашивать в главном цикле. Надеюсь у вас время по таймеру считается ? 😉
Алгонритм действительно элементарный — реализовать не составит трудности. В статье я описал все по пунктам:
«Программно, алгоритм работы следующий (x – буква порта, n – номер бита порта):
1. Порт ножки переводится на вывод (1 -> DDRxn) и сбрасывается в ноль (0 -> PORTxn); …» и т.д.
Если на баскоме не будет хватать скорости опроса можно в разрывы сенсорных каналов поставить небольшие конденсаторы — это увеличит время перезарядки.
@AlekS
Да хоть на Java 😀 Алгоритм работы в статье! и в первоисточнике
Можно ли в баскоме получить тот же эффект?
Не могу добиться. Можете пояснить алгоритм работы?
Если сильны бейсеком, то куском проги.
Порядка миллиметра еще работает, дальше уже будет ненадежно (увеличение площади площадки увеличит чувствительность).
Приветствую. А есть какие либо соображения по толщине диэлектрика? В каких пределах она (толщина) может реально изменятся. Скотч, самоклейка это конечно хорошо. А если что то толще будет, то насколько может?
Мегаомные резисторы снимают статическое электричество. Дополнительные элементы будут уменьшать чувствительность клавиш. Но если действительно есть вероятность пробоя, можно в разрыв канала ставит небольшой емкости конденсатор.
Я бы добавил защиту от статики. Защитные диоды в AVR-ках слабенькие (~1мА).
Да, можно. Все 12 каналов опрашиваются одновременно. Поэтому если, например, сделать сенсорную площадку наполовину 1го и 3го канала, то при приходе сигналов с этих каналов можно считать нажатой именно эту клавишу. Представляете сколько вариантов?! Мало того на этом драйвере можно сделать тачпад, который помимо нажатий будет выдавать еще и направление перемещения пальца.
А возможно ли обьединение либо увеличение каналов? к примеру количество клавишь обыкновенной 104 клавишной клавиатуре?
Ghостейший-то оно конечно простейший , но по работе скажу что ненадежно это — при износе какой-нибудь из кнопок ее сопротивление начинает «мерцать» при нажатии на нее и тогда контроллер запросто выполняет сработку как будто нажали совсем другую кнопку а не эту — из-за того что действительное текущее сопротивление цепи при нажатой кнопке уплыло от того на которое должен реагировать контроллер и делать привязанное именно к этой кнопке действие , таким образом например нажимаешь к примеру кнопку перестройки приемника а открывается кассетник , или еще что не то срабатывает .Если опрос кнопок как в обычной матрице — то таких ляпов не бывает , даже если кнопка немного поизносится и назначенная ей функция четко срабатывает и никакая другая .Резистивные цепочки с гирляндой кнопок на одном входе АЦП на одном выводе микроконтроллера применяются обычно для удешевления изделий в дешевых магнитолках и музык центрах , но по надежности — отвратные , хотя сама по себе идея так делать неплоха .
Вы только подумали, а я уже сделал 🙂
http://www.getchip.net/posts/047-drajjver-matrichnojj-klaviatury-3kh4-na-attiny13-s-uart-vykhodom/
Попалась схемка одной немецкой магнитолки с интересным решением клавиатуры: резистивный делитель с отводами от каждого плеча кнопки на землю. Как я понимаю, компаратором анализируется падение на входе и принимается решение, что нажато. На одном входе сидит четыре клавиши, но, я так думаю, это не предел. Резистивный делитель простейший: всё на 1кОм, лишь тот, который непосредственно на ноге контроллера, 680 Ом. Нет желания реализовать? Было бы интересно, просто, боюсь, моих знаний AVR еще очень недостаточно. 🙂
Добавил два новых пина со стороны подключения сенсорных каналов. Это линии GND и Vcc (для питания схемы подключенной к драйверу). Я ввел их для удобства. Файлы рисунков плат я подправил. Если Вы сделали плату без этого разъема, добавить его очень просто – просверлить два отверстия, вставить 2 пина разъема и навесным монтажом, проводами, припаять их параллельно боковому разъему питания. Этот разъем можно и не ставить, а питание взять с бокового разъема управления – смотрите сами.
Скоро выложу 12-ти канальный генератор световых эффектов на этой плате — на новогодние праздники пригодится :)!
Только боюсь не успею до Нового Года. Меня понесло с этим проектом — оставшееся свободная память как красная тряпка — добиваю дополнительные навороты.
Здравствуйте. Все отлично. Единственно, что я сделал это увеличил толщину дорожек ( просто при использовании старой фотопленки ппроходиои пропуски). Еще раз СПАСИБО. И с наступающим НОВЫМ ГОДОМ!!!
Нет. Только так! Именно такая плата позволит в будущем реализовать много интересных устройств.
По поводу стробирования — не получиться, такой уж принцип работы…
Но есть способ увеличить количество кнопок на 12 каналах до нескольких десятков — позже покажу.
По поводу «убивать только на клавиатуру…» я, если честно, тоже получаю моральное удовлетворение от того, что получается запихнуть в один микроконтроллер максимальное количество примочек (не успокаиваюсь, пока память не закончится :)). Только недавно понял насколько удобно иметь модульную структуру устройства. Всегда можно заменить часть не нарушая общей работоспособности, да и отлаживать проще — в общем-то блог как раз об этом.
В защиту отдельного микроконтроллера для сенсорной клавиатуры можно привести то, что опросы сенсорных каналов довольно ресурсоемкое занятие (правда можно обрабатывать в фоне, но изваратиться придется, а это уже затраты памяти…).
Если каналов мало 3-5, то можно всунуть кусок кода и в основной микроконтроллер.
В конце статьи есть ссылка на проект Элм Чана — там можно взять код на Си, в следующей статье есть исходник сенсорного тачпада на Algorithm Builder`е — все в Ваших руках 🙂
Всё бы ничего, да вот только как-то западло такое кол-во пинов убивать только на клавиатуру… Это ладно если клавиатура 12 кнопок, а если поболее и ещё вдруг захочется тот же энкодер замутить, это ещё как минимум 3 контакта… Может возможно этот вопрос как-то решить стробированием?
и энкодер будет, обязательно. и еще много чего интересного. я планирую эту плату использовать по максимуму
Тогда с нетерпением жду продолжения статьи. Сам сейчас собираю программатор Громова чтоб прошить тини2313 для вашего USBtiny. А такого вида сенсорная клавиатура при надлежащем исполнении будет в разы долговечнее чем на тактовых кнопках. Кстати подам вам идею. Если сделать например 8 контактов в ряд и написать софт получиться чтото типо энкодера. Проводишь вправо или влево дрыгаются разные ножки.
запросто! чем хороша сенсорная клавиатура — ее делать можно десятками способов.
Здравствуйте. Вот такой вопрос. Через слой пленки для ламинирования работать будет? Просто удобно было бы вытравить площадки на текстолите, распечатать на цветном принтере кнопки а сверху пленку и в ламинатор.