Оказалось, что не одного меня раздражает невозможность отключения пиканья сигналки при включении/снятии охраны. Девайс оказался очень популярным у автолюбителей, но были замечания на некорректную работу с некоторыми типами сигнализаций. Поэтому устройство было переработано как внешне (теперь оно в два раза меньше) так и внутри – теперь срабатывание происходит по внешнему прерыванию, программа точно считает количество импульсов и МК научился засыпать.
v.2.0
Конструктивно устройство выполнено на двухсторонней плате. Для экономии места выводные компоненты размещены на одной стороне, а SMD-шки с другой. Вместо винтовых клеммников применены угловые штыревые разъемы. Это для меня, как для разработчика, связано с удобством демонтажа устройства из автомобиля для коррекции прошивки. Ведь симулятор и даже лабораторный стенд не учитывают реальные условия эксплуатации. Т.к. некоторые сирены потребляют довольно большой ток, для силовых линий, параллельно задействованы по 4 контакта.
Резисторы и конденсаторы типоразмера 1206. Электролиты обычные, выводные. Стабилизатор напряжения в 8-ногом корпусе SOIC-8 только потому, что был такой. Микроконтроллер в узком SOIC-8, который с индексом SU.
Вместо реле теперь мощный N-канальный полевик IRLZ44. Обязательно в названии должна быть буква L – это значит, что он управляется уровнем лог. «1», т.е. при 5В он полностью открыт. Но если сирена не слишком мощная можно любой MOSFET. Применение N-канального полевика обусловлено его распространением и доступностью, но это изменило способ подключения сирены. Теперь «плюс» сирены должен быть постоянно подключен к «плюсу» бортовой сети автомобиля, а «минус» подключается к выходу OUT устройства.
Конденсатор С1 и стабилитрон D1 нужны для повышения надежности устройства. Дьявол, как говорится, кроется в мелочах – так один раз пожопившись можно потом об этом пожалеть. С этой же целью в схему добавлены R1, R6 и стабилизатор питания сделан на интегральной микросхеме, а не на стабилитроне. Диод D3 нужен для защиты от переполюсовки питания.
Несколько слов об управляющей программе:
Первым делом конфигурация микроконтроллера. Здесь используется файл attiny13.dat потому, что BASCOM отказывается признавать ATtiny13A. МК работает на частоте «по умолчанию» поэтому при программировании «фьюзов» нужно только убрать деление частоты на 8.
$regfile = «attiny13.dat»
$crystal = 4800000
$hwstack = 32
$swstack = 8
$framesize = 16
Конфигурируем ноги микроконтроллера за раз одной строкой – все на выход, кроме PB1. Здесь после DDRB = &B слева направо PB7, PB6, PB5, PB4, PB3, PB2, PB1, PB0. Присваиваем порту PB3 имя LED.
DDRB = &B11111101
Led Alias Portb.3
Далее объявляем переменные и разрешаем прерывания. В tiny13 только одно внешнее прерывание Int0, срабатывать оно будет по лог «1»:
Dim Peekcount As Byte
Dim Timercount As Byte
Enable Interrupts
Config Int0 = Rising : On Int0 Priem : Enable Int0
Основной текст программы начинается здесь. Предусмотрительно отключаем сирену и приветственно мигаем светодиодом:
Portb.0 = 0
Led = 1 : Waitms 200 : Led = 0
В основном цикле организуем задержку перед срабатыванием сирены, периодически проверяя кол-во сигналов, которые выдает сигнализация на сирену. После первого старта МК, быстренько проскакиваем до оператора Idle и засыпаем, экономя 1мА электроэнергии. Когда сигнализация «пикнет» сработает внешнее прерывание и увеличит значение переменной Peekcount тем самым считая количество «пиков». Микроконтроллер проснется и начнет выполнять цикл Do…Loop. В цикле проверяется количество «пиканий» и если их 1 или 2, то в зависимости от наличия сигнала на входе устройства переходим в подпрограмму подачи тревоги или сбрасываем счетчик «пиканий» и снова засыпаем.
Многие сигнализации перед срабатыванием тревоги выдают несколько предупредительных сигналов. Допустим, что сигнализация сработала и выдала 3 предупредительных «пика». Программа пропустит 2 сигнала, а 3-й будет негодяй услышит.
Do
For Timercount = 1 To 100
If Peekcount = 3 Then Goto Alarm
Waitms 10
Next
If Pinb.1 = 1 Then Goto Alarm
If Pinb.1 = 0 Then Peekcount = 0
Idle
Loop
End
Здесь стоит обратить внимание на способ выдержки времени, после которого, при наличии сигнала на входе, срабатывает тревога. Дело в том, что прерывания прерывают исполнение программы только между операторами и если, например, когда выполняется Waitms 100, сработало внешнее прерывание, программа сначала закончит ожидание 100мс, а потом перейдет на подпрограмму прерывания. Это неудобно когда нужно одновременно подсчитывать кол-во сигналов и одновременно выдержать заданное время. Поэтому в цикле For…Next происходит 1000 задержек по 1мс вместо одной 1-секундной.
В подпрограмме обработки внешнего прерывания мигаем светодиодом, подтверждая прием сигнала, обнуляем счетчик задержки срабатывания тревоги и увеличиваем счетчик количества «пиков». Задержка между переключением состояния светодиода 50мс и повторная проверка состояния порта PB1 обеспечивают антидребезговую защиту от ложных срабатываний.
Priem:
Led = 1 : Waitms 50 : Led = 0
Timercount = 0
If Pinb.1 = 1 Then Peekcount = Peekcount + 1
Return
В подпрограмме подачи тревоги включаем сирену и ждем, когда сигнализация отключит тревогу, попутно моргая светодиодом индицируя срабатывание охраны. Здесь реализован похожий способ антидребезговой защиты когда состояние порта повторно проверяется через несколько миллисекунд.
Alarm:
Portb.0 = 1
Do
If Pinb.1 = 0 Then Waitms 50 : If Pinb.1 = 0 Then Return
Toggle Led : Waitms 100
Loop
Выход из этой подпрограммы происходит только при соблюдении условия прекращения подачи сигнала охранной сигнализацией. Отсюда исполнение программы перемещается в самое начало, отключая сирену и обнуляя переменные.
Посмотреть кино о том, как это работает
Есть еще одна плата под микроконтроллер ATtiny13A в «широком» корпусе SOIC-8 (209mil) и 3-х выводной стабилизатор напряжения L78L05 в корпусе SOT-89. Также для 3D использованы модели из стандартного набора DipTrace 3.0.
По просьбам пользователей кратко опишу процесс подключения устройства в Вашем авто. Изначально, у всех, «минус» сирены подключен на «массу» автомобиля, а «плюс» к выходу сигнализации. Устройство подключается силовым ключом в разрыв «минусового» провода сирены. Т.е. «минус» сирены теперь идет в устройство, а в то место, где прикручивался «минус» сирены идет «минус» устройства. «Плюс» для питания устройства берется откуда угодно главное, чтобы он был всегда, даже когда машина на охране (что особенно важно). Сигнал с выхода сигнализации (который раньше шел на сирену) теперь подключается к входу устройства.
v.2.1