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

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

  • Павел Полуян
    Я вижу, тут народ знает о пушках-рельсотронах. Да, это система из двух протяженных продольных контактов-рельсов и сна...Будущее (или засе...
  • Наталья Конева
    Не надо нам 5 g!!Когда в России за...
  • валерий лисицын
    Ничего там нет . Мёртвая планета .Загадки Марса: но...

Дверной замок на 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);

}

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

наверх