СЕЗАМ
Был у меня когда-то давно сенсорный чудо-выключатель СЕЗАМ. Очень он мне нравился. Но времена меняются, перестал вписываться в интерьер, а потом и вовсе оказался не рассчитан на работу со всякими модными энергосберегающими лампами. Нравился мне в нём принцип управления. Короткое касание сенсора включало/выключало свет, а длительное регулировало яркость. Кому интересно — сердцем выключателя была микросхема К145АП2, аналог Siemens S576B (К145АП2 до сих пор продаются).
Под катом мой вариант эмуляции работы этой микросхемы.
Не так давно соорудил я себе над столом подсветку из светодиодной ленты в алюминиевом профиле с рассеивателем и встал вопрос о выключателе. Ставить готовое как то громоздко. Чтоб на проводе болталось — не красиво, обычный выключатель ставить — портит вид, да и особо некуда.
Решил я встроить выключатель, а за одно и регулятор яркости, в торец ДСП 16мм. Сделать его сенсорным, прикрыть наклейкой, которыми мебельщики болты маскируют.
Железо
Начал с сенсора. Попробовал на принципе переноса заряда на ATtiny13A. Вариант рабочий, но мне стало лень заморачиваться с автоподстройкой параметров и тд. Брать готовое тоже не стал.
Далее решил попробовать реализовать сенсор на библиотеке QTouch. В качестве сенсора ATtiny10. Есть готовая утилита, которая превращает ATtiny10 в сенсорную кнопку со всеми плюшками. Но на выходе бинарник и добавить свой код туда сложно. Думал что делать, бороздил просторы Internet и тут мне попалось упоминание о TTP223 — контроллере одной сенсорной кнопки. Этот вариант меня вполне устроил.
В качестве МК выбор пал на ATtiny4. Такая же мелкая как и TTP223, 16-ти битный таймер. Да и давно хотел сделать на этих тиньках что-то полезное.
В качестве ключа — P3055LD со старой материнки.
Печатная плата
При разработке печатной платы исходил из того, что отверстия в торце ДСП нужно минимально возможное, решил что диаметром 7мм будет вполне достаточно. Плата получилась 7х28мм, два слоя.
Уже потом, когда плата была спаяна, стало понятно, что в 7мм отверстие плата не влезет, минимум 9мм — не учёл высоту элементов. Идея с наклейкой как-то тоже перестала нравится. И тут на глаза попалась мебельная заглушка! Рассчитана на отверстие 10мм, а внутренний диаметр ровно 7мм! Всё совпало!
Сам пятачок сенсора на отдельной платке которая паяется в торец основной. На картинках видно.
Программа
Управляющая программа написана на ассемблере. Каждые 32мс (Watchdog Timer) происходит опрос сенсора. В зависимости от текущего состояния и длительности нажатия выполняются те или иные действия. Логика работы немного отличается от прототипа К145АП2
Если свет выключен (состояние после подачи питания):
- Короткое нажатие включает освещение на том же уровне, на котором оно было выключено. При первом включении на максимальной яркости
- Длинное нажатие включает свет на максимальном уровне
Если свет включен:
- Короткое нажатие выключает освещение
- Длинное нажатие изменяет яркость. Направление изменения яркости меняется повторным длительным нажатием
Слишком короткие нажатия (помехи) программой игнорируются. Яркость задаётся коэффициентом ШИМ (16 бит). Частота ШИМ около 122 Гц (8000000 Гц / 216 ≈ 122 Гц)
Для компенсации психофизиологического восприятия яркости освещения от реальной яркости, изменение последней происходит по участку кубической параболы. Обычно для этого применяют таблицы, но в моём варианте коэффициент вычисляется. Коэффициент меняется с частотой ШИМ, то есть при изменении яркости каждый импульс получается своей длительности. Минимальное значение ШИМ ограничено программно.
Основное время МК спит и вместе с TTP223 потребляет около 16 микроампер. То есть схема вполне пригодна для устройств с автономным питанием.
У ATtiny4 шесть выводов. Два на питание, один по умолчанию на сброс. Два я уже задействовал. Остался один свободный. Думал как можно задействовать и его. И тут мне вспомнился новый ноут друга с трекпадом Force Touch. В качестве эксперимента решил сделать нечто подобное. Особой достоверности отклика мне не нужно, а вибромоторов от старых телефонов валяется много. В результате реализовал в программе такую функцию, что на свободном выводе, при достижении границы регулировки, появляется короткий импульс. В К145АП2 при достижении границы регулировки происходит смена направления регулировки. Поэтому нужна была определённая сноровка, что бы убрать руку от сенсора на максимуме или минимуме. В моей реализации при достижении границы регулировка прекращается. Полное время регулировки от одной границы до другой около 4 секунд.
Код доступен на GitHub
TPI через Ардуину
Отдельно отмечу программирование МК. Мой JTAGICE3 не поддерживает интерфейс программирования TPI. Но, к счастью, добрые люди написали скетч на Ардуину для программирования этой мелочи. Не сразу но у меня всё получилось, прошивка залилась и всё заработало. Кроме ардуины нужно 4 резистора. Весь процесс расписан в скетче.
Итог
Волшебная кнопка установлена и работает как задумано. Потребляемый ток и габариты позволяют встраивать её в устройства с автономным питанием.
Ожидаемого эффекта от вибры я не получил. Тут видимо нужны эксперименты с местом установки.
В прототипе К145АП2 и аналоге Siemens S576B есть вывод «Sleep». Это такой режим, при котором яркость очень медленно падает до полного выключения. По задумке производителя, для этого дополнительный сенсор устанавливается около изголовья кровати. 16 бит таймера ШИМ позволяют реализовать такой режим.
Это из идей на будущее.
Вроде всё.
Всем спасибо!
Источник