Еще раз о емкостных сенсорах.

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



Вообще говоря, существует много емкостных методик определения касания. Самый древний подход — определение касания по наводкам от силовой сети, которые всегда присутствуют на теле человека (если он, конечно, не находится в чистом поле). Во вторую группу можно выделить QTouch'еобразные (основанные на перекачивании в накопительный конденсатор заряда с сенсора и последующем измерении его величины) подходы, отличающиеся алгоритмами обработки, формой датчиков, подходом к фильтрации помех, etc. Посмотреть на реализацию такой системы на коленке, а также почитать подробное описание идеи работы такой системы на русском можно тут. В этой же статье нас будет интересовать третий подход, менее продвинутый, но гораздо более простой относительно второго и надежный относительно первого — непосредственное измерение емкости пластины сенсора. В принципе, и об этом уже писал Elm-Chan. Но попробуем повторить то же самое по-русски и не глядя в чужие исходники.

Для опыта я буду использовать свою макетку с установленной ATmega48, так что пример будет под AVR.

Итак, идея состоит в том, что любой объект имеет емкость, а современные микроконтроллеры работают на такой скорости, которая позволяет измерить емкость даже отдельного кусочка фольги размером 1х1 см. — примерно такого размера обычно выбирается сенсор в этом методе, очевидно, по размеру пальца, ибо подобный подход пригоден прежде всего для реализации отдельных сенсорных кнопок. Когда к такой кнопке прикасается человек, ее емкость существенно возрастает, что и регистрирует контроллер, принимая решение о нажатии. Итак, включим все следующим образом:



Ножка микроконтроллера подтягивается к питанию резистором достаточно большого номинала (1 мегаом), и к ней же подключается площадка сенсора. Оценка емкости производится путем измерения времени заряда площадки до напряжения логической единицы — это возможно, поскольку выводы микроконтроллера обладают пороговыми свойствами, т.е., в регистре PIN будет читаться единица начиная с какого-то определенного уровня (около 1В, немного различается для разных кристаллов). Алгоритм опроса такого сенсора выглядит следующим образом:

1. Настроить ножку на выход;
2. Подать на нее логический ноль, чтобы гарантированно разрядить сенсор перед замером;
3. Настроить ножку на вход;
4. Посчитать, за сколько тактов напряжение на ней достигнет единицы.

Все вышесказанное я воплотил в такой код:


uint8_t pad_chg_time(uint8_t pad_mask)
{
  volatile uint8_t tck=0;

  //Discharging pin
  SNS_DDR|=pad_mask;
  SNS_PORT&=~SNS_PADPIN;
  //Starting pin charge
  SNS_DDR&=~pad_mask;

  while (!(SNS_PIN & pad_mask))
    tck++;

  return tck;
}


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

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


uint8_t pad_touched(void)
{
  static uint8_t prev_state=0;
  uint8_t chg=pad_chg_time(SNS_PADPIN);

  if (chg>SNS_TH_MAX)
    prev_state=1;
  if (chg<SNS_TH_MIN)
    prev_state=0;

  return prev_state;
}


Идея следующая:

1. Опрашиваем сенсор;
2. Если значение выше порога касания — регистрируем касание и запоминаем это.
3. Если значение ниже порога свободного сенсора — регистрируем пустой сенсор и запоминаем это.
4. Выдаем запомненное значение.

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

Вышеприведенные участки кода — фрагменты проекта, который я по-быстрому набросал в AVR Studio + WinAVR и который приложен в аттаче.

Ну и пара картинок напоследок.

Сам сенсор (на ножке PD7):



Процесс тестирования:



  • +13
  • 13 января 2012, 21:28
  • _YS_
  • 1
Файлы в топике: smp_cap.zip

Комментарии (73)

RSS свернуть / развернуть
Добавь еще краткое пояснение того, на каком принципе QTouch работает.
0
  • avatar
  • Vga
  • 13 января 2012, 21:43
