«Мобильный ключ» от вашего домофона на МК AVR.Бесценный опыт.

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

По звонку на мобильный телефон устройство с помощью двух электромагнитных реле(это такая штука, которая замыкается/размыкается, если подать на нее напряжение), встроенных нами в абонентский комплект домофона и управляемых МК, откроет дверь, как будто кто-то поднял трубку и нажал кнопку открытия. Таким образом, мы попадаем в родной подъезд без ключа.

Теперь время рассмотреть работу устройства с точки зрения МК. Ниже представлена структурная схема МК и схема его выводов. Мы будем пользоваться последовательным портом для связи с ПК и портами входа-выхода для передачи сигнала.
Структура МК
Выводы  МК
Для связи с ПК нужен программатор. Схемы его сборки легко найти в интернетах на easyelecronics. На всякий случай напомню, что, если программатор работает через COM порт, присоединять/отсоединять его желательно только при выключенном компе, а то можно спалить управляющую микросхему материнки, а такие жертвы нам не нужны.
О необходимом софте будет сказано ниже.

Для установленной цели нам потребуется вывести сигнал с мобильника. Чем проще будет телефон, тем легче будет сделать это. Лично я вывел сигнал с вибромотора, но это не имеет значения, можно выводить сигнал иначе, кому как нравится, главное, чтобы он был стабильным при входящем вызове. Через эти два элегантно торчащих из древнего Alcatel’a провода сигнал входящего вызова будет идти на МК.
Выводим сигнал с мобилы
Сначала лучше собрать схему, так как от этого будет зависеть написание программы.
Конкретную зарисовку в формате программы sPlan выложу в архиве, а здесь объясню все на пальцах и по частям.
При замыкании выводов МК 1 и 2 происходит сброс, т.е. программа начнет выполняться с первой строки. Поэтому лучше вывести от них по клемме так, чтобы их было удобно сомкнуть в случае чего.
Reset
На выводах 4 и 5 в обязательном порядке должен находиться кварцевый резонатор. Данный МК работает на частоте 4 или 10 МГц. Подключать кварц вместе с конденсаторами(по 20 или 30 пФ) так:
Схема подключения кварца
На выводы 10(-) и 20(+) подается питание. Для работы устройства(реле берем пятивольтовые) нужно ~ 5-6 В. Можно подключать как батареи, так и блок питания. На GND также вешаем один провод от телефона.
На выводы 12-18 портов B цепляем второй от телефона(в дальнейшем конфигурируем этот бит как вход). Светодиод(опционально), и два реле.
Подключение светодиода обязательно через резистор для ограничения тока:
Схема подключения светодиода
Подключение реле через резистор с транзистором(достаточно будет КТ315) т.к. реле потребляет большой ток и диодами для защиты от самоиндукции реле параллельно его обмотке:
Схема подключения реле
Для встраивания устройства в домофон нужно соответствующим образом соединить контакты реле. Трубка управляется герконом(принцип работы основан на намагничивании контактов, которые при этом смыкаются). При поднятии трубы происходит размыкание геркона. Поэтому реле, отвечающее за поднятие трубы будет по умолчанию замкнуто и присоединено последовательно геркону. Геркон, кстати, трогать строго не рекомендуется, изменение его положения может сказаться на точности срабатывания.
Плата домофона
Реле, отвечающее за нажатие, делаем по умолчанию разомкнутым и припаиваем параллельно кнопке в самом домофоне.
На тему выведения провода из домофона можно достаточно много пофантазировать. В итоге я воспользовался таким разъемом:
Разъем домофон-девайс
Еще мне в голову пришла идея, что удобно будет использовать разъем 3,5мм jack с раздвижными контактами. Он удобен тем, что при отключении устройства не нужно будет ставить перемычку на геркон для нормальной работы домофона. В противном случае эти контакты при отключении девайса надо замкнуть
Готовый девайс без разъема:
Девайс без разъема
Кстати, для соединения очень удобно использовать провода с зажимами «крокодил». Быстро и надежно.

