Взагалі кажучи, існує багато ємнісних методик визначення торкання. Найдавніший підхід - визначення торкання за наведенням від силової мережі, які завжди присутні на тілі людини (якщо він, звичайно, не знаходиться в чистому полі). До другої групи можна виділити QTouch 'еобразную (засновані на перекачуванні в накопичувальний конденсатор заряду з сенсора і подальшому вимірі його величини) підходи, що відрізняються алгоритмами обробки, формою датчиків, підходом до фільтрації перешкод, etc. Подивитися на реалізацію такої системи на коліні, а також почитати докладний опис ідеї роботи такої системи на російській можна тут. У цій же статті нас буде цікавити третій підхід, менш просунутий, але набагато простіший щодо другого і надійний щодо першого - безпосереднє вимірювання ємності пластини сенсора. В принципі, і про це вже писав Elm-Chan. Але спробуємо повторити те ж саме по-російськи і не дивлячись в чужі вихідні.
Для досвіду я буду використовувати свою макетке зі встановленою ATmega48, так що приклад буде під AVR.
Отже, ідея полягає в тому, що будь-який об'єкт має ємність, а сучасні мікроконтролери працюють на такій швидкості, яка дозволяє виміряти ємність навіть окремого шматочка фольги розміром 1х1 см. - приблизно такого розміру зазвичай вибирається сенсор в цьому методі, очевидно, за розміром пальця, бо подібний підхід придатний насамперед для реалізації окремих сенсорних кнопок. Коли до такої кнопці торкається людина, її ємність істотно зростає, що і реєструє контролер, приймаючи рішення про натискання. Отже, включимо всі наступним чином:
1. Налаштувати ніжку на вихід;
2. Подати на неї логічний нуль, щоб гарантовано розрядити сенсор перед виміром;
3. Налаштувати ніжку на вхід;
4. Порахувати, за скільки тактів напруга на ній досягне одиниці.
Все вищесказане я втілив в такий код:
SNS_DDR, SNS_PORT і подібні - імена, задані дефайнамі. У функцію передається бітова маска виведення, який потрібно опитати, що робить її універсальною для опитування декількох кнопок.
Але після опитування нам треба вирішити, натиснута кнопка чи ні. Очевидний підхід - визначення кількості тактів циклу, відповідне порогу натискання, і порівнювати отримане значення з ним. Але таке рішення вийде нестабільним, тому що поріг буде залежати від сили натискання на сенсор (рука еластична, зі зміною сили натискання змінюється площа дотику, а, отже, і ємність). Тому краще ввести гітерезіс: вибрати значення, нижче якого сенсор гарантовано вільний, і значення, зареєструвавши число вище якого можна точно сказати, що до майданчика торкаються, після чого робити висновок, порівнюючи результат опитування з цими двома значеннями. Можливо, звучить громіздко, але, сподіваюся, код внесе ясність:
1. Опитуємо сенсор;
2. Якщо значення вище порога торкання - реєструємо дотик і запам'ятовуємо це.
3. Якщо значення нижче порога вільного сенсора - реєструємо порожній сенсор і запам'ятовуємо це.
4. Видаємо запомненное значення.
У цьому випадку між крайніми положеннями буде вважатися, що сенсор знаходиться в попередньому гарантованому стані. Такий підхід підвищує чіткість спрацьовування датчика.
Вищенаведені ділянки коду - фрагменти проекту, який я по-швидкому накидав в AVR Studio + WinAVR і який прикладений в аттаче.
Ну і пара картинок наостанок.
Сам сенсор (на ніжці PD7):
А якщо робити без гістерезису, то можна поиметь чималий профіт, опитуючи відразу кілька кнопок:
1) Порт до землі
2) Порт на вхід
3) Чекаємо n тактів
4) Читаємо порт
Вважаємо, що якщо за n тактів напругу не встигло зрости (і даний біт вважався як 0), то кнопа натиснута.
Я робив без гістерезису, і таки да, вийшло трохи кривувато. Але все-таки цілком працювало. Більше мені не подобалося інше - через щось товстіший за аркуш паперу кнопка працювати вже не бажала - можна було збільшити номінал підтягує резистора, але тоді з'являвся неіллюзорний ризик зловити перешкоду. Звідси питання - через щось товщі пакетика вона працює. )
2 роки тому робив світлодіодні лампи на сенсорному керуванні QTOUCH. З різних причин продавати її не зміг. У той час бібліотека QTOUCH росла від версії до версії. На їхньому форумі по темі писав їм питання ламерскіе так як QTOUCH працює через підключення до проекту на С а не на Асмі. А до С я прохолодний. Написав їм шматок коду if else типу «якщо кнопка натиснута, світлодіод горить». Вони включили його в опис бібліотеки Atmel QTouch Library User Guide на стор 23. У предідушіх версіях User Guide цього коду не було.
З приводу статті про QTOUCH. Це було б добре. Пам'ятаю своє захоплення коли торкаєшся кнопки через оргскло і світлодіод загоряється! Можу викласти фотки отладочного стенду якщо знайду, а статтю писати не буду. З тієї ж причини що не пишуть інші, ця технологія нова і її знання є конкурентною перевагою.
а статтю писати не буду. З тієї ж причини що не пишуть інші, ця технологія нова і її знання є конкурентною перевагою. Це співтовариство, все ж, призначене саме для того, щоб ділитися знаннями.
в поточній версії User Guide вже на стор 26.
скажіть будь ласка, я так розумію, що якщо я повішу тачпад на зовнішнє переривання, то я зможу висмикнути мк зі сну \ режиму енергозбереження?
Ні. Тут тачпад опитується руками - для детектування торкання пад треба попередньо заземлити.
Так що МК може прокидатися за таймером, опитувати пад, а далі вирішувати - назад в сон чи ні.
Я вище вже писав про дидактичні цілі. Знати, як працює велосипед, теж корисно. Ну і заради цього його не гріх разок зібрати самостійно, щоб помацати кожну детальку.
Я тут недавно написав дві статті про імпульсні перетворювачі. Для реалізації SMPS теж випускається багато мікросхем. Навіть більше, ніж для сенсорних кнопок. Але щоб бути не просто ремісником, а адекватним інженером, треба добре уявляти, як воно працює всередині, а для цього дуже корисно зробити пристрій з нуля, нехай і в спрощеному варіанті.
всі статті можна віднести до «самодіяльності»
я тут недавно дізнався, що фотки моїх виробів помістили в інтернетах :) на цьому фото ковпачки для кнопок (використовуються тактові кнопки) виконані з транзисторів ГТ313 (або ГТ311 - хер зараз згадаю). і взагалі кажучи, на цю роль підуть навіть транзистори а-ля МП42.
Отож, до чого це я: звичайно, для жителів мегаполісів наведене на моїх фото рішення - дурь цілковита. треба вибрати кнопку, ковпачок під неї і сходити купити це все в магазин / на ринок. я і сам так давним давно роблю. але не треба забувати, що існує безліч любителів в райцентрах і селах (і, до речі, основна маса транзисторів в такому корпусі знаходиться саме там). і для них така покупка обійдеться в копієчку, та плюс час на дорогу. а якщо ще до цього додати те, що «запал» на виготовлення пристрою у людини проходить досить швидко, то принципи виготовлення виробів з гівна і палиць (тобто того, що є під рукою) зазвичай вельми і вельми до речі (як приклад можу навести свій топік про очевидне. написаний заради приколу і зібрав ні з того ні з сього двадцять плюсів)
Ех, а я-то згорілі МП42 викидав ...: D