А стоит ли? По ссылке, которую я привел, все объеснено достаточно сжато, понятно и на русском. Сомневаюсь, что у меня выйдет лучше…
0
*объяснено
0
Я говорю не про объяснение, а про принцип работы. Как это указано для первого способа — детектирование наводок. Тут — накачка заряда в буферный конденсатор через конденсатор-сенсор.
+1
Ну ОК, сейчас будет.
0
Э-э-э, нет, не будет.

Редактирование топиков определенной давности или к которым есть комментарии, ограничено администратором
0
А раньше было можно. :(
0
Гм. А вот это хреново. Надеюсь, Ди вернет как было.
+3
WTF?!
+2
Теперь можно редактировать. Так что вперед)
+1
Готово, учел все пожелания. И, кстати, пофиксил приложенный файлик — он не качался.
0
А если делать без гистерезиса, то можно поиметь немалый профит, опрашивая сразу несколько кнопок:
1) Порт к земле
2) Порт на вход
3) Ждем n тактов
4) Читаем порт
Считаем, что если за n тактов напряжение не успело возрасти (и данный бит считался как 0), то кнопа нажата.

Я делал без гистерезиса, и таки да, вышло немного кривовато. Но все-же вполне работало. Больше мне не нравилось другое — через что-то толще листа бумаги кнопка работать уже не желала — можно было увеличить номинал подтягивающего резистора, но тогда появлялся неиллюзорный риск словить помеху. Отсюда вопрос — через что-то толще пакетика она работает? :)
+1
А, я собственно чо пришел — годная статья, +1 :)
+1
Спасибо. :)
0
Спойлер: скоро будет еще одна статья. ;)
0
Э-э-э… А что мешает опрашивать много кнопок с гистерезисом?
0
Это не получится так-же просто и красиво, как без него :)
0
Хм. Ну завести три массива с битовыми масками кнопок и их значениями MIN/MAX. Неужто все станет так страшно? :)
0
А если кнопки одинаковые, то и MIN/MAX можно считать одинаковыми.
0
через что-то толще пакетика она работает?


Сомневаюсь. Сам принцип к тому не располагает.
+1
А по какому принципу может работать? Интересует принцип емкостного сенсора, умеющего отличать поднесенный палец на расстоянии 6-10мм.
0
Это в основном к схемам типа QTouch.

P.S.

Да, лучше ответить поздно, чем никогда. :)
0
Сразу оговорюсь, что эту тему особо не копал, и на практике не пробовал, но всегда казалось, что ёмкость «НЕнажатой» площадки может плавать с влажностью, например, или с положением больших проводящих предметов в окружающем пространстве… Никто это дело случайно не тестировал?
Посему мне казалось более надёжным проверять не абсолютную ёмкость площадки, а разницу с её же ёмкостью какое-то время назад. Типа если ёмкость растёт «быстрее, чем очень медленно», то нажали. В теории, такую дифференциальную систему проверки можно сделать более чувствительной, чем с абсолютным порогом. Может и «через что-то толще пакетика» удастся работать )
0
Ну, так для этого и вводится гистерезис. :)
0
да там даже лучше не гистерезис, а постоянную автоподстройку уровня.
0
Статья кошерная. Вот нашелся бы герой, который написал как работать с сенсорной библиотекой Atmel QTouch Library, вообще я бы рад был до охуения!
0
По ходу, для STM8 есть аналогичная.
0
Моё сочинение по теме habrahabr.ru/blogs/DIY/132739/
+1
У данного подхода есть приличный и неочевидный минус, выловленный мной в виде забавного глюка в уже собранном усройстве. А именно — необходимость самому устройству иметь достаточно большую емкость. Проявляется следующим образом: при работе от лабораторного БП размерами в полстола срабатывание кнопок отслеживается стабильно. Стоит заменить БП на маленький зарядник от мобилки — все, срабатывания (прикосновения к сенсору) отлавливаются через раз-два. Подключаем осциллограф (старый большой советский) чтобы глянуть что там с питанием, может плавает аль помехи какие — все снова стабильно работает. Достаточно просто соединить минус питания устройства с минусовым щупом осцилла. Т.к. устройство у меня в пластмассовом корпусе — проблему решил куском пищевой фольги размером с лист А4, лежащем на дне :) Заодно и экран защитный получился.
+2
Плюсую. Мне очень понравилось.
0
  • avatar
  • yars
  • 14 января 2012, 16:32
