![]() |
![]() |
||||||||||||
О работе с сенсорными кнопками
Автор: Сергей Безруков (aka Ser60) Этот проект возник скорее из-за необходимости доработать приобретённую промышленную светодиодную подсветку, установленную в небольшом настенном шкафу. Она идеально вписывалась по размерам в шкафчик и обеспечивала достаточную яркость. Каждое прикосновение к контактному сенсору изменяет состояние подсветки включена/выключена. Подсветка питается от 3хААА батареек, и красиво подвести сетевое питание к шкафчику без свисающих проводов или долбления стен невозможно. Короче, всё было хорошо до тех пор, пока, удивившись короткому сроку службы батарей, я не открыл подсветку для исследования причины. Измеренное токопотребление в режиме ожидания касания сенсора оказалось 40 мкА, а при работе подсветки возрастало до 120 мА. Четыре параллельно соединённых светодиода подсветки подключались транзисторным ключом Q1 (в красном кружке) напрямую к батарее без всяких ограничительных резисторов(?!) На корпусе 8-ногой микросхемы на плате не имеется никаких опознавательных символов. Срок службы батарей, возможно, был бы приемлемым, если бы мы часто не забывали отключать подсветку при закрывании шкафчика. Таким образом, возникла идея доработки подсветки в целях снижения потребления в обоих режимах и добавления к функционалу автоотключения после минуты работы. Доработка началась с введения в схему нормального драйвера светодиодов BD1604. Он может обслуживать до 4 светодиодов и имеет встроенный бустер для стабилизации тока через них в процессе разряда батарей. Оказалось, что тока в 10 мА через каждый светодиод вполне достаточно для получения на глаз примерно такой же как ранее яркости. Ток светодиодов определяется резистором R1. Измеренное собственное потребление драйвера при неработающих светодиодах не превышает 3 мкА. В первой версии устройства для работы с сенсорной площадкой на плате я попробовал применить известную микросхему TTP223. Подача на вывод 6 микросхемы IC1 напряжения питания переводит её в триггерный режим работы, при котором состояние вывода 1 изменяется при каждом касании сенсора и остаётся неизменным до следующего касания. Несмотря на заверения параметров TTP223 в её ДШ, собственное потребление имеющихся у меня двух её экземпляров оказалось в районе 4–5 мкА, т.е. как минимум в 3 раза больше. Схема была протестирована на монтажной плате. Прошу не обращать внимания на случайно оказавшуюся на макетке неподключенную плату слева. Таким образом, удалось достаточно просто выполнить первую часть программы, связанную со значительным снижением токопотребления со 120 мА до 40 мА при работе подсветки и с 40 мкА до 8 мкА в режиме ожидания касания. Для организации автоотключения при использовании TTP223 в триггерном режиме, единственным известным мне способом вернуть её в исходное состояние является кратковременное отключение её питания. Однако, при подключении вывода 6 на землю сигнал лог. 1 на её выходе будет присутствовать только во время касания сенсора. В любом случае встал вопрос о том, как организовать задержку выключения на 1 минуту. Сразу определюсь, что реализация задержки на дискретных транзисторах/конденсаторах, также, как и использование для этого классических микросхем дискретной логики, мне неинтересна и в каждом своём проекте я стремлюсь узнать и попробовать что-то для себя новое. Выбор пал на микросхему аналого-цифрового таймера TLP5111. Этот таймер может работать в нескольких режимах и при показанной на схеме конфигурации его выводов начинает отсчет времени после кратковременного замыкания входа DEL на “+” питания транзистором VT2. При этом на выводе 5 формируется сигнал логической единицы, включающий драйвер светодиодов. По истечении временного интервала, определяемого номиналом резистора R2, выход таймера возвращается в исходное состояние и светодиоды выключаются. Схему можно упростить, исключив транзистор VT1 с резистором R3 и соединив базу VT2 с резистором R4. При этом следует подать на вывод 4 микросхемы IC1 напряжение питания. Это приведёт к инвертированию сигнала на выходе IC1 и появлению лог. 0 на выводе 1 только на короткое время касания сенсора, что необходимо для открывания VT2 и начала отсчёта временного интервала микросхемой IC3. Собственное потребление IC3 находится в суб-микроамперном диапазоне и не идёт ни в какое сравнение с классической NE555 даже в КМОП исполнении. На этом можно было бы и остановиться, но что это за проект без микроконтроллера? (да простят меня их противники). Тут я вспомнил про семинар 6-летней давности фирмы Cypress, посвящённый их сенсорным приложениям. Ещё тогда меня поразило как всё просто и автоматизировано в плане настроек для пользователя. Однако, при сегодняшнем дефиците изделий микроэлектроники приобрести PSoC фирмы, да ещё в нужном корпусе, мне не представилось возможным и пришлось обходиться тем, что доступно. Следует отметить, что сегодня практически у всех производителей микроконтроллеров имеются решения для работы с сенсорными кнопками. Поскольку сейчас я плотно работаю с МК от Silicon Labs, решено было изучить работу с их библиотекой CSLIB. В микроконтроллерах фирмы, в зависимости от модели, имеется три типа аппаратных модулей для сенсорных приложений: CSEN, LESENSE, и ACMP (см. [1]). Первый тип предназначен для непосредственного преобразования ёмкости в цифровой код. Я уже рассказывал здесь про подобный модуль в ранних проектах измерителей влажности на основе ёмкостных сенсоров (см, например, [2]). Модуль LESENSE представляет собой универсальный модуль для работы с различными типами сенсоров (ёмкостные, индуктивные, и пр.). Наконец, ACMP – это просто аналоговый компаратор, в цепь положительной обратной связи которого включён один из имеющихся на борту МК резисторов, что в совокупности с ёмкостью сенсорной контактной площадки превращает компаратор в релаксационный генератор. Частота генератора изменяется при прикосновении пальцем к контактной площадке, что и отслеживается аппаратно и программно. Благодаря развитой аппаратной поддержке периодические измерения ёмкости могут производиться при погружении МК в режим глубокого сна и без участия процессора, что позволяет снизить потребление в режиме ожидания прикосновения до единиц микроампер. Библиотека CSLIB поставляется как комбинация открытого кода для настройки аппаратной части и пре-компилированного программного модуля в зависимости от имеющихся аппаратных возможностей модели МК. В таблице ниже приведены типы аппаратных модулей моделей МК, установленных на некоторых отладочных платах фирмы. К сожалению, по неизвестной мне причине в последней версии Simplicity Studio IDE v5 на момент написания отсутствуют примеры проектов использования библиотеки CSLIB для ARM микроконтроллеров фирмы. Однако, они имеются в версии v4, хотя и не совместимы с версией v5. Поэтому я решил попробовать создать такой проект в актуальной на сегодня версии Studio с нуля для микроконтроллера «тиньки» EFM32TG110F32 семейства Tiny Gecko с архитектурой ARM-CM3, установленным на самодельной макетной плате. Для этого нужно просто подключить в конфигураторе проекта библиотеку CSLIB (находящуюся в категории Platform → Middleware) и там же настроить временные параметры сканирования сенсоров в активном (т.е. после детектирования прикосновения) и пассивного (при ожидании прикосновения) режимах. В присоединённом в результате этого действия к проекту файле cslib_hwconfig.h следует указать число сенсоров и задействованные выводы ACMP под них в дефайнах DEF_NUM_SENSORS, MUX_VALUE_ARRAY, и CSLIB_MUX_INPUT. Минимальный код приложения получается из серии короче не бывает. В функции app_init() вызываются две API инициализации библиотеки. В основном цикле main() при вызове функции app_process_action() производится опрос сенсоров (строка 12). Эта API устанавливает переменную sendComms если произошло изменение параметров сенсоров. В моём примере функцией CSLIB_commUpdate() просто производится выдача параметров сенсоров в окно терминала для визуализации работы приложения (строки 14–18). Наконец, API в строке 20 проверяет можно ли поместить МК в глубокий сон и делает это до следующего по плану сканирования сенсоров. Среднее потребление в режиме ожидания прикосновения при периоде сканирования 500 мс получилось около 3.5 мкА даже на такой относительно старой модели МК. Подробнее про упомянутые и другие API библиотеки CSLIB и настройку её параметров можно прочитать в [3] и [4]. Помимо документации по настройкам системы в Simplicity Studio IDE фирмы встроен инструмент Capacitive Sense Profiler для визуализации работы сенсоров. С этим инструментом у меня поначалу была масса проблем, пока я не разобрался как адаптировать его к моему МК, и до сих пор я считаю, что он находится в стадии развития. Тем не менее, инструмент забирает данные для визуализации из (виртуального) COM порта компьютера, для чего к проекту следует добавить модуль USART и преобразователь интерфейса USART-USB, а также прилагаемый к проекту мой файл profiler_interface.c с соответствующим .h файлом заголовков. Надеюсь, что он будет работать с любым количеством сенсоров и любым ARM-МК фирмы. Инструмент Capacitive Sense Profiler разработан прежде всего для работы с отладочными платами фирмы, однако, его можно использовать и без них. В моём тестовом проекте для программирования МК использовался отдельный программатор J-Link, а данные в COM7 порт компьютера пересылались с помощью адаптера на CP2104. При нажатии на кнопку Use Device в окне профайлера появляется окошко, показанное ниже. Чтобы заставить инструмент работать с вашим USB-UART конвертором, следует просто выбрать COM порт и установить его параметры. Важно при этом не кликать на список USB устройств в верхней части окна. После этого инструмент попросит организовать сброс микроконтроллера. Это необходимо для отсылки в инструмент заголовков данных сенсоров функцией в строке 15 кода выше (при первом её вызове), чтобы инструмент знал какие данные чему соответствуют. Каждая отсылаемая инструменту строка данных соответствует одной точке на графике, показанном ниже. Красная линия в нижней части графика (Baseline) соответствует данным сенсора в промежутках между ожиданием прикосновений. Оранжевая линия над ней показывает порог перехода сенсора в неактивный режим, а пурпурная линия – порог детектирования прикосновения. Сам факт детектирования прикосновения обозначается скобками в верхней части графика с символом соответствующего сенсора (у нас 0). Зелёная кривая соответствует сырым данным сенсора. Таким образом, на графике показаны моменты детектирования четырёх прикосновений. Следует упомянуть, что Baseline и все пороги постоянно корректируются библиотекой в зависимости от параметров среды и напряжения питания, и происходит это автоматически и совершенно прозрачно для пользователя. Таким образом, инструмент позволяет определить надёжность детектирования прикосновений для данной конфигурации сенсора и выставленных порогов в файле cslib_hwconfig.h проекта. Там же производится конфигурация системы для борьбы с дребезгом (debouncing). Для надёжного распознавания нажатий рекомендуется, чтобы отношение сигнал/шум сенсора было не менее 5 (что в нашем случае выполнено). Если визуализация не требуется, следует исключить строки 2 и 15 из кода выше, наряду с файлами profiler_interface.*. Файл с полным кодом проекта CSLIB_TG110.sls находится в приложении. Помимо системы Simplicity Studio открыть его можно ZIP-архиватором. Однако, вернёмся к проекту модернизации светодиодной подсветки. Может показаться расточительным использовать целый ARM микроконтроллер лишь для работы с одним сенсором. Помимо этого, мне было интересно попробовать библиотеку CSLIB с простыми микроконтроллерами архитектуры 8051, которые к тому же требуют меньше обвязки. В результате возникла следующая схема, где, по сравнению с предыдущей, несколько деталей вне драйвера светодиодов заменены крохотным МК в 3×3 мм корпусе QFN20, который помимо работы с сенсором обеспечивает автоотключение подсветки спустя заданное время. В целях тестирования схема была собрана на беспаячной макетной плате. К сожалению, максимальное напряжение питания применённого МК не должно превышать 3.6В, поэтому при тестировании он питался от LDO с выходным напряжением 3В, расположенным между платами. Однако, подсветка работает от трёх батарей типа AAA и напряжение для питания МК можно получить от двух из них без дополнительного LDO. Согласование логических уровней МК и драйвера светодиодов не будет при этом проблемой из-за широкого входного диапазона последнего. Эксперименты показали полную работоспособность системы с тем же функционалом, что и в первых её версиях выше. Экспериментам на макетной плате предшествовали эксперименты на отладочной плате SLSTK2010A, где имеется измеритель токопотребления, USB-UART конвертер для работы с профайлером, а также 2 сенсорные контактные площадки. Измеренное потребление системы (без драйвера светодиодов) при тех же параметрах сканирования сенсора оказалось около 2.3 мкА, что ниже, чем у использованной ранее модели ARM, как следует из следующего графика. На нём показаны моменты детектирования двух прикосновений, индицируемых включением светодиода на плате. Полный исходный код проекта EFM8_500ms.sls содержится в приложенном архиве. В примерах проектов в Studio для МК серии EFM8SB1 уже имеются примеры работы с библиотекой CSLIB. Однако, к сожалению, инструмент Capacitive Sense Profiler также не лишён недостатков при работе с МК типа 8051, и мне пришлось немного модифицировать генерируемый проектом файл profiler_interface.c (строки 129 и 140) для получения адекватных результатов визуализации. В экспериментах с отладочной платой меня интересовала зависимость надёжности детектирования касания сенсора от толщины изоляционного слоя материала над сенсором. Для этого я подкладывал куски картона на сенсорную площадку и регулировал силу прижатия пальца к ним. Как следует из графика, некоторые прикосновения к сенсору при этом не детектировались системой, и она требовала подстройки параметров. Эксперименты эти проводились при минимальной чувствительности компаратора МК (gain=1) и при возможности увеличении её до 7 имеется большой запас по чувствительности. Использование инструмента позволяет довольно легко и быстро добиться требуемого поведения системы в зависимости от геометрии сенсора. Приведённая выше схема собрана на маленькой печатной плате, приклеенной поверх штатной (зелёной) платы подсветки. Для обесточивания оригинальной электроники подсветки и исключения её влияния на работу новой схемы пришлось перерезать несколько печатных дорожек на зелёной плате. Необходимые соединения новой платы с сенсором и светодиодами реализованы навесными проволочными перемычками. К сожалению, библиотека CSLIB задействует единственный таймер RTC микроконтроллера, способный работать в режиме Sleep от низкочастотного генератора, под свои нужды. Поэтому включение светодиодов при детектировании прикосновения к сенсорной площадке производится добавлением строки 265 к функции configurePortsActiveMode() в файле hardware_routines.c при переходе от пассивного режима сканирования к активному. Период активного сканирования установлен также равным 500 мс в файле cslib.config.h. Там же задано число активных сканирований до возврата в режим сна (DEF_COUNTS_BEFORE_SLEEP), что и определяет задержку отключения. Непосредственно отключение подсветки производится добавленной строкой 273 к функции configurePortsSleepMode() в файле low_power_config.c проекта, которая вызывается библиотекой CSLIB при переходе от активного режима сканирования к пассивному. Полный код проекта находится в файле CSLIB_SB10.sls в приложенном архиве.
Литература 1. Silicon Labs Knowledge Article: Understanding CSLIB, CAPSENSE, and CSEN.
Файлы: Все вопросы в Форум.
|
|
||||||||||||
![]() |
![]() |
![](/templates/radiokot_classic_neew/images/datasheet.png)
![](/templates/radiokot_classic_neew/images/dorogi.png)
![]() |
![]() |
|||
|
||||
![]() |
![]() |