Официальный сайт компании Arduino по адресу arduino.cc
Сенсорная радиокнопка (Attiny + nRF24 + TTP) - dAshkova
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Среди кухонной утвари встречается такое явление, как газ на стекле. Выглядит красиво, дорого, богато. И мне подумалось - а как на счет выключателя, да и также на стекле? Всё бы ничего, если бы не одно - в стекле штрабу под провода не заложишь, да и стекла бывают прозрачными. Скажите вы:
- Эх, мечты!
- Вовсе нет - ответит чей-то голос.
Давайте мечту превратим в цель, а цель достигнем.
Итак, сформируем наше четкоё ТЗ:
1. Кнопка должна выглядеть хорошо. Как минимум не ублюдочно.
2. Внутреннее убранство должно быть под стать внешнему виду.
3. Количество кнопок ... ну от одной и до четырех.
4. Кнопки сенсорные.
5. Постановка задачи определила только один источник питания - батарея.
6. Кнопка должна быть максимально тонкой, поэтому определим вид батареи - литиевая.
7. От батареи нам хочется жить годика два, поэтому всё лишнее выключаем.
8. Интерфейс - беспроводной с помощью радиоволн.
9. Мониторинг состояния батареи.
10. Мы согласны с тем, что энергобюджет у нас ограничен, поэтому принимаем неудобства в виде запоздалой реакции на прикосновение.
...
13. Посылать радиограммы мы будем только по событию - в момент касания и в момент отпуска кнопки. В момент удержания пальца на кнопке - спим. После - выключаем себя.
Определим участников забега.
МК - Attiny24A (на данный момент Attiny441 из-за ошибки госпожи dAshkova)
За радиоточку в ответе - nRF24l01+
Микросхема сенсора - TTP224B
Батарейка - литиевая CR2032
Схема
По ту сторону Луны
Прикольненько. Это выключатель чего угодно, как я понимаю?
Прикольненько. Это выключатель чего угодно, как я понимаю?
Ага. По коду скоро пройдемся - там всё будет понятно. На тестировании пока.
Чертим необходимую деталь
и печатаем из фуфлового пластика (на прототип не жалко)))
И вуаля
Крепим без проводов и на любую поверхность)
Программная часть.
Сразу после подачи питания на трансивер (не обязательно nRF24 - это может быть любой другой), необходимо сделать паузу для стабилизации частоты осциллятора. По даташиту максимальное время, которое может на это потребоваться, составляет 100 мс. По факту эта пауза будет гораздо короче, но здесь я беру даже с запасом. Для формирования такой раузы я использую таймер вачдога. Нюанс его использования именно в старых аттинях следующий - при первом срабатывании вачдога и разрешенном обработчике прерывания МК уходит на обработчик. Если после этого не поступает сигнал сброса таймера вачдога, то следующее срабатывание приводит к ресету МК. Вместо сброса вачдога также можно заново определить его период работы. Также не забываем про регистр CCP (особенность поздних МК с ядром atmega). Я это опишу в секции макросов:
Далее нам необходимо определить пин МК, который будет подавать питание через ключ на трансивер и на себя, на выход. Затем конфигурируем секцию SPI, разрешаем прерывания PCINT, считываем параметры из EEPROM, снимаем показания с сенсоров. Перед инициализацией трансивера, нам необходимо выдержать паузу, о которой писал выше. Для этого мы просто уходим в сон. А вачдог нас разбудит. Секция кода, выполняющая перечисленные действия, выглядит так:
Обязательное действие в нашей программе - это замер уровня напряжения на батарейке. Для этого мы будем делать замер на внутреннем ИОНе, а в качестве опорного напряжения будем использовать напряжение питания. Но непосредственно перед самим измреением, нам необходимо выдержать паузу в 1 мс для завершения переходных процессов. Чтобы специально этого не делать, я включаю АЦП перед инициализацией трансивера, а замер делаю уже после - как раз проходит заветная 1 мс. АЦП необходимо обязательно выключить - аналоговые цепи даже при отсутствии тактирования потребляют небольшой ток. мы же бромся за каждый наноампер.
Также не забываем включить вачдог.... на всякий пожарный...
Всё. Подготовительная часть кода закончилась. Далее идет главный цикл. Главный цикл собран по принципу конечного автомата - во сне ждем входного воздействия, отрабатываем его. Если сложилось условие выхода из цикла - просто обесточиваем себя и трансивер. В цепи питания у нас остаётся только микросхема сенсора.
Пакеты я передаю без запроса подтверждения, т.к. планируется, что получателей будет несколько. Структура пакета выглядит так:
Главный цикл:
Функция опроса кнопок:
Про иницализацию трансивера и АЦП рассказываю здесь:
http://forum.cxem.net/index.php?/blogs/blog/319-изучаем-usi-на-основе-сверхэкономичного-прототипа/
Полностью собранная плата выглядит так:
Преследовалась главная цель - максимально тонкий дизайн.
Поэтому батарейка 2032, держатель под нее - BS-6-1. Но он ещё не приехал, поэтому на фотографии другой (по высоте чуть выше). Можно и вообще отказаться от держателя в пользу батарейки с усами. В принципе, запаять можно и более емкую 24хх - при не очень интенсивном потоке нажатий работа от батарейки CR2450 растянется примерно на 5 лет. Быстрее выключатель надоест, чем сядет батарейка. Также, вместо танталика должен стоять керамический конденсатор на 10мкФ - он также еще не приехал.
Плата прекрасно помещается вовнутрь корпуса LIVOLO C5-C2-12.
Прилепить можно на любую поверхность. Да хоть и на стекло
Из особенностей - при вставке батареки нельзя касаться сенсоров - в этот момент TTP калибруется. Если выключатель положить стеклом на стол, то через какое-то время калибровка уходит и даже если его со стоял поднять, он будет посылать сигнал о нажатых сенсорах. Обратная рекалибровка почему-то не происходит. Видимо, такой вот алгоритм работы у микросхемы. Впрочем, его штатное положение - вертикально на стене или горизонтально на столе. Сенсорами в сторону от плотных материалов (сенсоры реагируют на изменения емкости, поэтому что подносить - палец или деревяшку - им всё равно).