Огромнейшее спасибо!
все расписано четко и ясно
тем более для АВР. Как только сделаю свою свечу, отлажу то выложу статью. планирую еще микрофон добавить и еще светодиодов будет три
0
  • avatar
  • z80
  • 14 января 2012, 18:59
отплюсовал. заодно обзпвелся гугля+ :)
0
Ждем-ждем :)
0
как вовремя. именно этим и игрался последние 2 дня и результат именно такой же — толще листа бумаги и поведение непредсказуемое.
Алгоритм немножко другой (подсмотрел у stm8) После включения несколько циклов измеряю скорость заряда и разряда, запоминаю максимальные значения — это адаптация к окружающей среде. А дальше ловлю значения выходящие за эти параметры.
0
  • avatar
  • S64
  • 14 января 2012, 19:36
Гситерезис вводили?
0
*гистерезис
0
я именно игрался… подключил отладчик и смотрел что у меня реально отлавливает контроллер.
0
Спасибо всем, рад, что статья пришлась кстати. Хотя, честно сказать, я не расчитывал на такой успех. Я, кагбэ, ничего нового-то не сказал, только собрал в кучку то, что рассеяно по сети. :)
0
  • avatar
  • _YS_
  • 14 января 2012, 19:38
Именно тем и ценен Интернет и такие люди, которым не влом «собрать все в кучку» :) Спасибо за статью!
0
Да, кагбэ не за что…
0
Делал аналогичным образом датчик воды. Два куска одностороннего текстолита, размером 2х5 см, медью друг к другу, на расстоянии около 1 мм. На одну сторону подключается земля, на другую — такой же сенсор как в статье. Всё покрыто несколькими слоями лака для изоляции. Вода увеличивает ёмкость получаемого конденсатора, ловит довольно стабильно.
0
  • avatar
  • ACE
  • 14 января 2012, 20:43

while (!(SNS_PIN & pad_mask))
    tck++;

Неужели эта конструкция выполняется за такт?
0
Нет. Но тут это, в общем, не важно. Считаем-то в попугаях.
0
Это понятно, ну а если человек не совсем разбирается. Потом процитирует и будут над ним смеяться. По-моему нехорошо такие вольности допускать, надо написать что просто считаем попугаев.
0
Мы считаем такты цикла.

Дизассемблер:


14:         SNS_DDR&=~pad_mask;
+0000004B:   B19A        IN      R25,0x0A         In from I/O location
+0000004C:   2F82        MOV     R24,R18          Copy register
+0000004D:   9580        COM     R24              One's complement
+0000004E:   2389        AND     R24,R25          Logical AND
+0000004F:   B98A        OUT     0x0A,R24         Out to I/O location
+00000050:   C003        RJMP    PC+0x0004        Relative jump
17:           tck++;
+00000051:   8189        LDD     R24,Y+1          Load indirect with displacement
+00000052:   5F8F        SUBI    R24,0xFF         Subtract immediate
+00000053:   8389        STD     Y+1,R24          Store indirect with displacement
16:         while (!(SNS_PIN & pad_mask))
+00000054:   B189        IN      R24,0x09         In from I/O location
+00000055:   2382        AND     R24,R18          Logical AND
+00000056:   F3D1        BREQ    PC-0x05          Branch if equal
19:         return tck;
+00000057:   8189        LDD     R24,Y+1          Load indirect with displacement
0
А где это написано в статье?
0
Это подразумевается. Полюбому, уже ничего не исправить.

