На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

Свежие комментарии

Дверной замок на Arduino

Как известно человек стал человеком благодаря труду. Но ведь на этот труд его толкает бесконечная лень. Когда-то давно, когда обезьяне надоело лазить на дерево за бананами, она взяла в руки палку и начала сбивать их с земли. Вроде прогресс, а двигатель - лень!

Впрочем речь идет не об обезьянах, а о той самой лени.

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

Для воплощения данной идеи нам необходима сама флешка, пара светодиодов (я взял по стандарту зеленый и красный), пара метров удлинительного кабеля usb от ПК до замка, сервомоторчик и сердцем всей нашей системе будет контроллер Arduino.


Что такое Arduino?

Девайс, который мы выше назвали Arduino, представляет собой простую и удобную плату ввода/вывода со встроенной средой разработки на специальном языке Wiring. Прелесть в том, что язык этот фактически является C++, поэтому нет никакой необходимости осваивать набор программ контроллера и фактически писать программу на ассемблере. Плата Arduino состоит из микроконтроллера ATmega328 или ATmega168 и небольшой элементной обвязки для программирования и интеграции с другими схемами. На каждой плате обязательно присутствуют линейный стабилизатор напряжения 5 В для питания микроконтроллера и 16 МГц кварцевый резонатор, задающий тактовую частоту работы микроконтроллера (МК).

Все эти данные — лишь для общего развития. Нам важно знать другое. В микроконтроллер предварительно прошивается загрузчик (бутлоадер), это значит, что внешний программатор не нужен, и прошивка пользовательских программ (так называемых скетчей) производится из Arduino IDE нажатием одной кнопки. "В чем фишка?", — спросишь ты. Суди сам: чтобы залить (прошить) программу в большинство микроконтроллеров требуются специальные устройства — программаторы. Для разных МК и других нужд существует куча программаторов — от специализированных (шьет только AVR) до универсальных (шьет все), от простых (7 проводков от LPT-порта к ножкам МК) до сложных (часто и сами они построены на МК). Общая проблема программаторов в том, что их надо где-то взять (купить, взять у товарища, спаять самому). А теперь почувствуй разницу: для Arduino программатор не нужен. Прошивка может заливаться в нее через обычный USB-шнурок. Более того, саму Arduino можно использовать как программатор и шить ею другие МК! Питаться Arduino может как от внешнего постоянного напряжения 9- 2В (то есть запитать ардуину можно от блока питания компьютера или ноутбука, батареек или аккумуляторов), так и от USB-порта компьютера. Короче говоря, чтобы начать работать с микроконтроллером, нужна только сама плата и USB-шнурок типа A-B, которым к ПК подключаются принтеры.

Для начала нам необходимо написать небольшую программку для определения id флешки. Писать будем на c++ в builder'е.

Собственно вот код:

GetVolumeInformation("h:", VolumeName.c_str() , 50, &SN, NULL, NULL,
FSName, 50);

VolumeName - имя нашего устройства, а вот SN - необходимый нам id (он не физический, а назначается операционной системой при форматировании, поэтому для большей безопасности можно также задействовать и VolumeName).

Дальше нам просто нужно записать вычисленный нами id в какую-то переменную и сравнить его с тем, который мы получаем при очередном подключении флешки.

Эту задачку решим так: Кладем на форму таймер, а в нем пишем:

dtyp = GetDriveType("h:");

if (dtyp != 2)

{

Timer2->Enabled=0;

Button1Click (this);

}

Здесь мы проверяем диск h:\ на наличие в нем устройства, а результат кидаем в dtyp.

dtyp != 2 означает, что в порту что-то есть. Тормозим таймер и запускаем проверочную процедурку Button1Click в которой мы и проверим соответствие нашего id тому, что получили:

unsigned long MySn=2797188077; // это номер моей флешки+

hCom = CreateFile("COM3", GENERIC_READ + GENERIC_WRITE, 3, NULL, CREATE_ALWAYS,
0, NULL);



if (SN==MySn) {

// проводим сравнение и если есть совпадение, то записываем в com-порт 1, в
//противном лучае - 0;

buf=1;

WriteFile(hCom, &buf, 1, &n, NULL);

access=1;



}

else {

buf=0;

WriteFile(hCom, &buf, 1, &n, NULL);

}

CloseHandle(hCom); //и естесственно не забываем закрыть порт

}

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

Суть следующая.

Ситуация 1 - у нас есть закрытая дверь и "правильный" ключ. Тогда при подключении флешки диод радостно загорается зеленым цветом, сервомоторчик открывает дверь:

if (buf==254 && accsses) {

digitalWrite (red,HIGH);

digitalWrite (green,LOW);

accsses=0;

for(int pos = 0; pos < 180; pos += 1)

{

servo1.write(pos);

delay(5);

}

}

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

if (buf==254 && !accsses) {

digitalWrite (red,LOW);

digitalWrite (green,HIGH);

accsses=1;

for(int pos = 180; pos>=1; pos-=1)

{

servo1.write(pos);

delay(5);

}

}

Ситуация 3 - у нас в руках оказался "неправильный" ключ. Что делать?! Дадим понять, что в usb-вход попало что-то не то поморгав красным диодом:

if (buf==252 && accsses) {

digitalWrite (red,HIGH); digitalWrite (green,LOW);

delay (300);

digitalWrite (red,LOW);

delay (300);

digitalWrite (red,HIGH);

delay (300);

digitalWrite (red,LOW);

delay (300);

digitalWrite (red,LOW);

delay (300);

digitalWrite (red,LOW);

digitalWrite (green,HIGH);

}

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

наверх