Теперь приступим к написанию прошивки. Гораздо нагляднее писать ее на С по сравнению с ассемблером. Здесь необходима фирменная Atmel’овская утилита CVAVR. Если она не запускается, а вылетает с ошибкой, ставьте режим совместимости с Windows 98(правой кнопкой на экзешник — вкладка «совместимость» — windows 98 в списке).
Первым шагом при создании проекта задаем модель чипа и частоту кварца.
Задаем частоту и модель чипа
Далее создаем отдельно текстовый файл с расширением .C и добавляем его на вкладке Files.
После этого попадаем непосредственно в среду, где мы будем писать программу.
Первая строка в программе описывает модель МК.
#include <90s2313.h>

Подключаем библиотеку задержки МК. Паузы необходимы для корректной симуляции последовательности снятие трубы-ждем(мой домофон «Факториал» отказался открывать при задержке здесь менее 3 секунд)-нажинаем кнопку – ждем-отпускаем кнопку-кладем трубу.
#include <delay.h>

Эта команда конфигурирует порт как вход(если бит 0) или выход(бит 1).
Для удобства можно представить порт из 8 бит так:
Порт
В каждую ячейку прописываем 1 или 0, полученное число в шестнадцатеричном виде пишем в программу.
DDRB=0x07; 

Задаем в порт введенные значения. В данном случае эти значения будут на порте В по умолчанию(в начале работы МК).
PORTB=0x0C; 

Для отладки, проверки работоспособности системы и исключения ложных срабатываний в начале цикла на один из выходов повешен светодиод, мигающий один раз перед началом цикла. Если не включать в схему светодиод, надо вместо его подмигивания в программе поставить задержку ~2500-3000 миллисекунд.
Команда задает задержку в миллисекундах:
delay_ms(2000); 

Светодиод включается при значении 0, т.к он подключен к +Vcc(питание МК) через резистор. Таким образом, создается разность потенциалов(напряжение).
PORTB.2=0;

Подмигиваем светодиодом.

delay_ms(250);
PORTB.2=1;
delay_ms(250); 

Далее следует сама программа опроса состояния входа МК и открытия двери.
while(1)//бесконечный цикл