Да и, в общем, это некритичный и очевидный момент.
+1
да и строго говоря, если человек не разобрался, а тупо как попугай повторил и его засмеяли — сам виноват, так ему и надо. бум надеяться, что это послужит пинком в дальнейшем разобраться. не?
0
Отличная статья. Интересно было бы почитать также о подходе реализованном в QTouch (накопление заряда на конденсаторе).
0
Сам принцип описан по ссылке в статье. А с самой либой я просто не разбирался — профиль не тот (может быть, только пока). :)
0
2 года назад делал светодиодну лампу на сенсорном управлении QTOUCH. По разным причинам продавать ее не смог. В то время библиотека QTOUCH росла от версии к версии. На ихнем форуме по теме писал им вопросы ламерские так как QTOUCH работает через подключение к проекту на С а не на асме. А к С я прохладен. Написал им кусок кода if else типа «если кнопка нажата, светодиод горит». Они включили его в описание библиотеки Atmel QTouch Library User Guide на стр 23. В предидуших версиях User Guide этого кода небыло.
По поводу статьи о QTOUCH. Это было бы хорошо. Помню свой восторг когда касаешься кнопки через оргстекло и светодиод загорается! Могу выложить фотки отладочного стенда если найду, а статью писать не буду. По той же причине что не пишут другие, эта технология новая и ее знание является конкурентным преимуществом.
-3
а статью писать не буду. По той же причине что не пишут другие, эта технология новая и ее знание является конкурентным преимуществом.
Это сообщество, все же, предназначено именно для того, чтобы делиться знаниями.
+1
в текущей версии User Guide уже на стр 26.
0
скажите пожалуйста, я так понимаю, что если я повешу тачпад на внешнее прерывание, то я смогу выдернуть мк из сна\режима энергосбережения?
0
Нет. Здесь тачпад опрашивается руками — для детектирования касания пад надо предварительно заземлить.

Так что МК может просыпаться по таймеру, опрашивать пад, а дальше решать — обратно в сон или нет.
+1
говорю спасибо, потому что «плюсануть» не хватает рейтинга :)
0
Не за что, рад, что помог. А плюсовать меня уже бесполезно. :)
0
Что за самодеятельность?.. Специализированные микросхемы стоят комейки и позволяют детектировать до 15 см расстояние от руки и до 15 мм от пальца… В моем домофоне(INX1120) оконное стекло толщиной 5мм и еще запас по чувсвительности приличный есть…
0
Это если действительно большие расстояния нужны. А если пару мм максимум, то и одного контроллера достаточно.
А вот такая спец — AT42QT1011 на одну кнопку стоит как один микроконтроллер.
0
1. Всегда полезно руками пощупать базовый принцип.
2. Не всегда нужно большое расстояние.
3. Не всегда целесообразно загромождать плату еще одной микросхемой, иногда проще и выгоднее сделать прямо на МК.
+2
1 Базовый принцип построен внутри чипа и его можно настраивать программно
2 Большее расстояние это лучший SNR (отношение сигнал-шум) а значит и более комфортное пользование и менььшая вероятность ложных срабатываний
3 На МК со встроенным модулем и выгоднее, МК за 1,6долл дает больше 32 сенсорных кнопок(в моем примере выше)
+1
1. Я имел в виду дидактические цели.

2. Интересные выводы…

3. Не всегда. Жизнь очень многогранна.
+3
2) Ой ли? Экран моего телефона меня иногда раздражает, ловя палец раньше чем я коснусь экрана (и как правило — не там где надо) или даже через чехол. При этом в перчатках он все равно неюзабелен.
+1
и как правило — не там где надо

плюс адын.

