Сенсорный выключатель на attiny13 своими руками

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

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

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

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

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

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

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

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

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

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

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

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

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

В качестве примера давайте рассмотрим сенсорный регулятор освещенности (диммер) на напряжение 220 Вольт. Подвигнуть меня на изготовление данного устройства побудили следующие обстоятельства:
- достаточно частые перегорания ламп;
- отсутствия у домашних чувства «уходя, гаси свет;
- покупка нового светильника без встроенного выключателя;
- наличие необходимых запчастей и собственно готового устройства от Eddy71 – я думаю, многие его знают как разработчика ряда хороших устройств.
Спаянная плата с запрограммированным контроллером показала свою работоспособность согласно заявленному алгоритму, который мне по итогу не подошел – отсутствовал таймер выключения. Исходники отсутствовали, и было принято решение написать свой алгоритм. В процессе написания программы и ее отладки были внесены незначительные изменения в итоговую схему, которая представлена ниже


Принцип работы диммера всем известен, но повторение – мать учения:

Каждую полуволну сети 50 Гц, то есть 100 Гц – 0,01 сек. (10 миллисекунд) микроконтроллер отсчитывает временной интервал времени для включения симистора – реализуется фазовое управление симистором. Т.е. регулируется мощность, подаваемая на лампу накаливания, и, тем самым, излучаемая яркость. Одновременно идет подсчет времени для работы таймера. В случае светодиодных или люминесцентных ламп яркость регулировать не получится – надо замкнуть перемычку на плате – тогда данное устройство работает просто как таймер.
Диммер различает продолжительность касания и защиту от кратковременных помех. При кратковременном касании сенсора (от 0,1 до 0,5 сек) происходит включение лампы. Контроллер обеспечивает плавное зажигание лампы накаливания, тем самым обеспечивая более долговременную ее работу. Касание сенсора длительностью от 0,5 до 1,5 сек. выключает лампу.
В случае применения ламп накаливания по истечении запрограммированного времени яркость лампы снижается, экономя тем самым электроэнергию, и в дальнейшем тухнет окончательно.

Текст программы с построчными комментариями:

Define CONFIG = 0x0009 'GP3 as input - нога 3 как вход

Symbol mode_in = GP3 'ножка определяет принцип работы - лампа накаливания или нет
Symbol gate_out = GP0 'выход на симистор
Symbol zero_input = GP1 'вход детектора нуля
'Symbol sens_input = GP2 - вход сенсора, подключенный к транзистору

Dim zero_cross As Byte 'переменная для детектирования нуля
Dim touch_on As Byte 'длительность касания
Dim touch_off As Byte 'длительность отпускания сенсора
Dim power_on As Byte 'время включения симистора
Dim power_off As Byte 'время выключения симистора
Dim min_power As Byte 'минимальная мощность
Dim counter_decisecond As Byte 'счетчик сотых долей секунд
Dim counter_second As Byte 'счетчик секунд
Dim counter_minute As Byte ' счетчик минут
Dim timer_volume As Byte 'текущее значение таймера микроконтроллера

Const edge_zero = 15 'длительность детектирования нуля
Const gate_on_time = 20 'длительность включения симистора
Const max_count = 75 'максимальное значение цикла подпрограммы
Const count_cycle = 70 'значение таймера, при котором происходит отсчет времени
Const touch_first = 38 'значение таймера, при котором происходит опрос сенсора
Const touch_second = 40 'значение, при котором происходит анализ длительности касания сенсора

'начало программы
TRISIO = % 1110 'устанавливаем ножку 1 как выход на ножку симистора
OPTION_REG = % 11010110
'Prescaler Rate 1:128 => 1 000 000 : 100 : 128 = Max count TMR0 = 78

gate_out = 0 'гасим симистор

' выбор режима работы
' если ножка mode_in заземлена, то диммер не используется

min_power = 1
If mode_in = 1 Then min_power = 50 'значение минимальной мощности лампы