Опрос состояния входа и открытие двери при поступлении сигнала, т.к. при звонке на мобильник значение бита на входе равно 0. Важный момент! При чтении информации с порта используется команда PIN[индекс порта].[№ порта].В остальных случаях PORT[индекс порта].[№ порта].
Индексы и номера портов прописываем в зависимости от собранной схемы(расположения реле в нашем случае).
{
           while(PINB.3==0)
}
          }
{delay_ms(1000);
          PORTB.0=1;//поднимаем трубку
          delay_ms(3000);
          PORTB.1=1;//жмем на кнопку
          delay_ms(1000);
          PORTB.1=0;//отпускаем кнопку
          delay_ms(1500);
          PORTB.0=0;//кладем трубу
          delay_ms(1500);//Здесь можно поставить задержку больше, чтобы реле не щелкали больше одной серии.

После выполнения этой последовательности программа вернется к проверке условия (PINB.3==0).

Исходник на С надо скомпилировать в ассемблер. Это делается также в CVAVR кнопкой «Compile the project».Надо убедиться, что программа написана без ошибок. Об этом скажут строки No errors и No warnings в появившемся окне. В противном случае программа сама укажет на строки, где содержатся ошибки.
Окно завершения компиляции
После этих действий в папке и исходником появится файл с расширением .asm. Его открываем с помощью утилиты WAVRASM и жмем Assemble вверху.
WAVRASM
Утилита выдаст сообщение о завершении операции. Теперь в папке с исходником должен появиться файл HEX.Это и есть готовая прошивка для МК.
С помощью утилиты Uniprof заливаем hex-прошивку в МК.
Uniprof
Алгоритм:
1.Подсоединяем контроллер(если работаем через COM, делаем это на выключенном компе!).
2.Выбираем порт подключения внизу.
3.Читаем контроллер(кнопка Read)
4.Стираем то, что было записано в МК(кнопка Erase)
5.Открываем этой прогой файл прошивки(HEX).
6.Записываем прошивку в МК(кнопка Prog)
7.Проверяем содержимое МК(кнопка Test)
МК прошит.

Устройство работает корректно, но при этом постоянно потребляет ток около 15 мА(от силы 5 дней непрерывной работы от батарей, маловато…). Для существенного снижения энергопотребления в МК предусмотрен режим SLEEP. В этом режиме прибор может работать от тех же батарей несколько месяцев. Для его использования нужно прописать в специальные регистры МК соответствующие значения. Также нужно разрешить прерывание этого режима по внешнему сигналу. В данном случае по низкому уровню на одной из линий порта D. В модели AT90S2313 такой функцией обладают PORTD.3(INT0) и PORTD.2(INT1). Для выведения сигнала с телефона можно использовать любую из этих линий.
В таком случае программа будет выглядеть следующим образом:

#include <90s2313.h>
#include <delay.h>

Команда задает прерывание по внешнему сигналу на вывод INT1.
interrupt[EXT_INT1]void ext_int1(void) 

Далее следуют действия, выполняемые после прерывания.
{delay_ms(1000);
PORTB.0=1;
delay_ms(3000);
PORTB.1=1;
delay_ms(1000);
PORTB.1=0;
delay_ms(1500);
PORTB.0=0;
delay_ms(1500);
}

Здесь начинается главная программа. В данном случае она настраивает прерывания, разрешает экономичный режим, и переводит МК в SLEEP.
void main() 
DDRD=0x00; //Теперь сигнал с телефона ловим на порте D.
PORTD=0xFF;
DDRB=0x07;
PORTB=0x0C;
delay_ms(2000);
PORTB.2=0;
delay_ms(250);
PORTB.2=1;
delay_ms(250);

Прерывания по таймеру не используем.
TIMSK=0;

Управление внешними прерываниями. Сам регистр и таблица бит представлена ниже.
Таблица управления прерываниями
Регистр,отвечающий за прерывания
GIMSK=0x80;

Управление режимами энергопотребления. Для режима power down прописываем бит SE=1(делает возможным выбор режима энергосбережения) и SM=1(выбирает режим power down).Регистр представлен ниже.
Регистр,отвечающий за энергопотребление
Ассемблерная команда, разрешающая любые прерывания, для записи ассемблерных команд в С используем оператор asm/endasm.
#asm 
sei
#endasm

Команда sleep включает power down mode в главной программе.
sm:#asm
sleep
#endasm

Возвращаем МК в спящий режим после прерывания.
goto sm;
}   

С этой прошивкой девайс практически не потребляет ток во время простоя. Это хорошо видно на фото:Девайс подключен,ток около 0!
Батареек теперь, конечно, надолго хватит.

Видео с долгожданного испытания in action:
1)Работа устройства в квартире.

2)Вид из глаз звонящего.

Ура! It works!!!

Напоследок полный список деталей и необходимого ПО.
Детали: микроконтроллер, панелька для него, макетка, кварц, 2 конденсатора по 20 или 30 пФ, 2 5В реле, 2 транзистора КТ315, резистор ~300 Ом для светодиода, 2 резистора 4,7 кОм, 2 диода, клеммы, разъем, светодиод.
ПО(приложу в архиве):CVAVR, WAVRASM, UNIPROF, sPlan(для просмотра схемы).

На этом несложном примере мы разобрали азы работы с МК. На самом деле, это широчайший раздел электроники. Надеюсь, моя статья поможет многим обрести опыт в этой сфере.

Файлы для скачивания:
Софт(3,85МБ)
Схема, исходники, прошивки(23КБ)

  • +4
  • 13 мая 2011, 19:44
  • rad

Комментарии (45)