вообще, «универсальность» (в данном случае — мега-расстояния, от которых ужЕ улавливается «сигнал») — дело довольно неоднозначное. и в большинстве случаев — дело далеко не в деньгах.
0
Что за самодеятельность?..

А что Вас так смущает? На данном ресурсе практически все статьи можно отнести к «самодеятельности», и это хорошо, это специфика ресурса.

То, что существуют готовые решения для работы с сенсорными элементами управления — известно если не всем, то, по крайней мере, многим. И то, что специфические чипы (или МК с поддержкой сенсоров) «круче» чем описанная реализация — ни для кого не секрет. Но данная статья носит образовательный характер, показывает один из возможных вариантов детектирования сенсора (по сути, грубого измерения емкости). Плюс, для многих устройств такой реализации вполне достаточно. Если Вам нужно продвинутое сенсорное управление (со слайдерами и прочими радостями) — да, лучше использовать специализированное решение. Но ради одной сенсорной кнопки в любительском устройстве — данное решение выглядит намного более рациорнальным.
+2
Меня смущает то что вместо того чтобы изобретать велосипед из проволочек, лучше купить готовый и учиться профессионально им пользоваться… Даже в радиолюбительстве стремятся сделать красивый дизайн устройств, с нормальным корпусом и интерфейсом… А в случае с сенсорными кнопками низкая чувствительность сенсоров накладывает очень сильные ограничения на конструкцию передней панели, кроме того и для одной кнопки есть специализированные микросхемы с 8 ножками, которые даже программировать не нужно…
0
Зато их надо покупать и обвязки они требуют больше, чем МК.
0
Я выше уже писал про дидактические цели. Знать, как работает велосипед, тоже полезно. Ну и ради этого его не грех разок собрать самостоятельно, чтобы пощупать каждую детальку.

Я тут недавно написал две статьи про импульсные преобразователи. Для реализации SMPS тоже выпускается много микросхем. Даже больше, чем для сенсорных кнопок. Но чтобы быть не просто ремесленником, а адекватным инженером, надо хорошо представлять, как оно работает внутри, а для этого очень полезно сделать устройство с нуля, пускай и в упрощенном варианте.
0
все статьи можно отнести к «самодеятельности»

я тут недавно узнал, что фотки моих поделок поместили в интернетах:) на этом фото колпачки для кнопок (используются тактовые кнопки) выполнены из транзисторов ГТ313 (или ГТ311 — хер сейчас вспомню). и вообще говоря, на эту роль пойдут даже транзисторы а-ля МП42.

так вОт, к чему это я: конечно, для жителей мегаполисов приведенное на моих фото решение — дурь полнейшая. надо выбрать кнопку, колпачок под нее и сходить купить это всё в магазин/на рынок. я и сам так давным давно делаю. но не надо забывать, что существует множество любителей в райцентрах и деревнях (и, кстати, основная масса транзисторов в таком корпусе находится именно там). и для них такая покупка обойдется в копеечку, да плюс время на дорОгу. а если еще к этому прибавить то, что «запал» на изготовление устройства у человека проходит достаточно быстро, то принципы изготовления поделок из говна и палок (то есть того, что есть под рукой) обычно весьма и весьма кстати (в качестве примера могу привести свой топик про очевидное, написанный ради прикола и собравший ни с того ни с сего двадцать плюсов)
+1
Эх, а я-то сгоревшие МП42 выбрасывал… :D
0
а ты, недальновидный!!!:)
0
ну и эта — смотря как сгорят:) если с фейерверком — хреновые колпачки из них получатся:)

[подумав] хотя… нонче в моде всякая херня, а-ля «непохожее на всех». так что, возможно такие подвзорвавшиеся колпачки будут стОить бешенных денег:)
0
ох, камрад, извиняй — мой каммент выше, естественно, не тебе, а ветко-стартеру:)

совсем уж из ума выжил — желая ответить на его каммент, процитировал твое высказывание:) ну и до кучи ответил на него же:)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.