' старт программы
start :

' детектор перехода с 0 на 1
zero_cross = edge_zero
While zero_cross > 0
If zero_input = 1 Then zero_cross = zero_cross - 1
Wend

Call work_mode () ' вызов подпрограммы

'детектор перехода с 1 на 0
zero_cross = edge_zero
While zero_cross > 0
If zero_input = 0 Then zero_cross = zero_cross - 1
Wend

Call work_mode () ' вызов подпрограммы

Goto start ' возврат на старт программы

End ' конец программы

TMR0 = 0 'обнуляем таймер микроконтроллера (МК)
timer_volume = 0 'и буферную переменную, куда данное значение копируется

While timer_volume max_count 'пока значение таймера меньше макс. значения, выполняем цикл

While timer_volume = TMR0 'ждем, когда значение таймера изменится
Wend

timer_volume = TMR0 'присваиваем буферной переменной значение таймера МК

' Проверяем, включен ли свет, если да, то назначаем время выключения симистора
If power_on = 0 Then
power_off = 0
Else
power_off = power_on + 5
Endif
' конец данного условия

' Формируем импульс для симистора
If power_on timer_volume And timer_volume power_off Then

High gate_out
WaitUs gate_on_time
Low gate_out

Endif
' конец данного условия

' в зависимости от значения буферной переменной, выполняем разные действия

Select Case timer_volume

' Измеряем длительность касания/отпускания сенсора
Case touch_first 'count length touch to on: 0.2-1s, to off > 1s
zero_cross = GPIO And % 00000110
If zero_cross = % 00000010 Then touch_on = touch_on + 1
If zero_cross = % 00000110 Then touch_off = touch_off + 1
' конец данного условия

' В зависимости от длительности касания/отпускания сенсора, включаем/выключаем лампу
Case touch_second
If touch_off > 20 Then
If touch_on > 50 And touch_on 151 Then
power_on = 0
Endif
If touch_on > 10 And touch_on 51 Then
power_on = min_power
Endif
touch_off = 0
touch_on = 0
Endif
' конец данного условия

' В данном случае считаем количество импульсов для таймера
Case count_cycle 'count second & minute
If power_on = 0 Then
counter_decisecond = 0
counter_second = 0
counter_minute = 0
Else
counter_decisecond = counter_decisecond + 1
If counter_decisecond = 250 Then
counter_second = counter_second + 1 '2.5 second
counter_decisecond = 0
If counter_second = 6 Then '15 second - тестовый вариант
'If counter_second = 240 Then '10 minute - рабочий вариант
counter_minute = counter_minute + 1
counter_second = 0
Endif
Endif
If counter_minute > 3 Then power_on = min_power
If counter_minute > 5 Then power_on = 0
Endif

' Плавное зажигание лампы накаливания
If power_on > 1 And counter_minute = 0 Then power_on = power_on - 1

' конец данного условия

Case Else
EndSelect

Wend
' возврат в начало подпрограммы и ожидание следующего значения таймера МК

End Proc
' конец подпрограммы и возврат в основной цикл

Ниже приведен универсальный (работа как с PIC10F200, так и с Attiny13) и усовершенствованный вариант платы диммера - добавлены помехоподавляющие элементы: RC цепочка (3*1,2 кОм и 0,1*275V) и дроссель 220 мкГн. Включение возможно как по трехпроводной схеме – основная разводка, так и по двухпроводной вместо обычного выключателя – добавлено место под перемычку. Данные элементы выделены красным цветом. Размер платы и расположение элементов выбирались исходя из корпуса – верхней части блока питания от старой Nokia, малогабаритный трансформатор от которой ушел на другие проекты. В качестве сенсора используется советский транзистор КТ605 с никелированной крышечкой – получилось достаточно эстетично. Плата выполнена на одной стороне, прикручена 3 шурупчиками к существующим стойкам и корпус в сборе посажен на двухсторонний скотч. Тиристор припаян к плате и вокруг него напаяно несколько ребер из жести для охлаждения. Видимое на фотографии отверстие служит для конвекции воздуха.