RSS свернуть / развернуть
хммм а то в персональном блоге на конкурс
перекинь на главную ))))
0
  • avatar
  • oss
  • 13 мая 2011, 20:01
Как?
0
В справочной написано.
0
нуу надо подписаться на коллективные блоги ))
0
Спасибо за помощь! Перекинул
0
давай еще ченить интересное сваяиии ))))))))
конкурс то заканчивается ужжж
0
Здесь необходима фирменная Atmel’овская утилита CVAVR.
Ыыы. С каких это пор CVAVR атмеловский?)
Алсо, МК и компилер такие древние) Я 90Sxx даже вживую не видел.
0
  • avatar
  • Vga
  • 13 мая 2011, 20:06
Ну, если быть точным, утилита предназначена для атмеловских мк.
0
Ну если быть точным, то это не утилита, а среда разработки. К атмелу отношение имеет только то, что под его AVR'ки. Дрянненькая среда, говорят. Если учесть, что те же люди, что поносили CVAVR, хвалили микропаскаль — мне страшно представить, каким оно должно быть дерьмом)
Алсо авторы говорят что если оно заметит что его крекнули — будет портить код. Нафиг такое счастье, когда есть хорошо оптимизирующий и бесплатный WinAVR.
Ну и статья какая-то сомнительная… С одной стороны, объяснений довольно много… С другой — понимающему они выглядят комментариями КО, а для начинающего — не уверен, что они будут понятны.
+2
А вот сама идея любопытная. Хотя реализация и не в моем вкусе, но идея определенно интересная!
0
Ну CVAVR не такая уж дряненькая среда, до IAR по качеству кода далеко конечно. Но чтобы начать новый проект нужно десяток секунд для генерации начального кода(для новичков это может быть плюсом в равной степени как и минусом).А по поводу порчи кода не замечал, в основном все косяки были человеческим фактором обусловлены(мной ;) ).
0
Значит сломана нормально. Или не сломана вообще (не помню какие там ограничения). Или не сработало почему-либо. По крайней мере авторы грозили халявщикам именно этим.
Впрочем, некоторые компилеры косячат код даже без кряков.
Но в целом — зачем оно, если есть бесплатный и достаточно прямой AVRStudio+WinAVR (в пятой версии — из коробки и с нормальной IDE)? Даже язык тот же (это единственная фича микропаскаля и микровасика).
Кстати, о минусах. Указатель пути в Mafia II очень удобный. Но… Город я не запомнил до сих пор. А в первой было дело гонял без карты, только глянув, где крестик цели.
0
1.Подсоединяем контроллер(если работаем через COM, делаем это на выключенном компе!).
А что может случится, если комп включен?
0
А, сорри, не заметил. Незнаю, у меня за два года ничего не сгорело. Подключал только при включеном компе.

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

Я сам хотел сделать немного по-другому:
-Звонишь в домофон.
-Устройсто поднимает трубку, слушает…
-Берешь сотовый, включаешь на воспроизведение mp3 c записаным DTMF (впрочем, не обязательно DTMF) кодом.
— Устройство распознает код. Если он совпадает — открывает дверь.
0
а лучше не со звонящего сотового включать мп3, а на принимающем выставить мелодию на конкретного человека. это и отфильтрует левых звонящих
0
С домашнего телефона будет гораздо больше ложных срабатываний, у меня по крайней мере.А эта симка вообще без дела валялась до этого, так что левых звонящих, скорее всего, не будет. Если только, кто-нибудь намеренно мою фичу просечет.
0
А ты авторизацию на МК прикрути — тогда не будет. И заодно использование МК оправданным станет.
0
Кстати, реле при переключении не сбрасывают МК?
0
Не наблюдалось такого
0
… парню за смекалку плюсик надо поставить
З.Ы.: у ATMEL есть даташит «Getting starting with CVAVR», что можно считать как своего рода рекомендацию :))
0
… а вообще каждый пользуется тем инструментом который ему удобней
0
Мило, мило. :-) Только зачем тут МК? Хватило бы 555 ;-)
0
можно написать кодирующий и декодирующий алгоритм. он известен устройству и явопрограмме в телефоне. итак, устройство генерит секретный звуковой, кодирует его и передает звуками в телефон, в телефоне звуки декодируются и передаются обратно звуками в виде раскодированой последовательности. устройство сравнивает секретный код и тот, что получен с телефона. если алгоритмы идентичны, то можно открыть дверь :)

