Строительный портал. Стены и фасады. Водоснабжение и канализация. Отопление дома

Автоматический "умный" замок и Arduino. Автоматический "умный" замок и Arduino Подготовка к сборке

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

Порывшись на китайских барахолках и ebay я ничего дешевого и более-менее серьезного не нашел и решил сделать его своими руками. Оговорюсь сразу, что платформа Arduino была выбрана за свою простоту, так-как опыта общения с микроконтроллерами не было вообще.

Идея

На двери с внешней стороны двери должна располагаться клавиатура, на которой вводится пароль, с внутренней стороны закреплена остальная конструкция. Для контроля полного закрытия двери используется геркон. Выходя из кабинета человек нажимает на клавиатуре «*» и не дожидаясь пока дверь закроется доводчиком идет по своим делам, когда дверь будет полностью закрыта, геркон замкнется и замок будет закрыт. Открывается дверь с помощью ввода 4х значного пароля и нажатием на «#».

Комплектующие

Arduino UNO = $18
Arduino protoshield + breadboard = $6
L293D = $1
Пучок проводов 30шт для бредборда = $4
2 розетки RJ45 = $4
2 вилки RJ45 = $0.5
актуатор центрального замка = 250 руб.
Геркон = бесплатно оторван от старого окна.
Шпингалет металлический гигантских размеров = бесплатно
Корпус от старого хаба D-LINK из полуторамиллиметрового железа = бесплатно
Блок питания от того же хаба D-LINK на 12 и 5в = тоже бесплатно
Куча винтов и гаечек для крепления всего этого добра к корпусу = 100руб.
Пульт управления от охранной сигнализации = бесплатно.

Итого: $33,5 и 350руб.

Не так уж и мало, скажете вы, и будете, определенно правы, но ведь за удовольствие надо платить! А собрать, что-то своими руками всегда приятно. К тому-же конструкцию можно сильно удешевить, если использовать голый МК без Arduino.

Подготовка к сборке

Хочется несколько слов сказать о покупке ключевого элемента конструкции актуатора. В местном авто-магазине мне предложили актуаторы двух видов: «с двумя проводами и с пятью». Со слов продавщицы они были абсолютно одинаковыми и различие в количестве проводов не значило абсолютно ничего. Однако, как оказалось позже, это не так! Я выбрал девайс с двумя проводами, он питался от 12в. В конструкции с пятью проводами установлены концевые выключатели, что позволяет контролировать движение рычага. Понял, что купил не тот я только когда разобрал его и менять его было поздно. Ход рычага оказался слишком коротким, чтобы нормально задвинуть щеколду, поэтому, необходимо было немного его доработать, а именно удалить две резиновые шайбы укорачивающие ход рычага актуатора. Для этого корпус пришлось распилить вдоль обычной ножовкой, потому, что вторая шайба находилась внутри. Синяя изолента нам, как всегда помогла нам в дальнейшем при сборке его назад.
Для управления мотором актуатора был использован драйвер моторов L293D, который выдерживает пиковую нагрузку до 1200 мА, у нас при остановке двигателя актуатора пиковая нагрузка вырастала всего до 600 мА.
Из пульта управления от охранной сигнализации были выведены контакты с клавиатуры, динамика и двух светодиодов. Пульт и основное устройство предполагалось соединить с помощью витой пары и RJ45 разъемов

Программирование.

Так, как опыта программирования Arduino у меня не было до сих пор. Я воспользовался чужими наработками и статьями с сайта arduino.cc. Кому интересно, может поглядеть этот безобразный код :)

Фото и видео



Ардуино и актуатор


Блок питания


Клавиатурка


Шпингалет (соединен с актуатором металлической спицей и на которую надета термоусадка для красоты)

Видео процесса работы устройства:

Arduino является лучшей системой для копирования какого-либо оборудования. Большинство идей не смогли бы воплотиться без нее. Давно существует такая мысль: создать специальный кодовый замок на ардуино. Для его открытия необходимо зажатие определенной клавиши. При этом замок не должен открываться, даже если знать нужную кнопку. Чтобы его отрыть необходимо выдержать определенные интервалы, используя мышечную память. Такое преступник не сможет совершить. Но это все лишь теория.