ВАЖНО: не забываем про работу с 220 Вольт. Диммер чувствителен к включению в розетку – при неправильной фазировке просто переверните вилку.



Перевести данный алгоритм в Bascom для Attiny13 не составит труда – главное правильно настроить порты и таймер, но эту задачу я оставлю желающим.

Пример настройки таймера на частоту 1,2 МГц приведен ниже.
TCCR0A = %00000000
TCCR0B = %00000011
OCR0B = 187
'Prescaler Rate 1:64 => 1 200 000 : 100 : 64 = Max count TMR0 = 187
'WDTCR = %00000100 'Prescaler Rate 1:32K = 0.25 sec


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

Идеальное решение — емкостной переключатель. Такой переключатель реагирует на приближение руки к чувствительной поверхности (сенсору). Его чувствительность можно также настроить и на прикосновение.

Сенсорный выключатель своими руками. Схема емкостного датчика на LM358

Данная схема сенсорного выключателя работает следующим образом:

Первая половина операционного усилителя (LM358) работает как генератор на частоте около 17 кГц. Сигнал с автогенератора поступает на эмиттер транзистора Т1 (BC557) и также на его базу через резистор R7. К базе транзистора T1 через резистор R8 подключен чувствительный электрод (это может быть небольшая металлическая пластина).

Поднося руку к электроду, мы фактически создаем конденсатор, через который начинает течь ток. Его емкость зависит от площади электрода, расстояния до него и материала диэлектрика.

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


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

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

Что из себя представляют подобные выключатели

Сенсорный выключатель

Сенсорный выключатель

Суть их – отсутствие механических, движущихся частей в составе прерывателей или активаторов сигнала либо тока. Отдача команды в упрощенном виде производится легким касанием или приближением к контактной площадке части человеческого тела.

Применение в быту сенсорных выключателей

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

Размещаются сенсорные выключатели не только вместо стандартных на стенах, с целью контроля подачи тока к освещению, но и на розетках питания бытовой техники, для увеличения безопасности их использования.

Главным плюсом не механической системы отключения или подачи тока служит ее надежность и долговечность. Нет движущихся частей и периодически соединяемых или разрываемых в местах контакта коннекторов, соответственно отсутствует износ или искра, ведущая к порче проводящих площадок.

Самодельный сенсорный выключатель

Конструкция прибора довольно проста для повторения, чтобы собрать сенсорный выключатель своими руками, а не приобретать его по запредельным ценам от стороннего производителя. Самодельный сенсорный выключатель

Принцип работы устройства

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

Самые распространенные варианты датчиков, используемых в быту для схем сенсорных выключателей света или любых других потребителей тока 220 вольт, – индукционные, инфракрасные и звуковые. У каждого из них есть свои положительные и отрицательные моменты при применении.

строение сенсорных устройств включения

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

Плюсы и минусы конструкции

  1. Пожарная безопасность, которая намного выше, чем у обыкновенных выключателей – нет периодически соприкасающихся контактов с возникновением искры, а значит и риска их возможной спайки или возгорания корпуса устройства.
  2. Легкость применения – приведение в действие не требует никаких физических усилий.
  3. Бесшумность и мгновенная реакция на команду от пользователя.
  4. Возможность выполнения в абсолютно не пропускающем влагу корпусе, что также понижает риск возгорания в результате замыкания, или же уменьшает вероятность поражения электрическим током человека.
  1. Долговечность, обеспечиваемая отсутствием механических элементов.
  2. В одном корпусе можно использовать несколько датчиков и схем их обработки, делая мультисенсорные панели.
  3. Конструкция проста для сборки сенсорного выключателя света или электроприборов 220В своими руками.

Инструкция по сборке сенсорного выключателя на триггере

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