хотя можно просто сделать открытые и закрытые ключи и передавая цифровую подпись с телефона.
0
  • avatar
  • 21h
  • 14 мая 2011, 07:40
А нельзя было в CVAVR сразу HEX получить? Зачем лишний гемор с WAVRASM?
0
В этой версии компилятора че-то я не нашел, как это сделать, может искал фигово…
А вообще приму с удовольствием конструктивные советы, все-таки это мой первый такой серьезные проект на МК.
0
Совет переползти на AVRStudio+WinAVR или IAR EWAVR конструктивным считается?) Они, конечно, потолще, но и попрямее.
+1
У тебя на скриншоте, где настройки проекта «Configure Project» есть пункт: File Output Format(s) вы бери там строчку в которой HEX будет.И после компиляции в папке EXE будет хекс готовый для прошивки.
Если это первый проект на МК, то он очень даже ничего. Молодец.
По поводу переползания на WinAVR или IAR — вообщем-то совет дельный. Правда с WinAVR делов не имел, а вот на IAR сам собираюсь переходить. Так как после анализа листингов от CVAVR и IAR, склонился в сторону последнего. Хотя на CVAVR с 2003.
0
Спасибо!
0
а в квартиру то мы всё равно никак не попадём,
нет, устройство норм, идея хорошая, но не прятать же ключ от квартиры под ковриком
0
Ну могут иногда случаться что от квартиры ключ есть, а от домофона не оказалось)
0
Или таблетка внезапно скопытилась.
0
напоминает анекдот, где последняя фраза звучит так: «А на этот случай у меня проездной»
0
Тоже что-то подобное недавно собирался делать так как таблетке пришел конец, но сделал по другому, вешается параллельно трубке домофона, звоню в свою квартиру — дверь открывается, PROFIT!!1
0
Пофит будет ровно до тех пор, пока все остальные не узнают, что позвонив в твою квартиру можно открыть дверь.

Надо сделать какую-нибудь идентификацию или хотя-бы видимость того, что она есть.
0
в принципе да, согласен.
0
То rad: хочешь померить потребление с хорошей точностью — повесь на питание кондер побольше и замерь падение напряжения во времени при отсоединении питания. Мультитметром тыкать при таких токах негоже)
0
Мне вот раньше казалось что дверь нельзя открыть пока с тобой связь снизу не установят. Хотя решение на поверхности. и еще желательно после звонка динамик домофона гасить, чтоб домашние там в темноте все тазики не побили. ( без ключей обычно ночью возвращаются под утро :) )
А тема интересная. Себе наверно попробую прикрутить.
0
Приятно, что кому-то пригодится :)
0
Народ, как думаете имеет смысл писать статью, как перетащить проект на более современный контроллер? Просто она на 90% будет состоять их перевода даташита, ну и + пояснения для общих случаев и конкретной ситуации.
0
  • avatar
  • rad
  • 14 июня 2011, 07:57
Хм, на более современный — на тинечку?
0
Ага, attiny2313
0
Можно написать статью о том как перетащить на более новый контроллер сферический проект в вакууме. Может быть полезно, ибо AT90Sxxx щас фик найдёшь, а тинь как грязи.
0
Меня смущает, что в условиях написания статей сказано «избегать цитирования даташитов»…
0
Ага-а. А взгляни-ка на ЕЕ ;)

«Не цитировать даташиты» означает что должны преобладать твои рассуждения а не текст скопипащеный откуда-то из шита. Вроде так.
0
Спасибо, буду пробовать рассуждать)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.