Как известно человек стал человеком благодаря труду. Но ведь на этот труд его толкает бесконечная лень. Когда-то давно, когда обезьяне надоело лазить на дерево за бананами, она взяла в руки палку и начала сбивать их с земли. Вроде прогресс, а двигатель - лень!
Впрочем речь идет не об обезьянах, а о той самой лени.
Для воплощения данной идеи нам необходима сама флешка, пара светодиодов (я взял по стандарту зеленый и красный), пара метров удлинительного кабеля usb от ПК до замка, сервомоторчик и сердцем всей нашей системе будет контроллер Arduino.
Что такое Arduino?
Девайс, который мы выше назвали Arduino, представляет собой простую и удобную плату ввода/вывода со встроенной средой разработки на специальном языке Wiring. Прелесть в том, что язык этот фактически является C++, поэтому нет никакой необходимости осваивать набор программ контроллера и фактически писать программу на ассемблере. Плата Arduino состоит из микроконтроллера ATmega328 или ATmega168 и небольшой элементной обвязки для программирования и интеграции с другими схемами. На каждой плате обязательно присутствуют линейный стабилизатор напряжения 5 В для питания микроконтроллера и 16 МГц кварцевый резонатор, задающий тактовую частоту работы микроконтроллера (МК).
Для начала нам необходимо написать небольшую программку для определения 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);
}
В общем вот и все. Теперь осталось собрать все в кучу, скомутировать и вешать на дверь - пугать соседей.
Свежие комментарии