Чтобы его собрать нужно воспользоваться специальным прибором прямоугольных импульсов, а также несколько счетчиков и ворох. Но готовое устройство имело бы большие габаритные размеры и его неудобно было бы использовать. Как правило, такие мысли не дают покоя. Первым этапом при воплощении мечты стало создание программы под Arduino. Именно она будет служить в качестве кодового замка. Для того чтобы открыть его понадобится нажать не одну клавишу, а несколько, причем делать это одновременно. Готовая схема выглядит таким образом:

Качество картинки не лучшее, но подключение выполняется к земле, D3, D5, D7, D9 и D11.

Код представлен ниже:

Const int ina = 3; const int inb = 5; const int inc = 9; const int ledPin = 13; int i = 1000; byte a = 0; byte b = 0; byte c = 0; byte d = 0; unsigned long time = 0; //не забывайте всё, что принимает значение millis() unsigned long temp = 0; //хранить в unsigned long byte keya = { 0, 0, 0, 0, 0, 0, 0, 0}; //коды собственно byte keyb = { 1, 1, 1, 1, 0, 1, 0, 0}; byte keyc = { 1, 0, 1, 0, 1, 1, 1, 0}; byte k = 0; void setup() { pinMode(ina, INPUT_PULLUP); //3 входа, подключаемые к кнопкам pinMode(inb, INPUT_PULLUP); pinMode(inc, INPUT_PULLUP); pinMode(ledPin, OUTPUT); //встроенный светодиод на 13-ом пине pinMode(7, OUTPUT); pinMode(11, OUTPUT); digitalWrite(7, LOW); //заменяют землю digitalWrite(11, LOW); time = millis(); //нужно для отсчёта времени } void blinktwice() { //двойное мигание светодиодом digitalWrite(ledPin, HIGH); delay(100); digitalWrite(ledPin, LOW); delay(100); digitalWrite(ledPin, HIGH); delay(100); digitalWrite(ledPin, LOW); delay(200); } void loop() { if(k==0) { blinktwice(); //приглашение ввести код } if (k == 8) { digitalWrite(ledPin, HIGH); delay(3000); k = 0; } a = digitalRead(ina); //считываются уровни сигналов с кнопок - нажата/не нажата b = digitalRead(inb); c = digitalRead(inc); delay(100); //следующий if - защита против ложных срабатываний, можно не использовать if((digitalRead(ina) == a)&&(digitalRead(inb) ==b)&&(digitalRead(inc)==c)) { if (a == keya[k]) { if (b == keyb[k]) { if (c == keyc[k]) { k++; } } } } if (k==1) { if (d ==0) { time = millis (); d++; } } temp = millis(); temp = temp - time; if (temp > 10000) { k= 0; d=0; time = millis (); } }

Чтобы не возникало лишних вопросов по коду, следует разъяснить некоторые моменты. Функция setup используется для назначения портов. Следующая функция – Input_Pullup, которая необходима для увеличения напряжения пина на 5 В. Это осуществляется с помощью резистора. Благодаря этому не будут возникать различные короткие замыкания. Для большего удобства рекомендуется применять функцию blinktwice. Вообще при создании различных программ нужно пробовать другие функции.

После назначения функций происходит считывание сигнала с портов. Если кнопка нажата, то это будет обозначаться цифрой 1, а если нет – 2. Далее, происходит анализ всех значений. Например, появилась такая комбинация, как 0,1,1. Это означает, что первая клавиша нажата, а остальные две нет. Если все значения выполняются верно, то условие 8 тоже верно. Об этом свидетельствует загоревшийся светодиод на передней панели. Далее необходимо вписать определенный код, который будет служить для открывания двери.

Последние элементы кода служат для сбрасывания значений счетчика. Такая функция выполняется, если после последнего нажатия клавиши прошло более 10 секунд. Без этого кода можно было перебрать все возможные варианты, хоть их достаточно много. После создания данного устройства необходимо его протестировать. Еще

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

Порывшись на китайских барахолках и ebay я ничего дешевого и более-менее серьезного не нашел и решил сделать его своими руками. Оговорюсь сразу, что платформа Arduino была выбрана за свою простоту, так-как опыта общения с микроконтроллерами не было вообще.

Идея

На двери с внешней стороны двери должна располагаться клавиатура, на которой вводится пароль, с внутренней стороны закреплена остальная конструкция. Для контроля полного закрытия двери используется геркон. Выходя из кабинета человек нажимает на клавиатуре «*» и не дожидаясь пока дверь закроется доводчиком идет по своим делам, когда дверь будет полностью закрыта, геркон замкнется и замок будет закрыт. Открывается дверь с помощью ввода 4х значного пароля и нажатием на «#».

Комплектующие

Arduino UNO = $18
Arduino protoshield + breadboard = $6
L293D = $1
Пучок проводов 30шт для бредборда = $4
2 розетки RJ45 = $4
2 вилки RJ45 = $0.5
актуатор центрального замка = 250 руб.
Геркон = бесплатно оторван от старого окна.
Шпингалет металлический гигантских размеров = бесплатно
Корпус от старого хаба D-LINK из полуторамиллиметрового железа = бесплатно
Блок питания от того же хаба D-LINK на 12 и 5в = тоже бесплатно
Куча винтов и гаечек для крепления всего этого добра к корпусу = 100руб.
Пульт управления от охранной сигнализации = бесплатно.

Итого: $33,5 и 350руб.

Не так уж и мало, скажете вы, и будете, определенно правы, но ведь за удовольствие надо платить! А собрать, что-то своими руками всегда приятно. К тому-же конструкцию можно сильно удешевить, если использовать голый МК без Arduino.

Подготовка к сборке

Хочется несколько слов сказать о покупке ключевого элемента конструкции актуатора. В местном авто-магазине мне предложили актуаторы двух видов: «с двумя проводами и с пятью». Со слов продавщицы они были абсолютно одинаковыми и различие в количестве проводов не значило абсолютно ничего. Однако, как оказалось позже, это не так! Я выбрал девайс с двумя проводами, он питался от 12в. В конструкции с пятью проводами установлены концевые выключатели, что позволяет контролировать движение рычага. Понял, что купил не тот я только когда разобрал его и менять его было поздно. Ход рычага оказался слишком коротким, чтобы нормально задвинуть щеколду, поэтому, необходимо было немного его доработать, а именно удалить две резиновые шайбы укорачивающие ход рычага актуатора. Для этого корпус пришлось распилить вдоль обычной ножовкой, потому, что вторая шайба находилась внутри. Синяя изолента нам, как всегда помогла нам в дальнейшем при сборке его назад.
Для управления мотором актуатора был использован драйвер моторов L293D, который выдерживает пиковую нагрузку до 1200 мА, у нас при остановке двигателя актуатора пиковая нагрузка вырастала всего до 600 мА.
Из пульта управления от охранной сигнализации были выведены контакты с клавиатуры, динамика и двух светодиодов. Пульт и основное устройство предполагалось соединить с помощью витой пары и RJ45 разъемов

Программирование.

Так, как опыта программирования Arduino у меня не было до сих пор. Я воспользовался чужими наработками и статьями с сайта arduino.cc. Кому интересно, может поглядеть этот безобразный код :)

Фото и видео



Ардуино и актуатор


Блок питания


Клавиатурка


Шпингалет (соединен с актуатором металлической спицей и на которую надета термоусадка для красоты)

Видео процесса работы устройства:

В данном уроке мы научимся делать простую систему, которая будет отпирать замок по электронному ключу (Метке).

В дальнейшем Вы можете доработать и расширить функционал. Например, добавить функцию "добавление новых ключей и удаления их из памяти". В базовом случае рассмотрим простой пример, когда уникальный идентификатор ключа предварительно задается в коде программы.

В этом уроке нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

2) Теперь нужно подключить Зуммер, который будет подавать сигнал, если ключ сработал и замок открывается, а второй сигнал, когда замок закрывается.

Зуммер подключаем в следующей последовательности:

Arduino Зуммер
5V VCC
GND GND
pin 5 IO

3) В роли отпирающего механизма будет использоваться сервопривод. Сервопривод может быть выбран любой, в зависимости от требуемых вам размеров и усилий, который создает сервопривод. У сервопривода имеется 3 контакта:

Более наглядно Вы можете посмотреть, как мы подключили все модули на картинке ниже:

Теперь, если все подключено, то можно переходить к программированию.

Скетч:

#include #include #include // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате Servo servo; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(6); servo.write(0); // устанавливаем серву в закрытое сосотояние } void loop() { // Поиск новой метки if (! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if (! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние }

Разберем скетч более детально:

Для того, что бы узнать UID карточки(Метки), необходимо записать данный скетч в arduino, собрать схему, изложенную выше, и открыть Консоль (Мониторинг последовательного порта). Когда вы поднесете метку к RFID, в консоли выведется номер

Полученный UID необходимо ввести в следующую строчку:

If (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданному то сервопривод открывает задвижку.

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

Видео:

В этой статье я расскажу, как сделать кодовый замок из ардуино. Для этого нам понадобятся красный и зелёный светодиоды, зуммер, ардуино нано, LCD дисплей с I2C конвертором, сервопривод и матричная клавиатура 4x4. При включении дисплей будет писать "Enter code.",

включится красный светодиод,

а зелёный погаснет, сервопривод установится на 0°. При вводе цифр на дисплее будут загораться *.

Если код введён неверно, то дисплей напишет "Enter cod.". Если код правильный, то прозвучит звуковой сигнал, серво привод повернётся на 180°, дисплей напишет "Open."

включится зелёный светодиод,

а красный отключится. После 3 секунд сервопривод вернётся в начальное положение, включится красный светодиод, а зелёный погаснет, дисплей напишет "Close.",

затем дисплей напишет "Enter code.". Теперь о схеме. Сначала соединяем ардуино проводами с макетной платой (контакты питания).

Потом подключаем к контактам D9 - D2 матричную клавиатуру.

Затем сервопривод. Его подключаем к контакту 10.

Красный светодиод к контакту 11.

Зелёный - к контакту 12.

Зуммер - к контакту 13.

Теперь загружаем скетч.

#include #include #include #include iarduino_KB KB(9, 8, 7, 6, 5, 4, 3, 2); LiquidCrystal_I2C lcd(0x27, 16, 2); Servo servo; int pass = {3, 6, 1, 8}; int in; int r = 11; int g = 12; void setup() { KB.begin(KB1); pinMode(r, OUTPUT); pinMode(g, OUTPUT); lcd.init(); lcd.backlight(); digitalWrite(g, LOW); digitalWrite(r, HIGH); servo.attach(10); servo.write(0); lcd.setCursor(0, 0); } void loop() { lcd.clear(); lcd.print("Enter code."); while (!KB.check(KEY_DOWN)) { delay(1); } in = KB.getNum; lcd.clear(); lcd.setCursor(0, 0); lcd.print("*"); while (!KB.check(KEY_DOWN)) { delay(1); } in = KB.getNum; lcd.print("*"); while (!KB.check(KEY_DOWN)) { delay(1); } in = KB.getNum; lcd.print("*"); while (!KB.check(KEY_DOWN)) { delay(1); } in = KB.getNum; lcd.print("*"); if (in == pass) { if (in == pass) { if (in == pass) { if (in == pass) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Open."); tone(13, 400, 750); servo.write(180); digitalWrite(r, LOW); digitalWrite(g, HIGH); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Close."); tone(13, 300, 700); servo.write(0); digitalWrite(g, LOW); digitalWrite(r, HIGH); delay(1000); } } } } }

Вот и всё. Наслаждайтесь кодовым замком!

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Е1 Плата Arduino

Arduino Nano 3.0

1 В блокнот
Е8, Е9 Резистор

220 Ом

2 SMD В блокнот
Е6 Светодиод

АЛ102Г

1 Красный В блокнот
Е7 Светодиод

АЛ307Г

1 Зелёный В блокнот
Е3 LCD-дисплей С I2C интерфейсом 1 Зелёная подсветка В блокнот
Е5 Сервопривод SG90 1 180 градусов В блокнот
Е2 Зуммер 1 Bu В блокнот
Е4 Клавиатура 4Х4 1 Матричная В блокнот
Нет BreadBoard 640 точек 1 Без пайки
Понравилась статья? Поделитесь с друзьями!
Была ли эта статья полезной?
Да
Нет
Спасибо, за Ваш отзыв!
Что-то пошло не так и Ваш голос не был учтен.
Спасибо. Ваше сообщение отправлено
Нашли в тексте ошибку?
Выделите её, нажмите Ctrl + Enter и мы всё исправим!