Далее сигнал от датчика через высокоомный резистор поступает на вход полевого транзистора VT1, который уже усиливает его и перенаправляет в триггер DD1. Связка резистор – транзистор на входе дополнительно обеспечивает меры безопасности, изолируя сенсор от общего напряжения платы.

сенсорный выключатель на триггере

Схема индукционного сенсорного выключателя, с использованием триггера

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

Электронный ключ, управляющий силовым модулем, состоит из тиристора VS1 (T112-10) и открывающего его, работающего усилителем сигнала от триггера, транзистора VT2 (КТ940А).

Инструкция по сборке сенсорного выключателя с инфракрасным датчиком

Схема бесконтактного инфракрасного включателя света

Более интересная схема сенсорного выключателя света представлена простой конструкцией на основе датчика HF1 (SFH506-38). Срабатывание устройства происходит, когда отраженное от руки или иного предмета инфракрасное излучение от светодиода HL1 попадает на поверхность чувствительного элемента. Притрагиваться к нему в этом случае не обязательно, достаточно поднести отражающий предмет или часть тела поближе к рядом расположенной паре элементов из излучателя и приемника. Схема бесконтактного инфракрасного включателя света

В контролирующей части цепи используется микросхема К561ТМ2, в составе которой два D-триггера. Первый, обозначенный, как DDR1.1, применяется в качестве основы мультивибратора с частотой импульсов на выходе 35…40кГц. Подстройка диапазона выполняется выбором характеристик резисторов R1 и R2. Эти сигналы, через ограничивающий ток R3, подаются на инфракрасный светодиод HL1. Излучение которого, отражаясь, попадает на HF1, в свою очередь ток от датчика, в случае срабатывания, через R5 заряжает конденсатор C4.

вариант сенсорного выключателя на инфракрасных лучах

Эта связка выдает импульс на вход 3 триггера DDR1.2, переключая его логическое состояние на выходе 2, которое и открывает или закрывает через усиливающий транзистор VT1 (KT940A) тиристор VS1 (КУ201Л), управляющий подачей тока на лампу HL1. Один из вариантов сенсорного выключателя на инфракрасных лучах

Своеобразный фильтр, уменьшающий шанс ложного срабатывания схемы, представлен комбинацией элементов R6 и C3, которые вводят определенную задержку на реакцию выключателя при получении сигнала от датчика.

Инструкция по сборке сенсорного выключателя на транзисторах и реле

Одним из наиболее простых сенсорных выключателей на 220В для изготовления своими руками считается схема с использованием реле. В основе она – простой усилитель, на двух транзисторах VT1 и VT2 серии КТ315Б, сигнала с индукционного датчика, проходящего через разделительный конденсатор С1. В зависимости от состояния самого реле K1, происходит или разрыв подачи напряжения на него же, или возобновление питания.

Сенсорный выключатель с использованием реле

Для устройства необходимо предусмотреть подачу постоянного напряжения 9В на плату, через внешний блок питания или дополнительную, понижающую цепь с использованием диодного моста и трансформатора. Сенсорный выключатель с использованием реле

Схемы подключения разных сенсорных выключателей

Подключить устройство управления в разрыв сети освещения или подачи тока потребителям достаточно просто, это практически ничем не отличается от монтажа обычного выключателя.

Обычно на задней стороне выключателя находятся 4 контакта, каждый из которых помечен, в зависимости от приходящих и отходящих проводников подключения. Признанным стандартом для многих производителей идет размещение слева на право – ноль(N), выводной потребителю (L1-load), вводной фазы (L1-in) и терминал сопряжения (Com). Последний зачастую соединяют перемычкой с питающим проводом.

Сенсорный выключатель без нулевого провода

В случае объединения нескольких выключателей в одном корпусе соответственно добавляются выводные контуры L2-load, L3-load и так далее, в зависимости от количества коммутируемых линий. Существуют также выключатели без подачи отдельного ноль на схему, с использованием электрической развязки общего провода через клиентское устройство. Сенсорный выключатель без нулевого провода

Видео по теме

Читайте также: