Перейти к публикации
iT4iT.CLUB

Таблица лидеров


Популярные публикации

Отображаются публикации с наибольшей репутацией на 07.02.2016 во всех областях

  1. 1 балл
    Обновление по просьбе Alex13 находится тут Открытие/Закрытие разнесены на разные пины микроконтроллера (для управление соленоидом) Обновление по просьбе Alex13 находится тут Добавлен выбор режима закрытия замка (автоматический или по карте) Добавлена сигнализация оповещающая о попытках подбора ключа Обновление по просьбе svchekalin находится тут Добавлен Ethernet Shield на чипе W5100 Ключи теперь хранятся не в EEPROM контроллера, а в MySQL базе на удаленном сервере ... Внимание: Очень много фотографий в статье! Начнем с предыстории. В один обыденный рабочий день ко мне обратились мои друзья и по совместительству коллеги по работе с идеей сделать замок с радиочастотной идентификацией. Электронный замок должен обслуживать дверь в рабочее помещение. Все бы хорошо, но дверь далеко не домашняя, сделана из метала и стоит в металлической коробки. Собрать электронную начинку замка и написать программу для микроконтроллера - решаемая задача, но как механически удержать такого монстра в зафиксированном состоянии? Но то, что для меня казалось проблемой, было воспринято моими друзьями с ухмылкой, и мне показали здоровый электромагнит. Точно такие же электромагниты используются в домофонах. Даже не хочу знать, откуда они его достали, но меня увиденное воодушевило. Задача поставлена, приступаем к реализации! Техническое задание Замок должен аутентифицировать хозяев без физического контакта пользователя с устройством Память должна вмещать не менее двух десятков ключей Устройство должно иметь возможность добавлять в память новые ключи Добавлять новые ключи можно только, используя специальный, мастер ключ Мастер ключ должен также иметь возможность открывать замок Должна быть реализована возможность обнуления списка используемых ключей, в том числе и удаление мастер ключа Замок должен иметь возможность открываться изнутри по нажатию на кнопку (как в домофоне) Все описанные пункты должны быть просты в использовании и не требовать знания программирования Реализация За основу было решено взять клон Arduino UNO с ATmega328p на борту в паре с RFID (NRF) сканером RC522. Сам сканер является очень удачным выбором т.к работает на частоте 13.56 МГц и поддерживает чипы: MIFARE S50 MIFARE S70 MIFARE UltraLight MIFARE Pro MIFARE DESfire ... Данные чипы используются в различных карточках метро и прочего общественного транспорта, ключах современных домофонов, различных умных браслетах и носимой электроники. У братьев Китайцев можно купить даже кольца с RFID (NRF) меткой. Некоторые чипы имеют энергонезависимую память небольшого объема. Прокручиваем решение в голове Хранить все ключи будем в энергонезависимой памяти микроконтроллера (EEPROM). Хорошее и как мне кажется единственное решение. ATmega328p имеет 1kB памяти, RFID (NRF) ключи содержат уникальный номер размером от 4 до N байт. Если уровнять все типы ключей, то читать мы будем только первый четыре байта любого ключа. Делаем вывод, что 1024/4=256 ключей. Но необходимо знать точное их количество чтобы не читать пустую память, иначе можно взломать замок так, как это делается с некоторыми домофонами, а именно - передать ключ, состоящий из одних 0 или 255 и Вуаля! Выделим один и по совместительству первый байт в EEPROM под число с количеством ключей и получаем (1024-1)/4=255,75, а это 255 полноценных четырехбайтных ключей! Это более чем достаточно, хоть домофон делай. Добавлять ключи будем путем записи его первых четырех байт, в свободную память микроконтроллера, начиная с N+1 занятого байта памяти Arduino. Но делать это необходимо только с использованием мастер ключа. И тут встают два вопроса, какой из ключей должен быть мастером и как его найти среди кучи всех остальных? А пусть мастер ключ хранится в строго определенных "ячейках" памяти микроконтроллера, мы ведь делаем это с количеством ключей! Пусть первый байт EEPROM отвечает за количество известных нам ключей, а следующие четыре байта будут отведены мастер ключу. Оставшуюся память отдаем под все остальное. Открытие дверей. Как понять, что поднесенный к сканеру ключ является тем самым или наоборот. Давайте опять отталкиваться от идеи четырехбайтного ключа. Пройдя все предыдущие этапы записи памяти микроконтроллера, мы с 100% точностью можем сказать, сколько ключей и как они расположены в памяти Arduino. Следовательно, для быстрого сравнения логичнее искать совпадение по первому байту каждого ключа в памяти, и только если оно найдено переходить к сравнению следующего байта. Если какой либо из 4 байт не совпал, то останавливаем проверку и переходить к следующему ключу в памяти микроконтроллера. Если найдено совпадение всех четырех байт ключа, то прекращаем проверку и устанавливаем замок в состояние открыто, иначе оставляем замок запертым. Пройдя эту не хитрую процедуру, мы можем точно сказать разрешен данному ключу доступ или нет, а заодно является ли он мастер ключом. Ведь мы будем знать номер совпавшего ключа в памяти Arduino следовательно, если он первый (на самом деле нулевой), то это волшебный ключ. Чтобы добавить новый ключ в память замка необходимо поднести и удерживать у RFID (NRF) сканера мастер ключ. Для начала будет открыта дверь, чтобы впустить владыку в обитель. Но если мастер ключ удерживается в течение 5 секунд (по умолчанию), то замок переводится в постоянно открытое состояние и система распознавания ключей, описанная ранее, начинает работать как проверка наличия ключа в памяти. Ключа нет, тогда записываем его. Ключ найден, значит, ругаемся, плюемся и топаем ногами. Таким образом, можно добавлять ключи пачками. Для выхода из режима программирования необходимо поднести ключ владыки и удерживает его 5 секунд. Для очистки памяти решено ввести красную кнопку с защитой от ложного нажатия. Если удерживать её в течение 5 секунд, то контроллер начинает перезапись EEPROM одними нулями. По окончанию операции производится перезапуск программы микроконтроллера. Но теперь нет ни единого ключа, следовательно, и мастера тоже. Непорядок! В этом безмятежном состоянии замок стоит держать постоянно открытым иначе "Се Ля Ви", что в переводе с древнегреческого "не повезло"! Первый поднесенный к сканеру ключ будет записан в память Arduino и станет мастером т.к его порядковый номер - 0. Следом за этим замок перестанет бездельничать и перейдет в состояние закрыто. С этого момента помещение считается святым, и проникнуть в него может только обладатель единственного записанного в память ключа. Для всех остальных нужно начать процедуру добавления ключей, но её мы уже придумали. Открытие двери изнутри по нажатию на волшебную кнопку поначалу показалось мне тривиальной задачей, и я добавил этот механизм простым способом (как и кнопку очистки памяти) - ногу микроконтроллера посадил через резистор на землю, а сама кнопка коммутировала на эту же ногу +5V. Все дешево и сердито, но вся соль кроется в деталях! Кнопок открытия двери будет несколько. Все они должны сидеть параллельно и самая дальняя будет расположена как минимум в 15, а то и больше, метрах от контроллера (если мерить длинной кабеля)! Это расстояние смело можно умножать на 2 и получить нереальную для +5V цифру. Необходимо пересадить ногу Arduino с GND на +5V (через резистор 10k), предварительно задействовать встроенный подтягивающий резистор микроконтроллера, а сама кнопка станет прижимать ногу к земле. Резистор между ногой и питанием необходим для избегания короткого замыкания при использовании самой кнопки. Управление электромагнитом, по понятным и так причинам, происходит через реле. Электромагнит подключен через постоянно замкнутую группу контактов и соответственно при открытии замка, на реле подается логическая единица. Это удобно т.к не приходится постоянно держать реле под напряжением, но есть и обратная сторона медали – если нет питания на контроллере, а на электромагните есть, ты открыть замок станет очень проблемной задачей. В общем, Вам самим выбирать какой из подводных камней оставить. Я свой выбор сделал. Схема подключения - РАСПИНОВКА ---------------------------------------------------------------------------- MFRC522 Arduino Arduino Arduino Arduino Arduino Reader/PCD Uno Mega Nano v3 Leonardo/Micro Pro Micro Signal Pin Pin Pin Pin Pin Pin ----------------------------------------------------------------------------------------- RST/Reset RST 9 5 D9 RESET/ICSP-5 RST SPI SS SDA(SS) 10 53 D10 10 10 SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16 SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14 SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15 ----------------------------------------------------------------------------------------- Оставлю дополнительные фото для наглядности. На самом деле, если вы будите внедрять подобное где-то в обиходе, а не просто собирать на столе, то обязательно все документируйте и перепроверяйте по несколько раз. Для быстрого монтажа я использовал плату для прототипирования. Цена на неё довольно завышена у братьев Китайцев, но я не пожалел. Перед установкой всего это добра на заслуженное рабочее место проводились испытания различных кабелей для выноса рабочей части (RFID сканера) за стену. В итоге выбор остановился на медной, многожильной витой паре используемой для прокладки Ethernet. Если использовать одножильную (моно) витую пару, то потери могут быть довольно высоки, как и с использованием различных Китайских (якобы медных) шлейфов. Гарантию работы, а соответственно и Вашего попадания в помещение, сможет гарантировать лишь страховой полис. Сам сканер был помещен в крышку от металлической коробки и закрыт стеклотекстолитом, естественно НЕ фольгированным! Полученный результат показался мне довольно сносным и был передан заказчику для установки. Для питания был задействован компьютерный блок питания, с которого, через стабилизатор напряжения 12v в 8v для запитки Arduino UNO через стандартный 5,5мм разъем. Фото монтажа За дверью все выглядит очень скромно. Т.к. сканер находится в просторном корпусе, то на него была прикреплена кнопка для электронного звонка. Довольно эстетически приятный вид, для промышленного помещения. Программная часть Вам понадобятся следующие библиотеки: RFID-RC522 (NRF) Bounce2 (избавляет от дребезга контактов при нажатии кнопок) Хотите помочь проект? Yandex.Money PayPal.me Сам скетч Все довольно плотно закомментировано, но есть большой фронт для доработки. Надеюсь, Вы дополните это создание своими идеями и нужным функционалом, а я в свою очередь уже присмотрел идеи для будущего обновления и заказал новый модуль RC522 для теста. PS: Желаю Вам приятного и надеюсь полезного использования.
  2. 1 балл
    А что если раз мы взялись за мускул и уж у нас теперь замок такой умный не взять и не написать скетч заново основываясь именно на доступ в сеть ? Хорошая идея скрестить с погодной станцией и предупреждать человека при выходе из дома не забыть зонтик ?
  3. 1 балл
    В продолжение темы будем пробовать подружить Arduino + RFID ридер MFRC522 c Ethernet и MySQL базой данных, в которой будут храниться наши ключи. Автором идеи является svchekalin. Это первый вариант реализации СКУД на Arduino с использование БД, уверен, что в дальнейшем получится значительно улучшить работу программы. Первым делом необходимо озаботиться созданием самой базы для ключей. Подразумевается, что раз Вас интересует вопрос хранения ключей не в EEPROM, а во внешней СУБД, то Вы имеете представление о MySQL, работе с ней и сам сервер базы данных у Вас имеется. Я не буду описывать тут процесс его установки и настройки т.к. эта тема не для этого раздела. Создадим базу данных с именем "test" и добавим в ней таблицу с именем rc522 со следующей схемой: CREATE TABLE IF NOT EXISTS `rc522` ( `uid` bigint(12) NOT NULL, `type` enum('0','1','2') NOT NULL DEFAULT '2', `description` varchar(250) DEFAULT NULL, UNIQUE KEY `uid` (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; uid - содержит id ключа type - тип ключа. Может быть один из трех вариантов: 0 - ключ в базе, но деактивирован, 1 - мастер ключ, 2 - обычный ключ description - поле не используется в работе замка. Подразумевается, что в дальнейшем будет использоваться некая web форма для работы с ключами, и данное поле будет содержать некое описание, например ФИО владельца ключа. Первый ключ необходимо добавить самостоятельно. Код ключа можно узнать из консоли при попытки открыть замок. iT4iT CLUB (C) 2015 https://it4it.club Connected to server version 5.5.47-0+deb7u1 KEY: 3177510 access dany Disconnected. Чтобы добавить ключ 3177510 в базу и сделать его мастером необходимо выполнить SQL запрос: INSERT INTO `rc522` (`uid`, `type`) VALUES (3177510, '1'); База и таблица созданы, мастер ключ добавлен, переходим к монтажу электронной части. Я использовал Arduino UNO c Ethernet Shield на чипе W5100 (если Вы хотите подвязать ENC28J60, сразу советую отказаться от этой идеи). Сам шилд и библиотека Ethernet.h используют заранее определенные контакты SPI шины, это: 13 - SCK 12 - MISO 11 - MOSI 10 - SS В тоже время RFID сканер MFRC522 тоже использует SPI шину, и чтобы он чувствовал себя не ущемленным в правах, необходимо его пины SS и RST перенести: 13 - SCK 12 - MISO 11 - MOSI 9 - SS 8 - RST Все это дело будет выглядеть следующим образом. Переходим к скетчу. Для его работы понадобятся следующие дополнительные библиотеки: RFID-RC522 (NRF) Bounce2 (избавляет от дребезга контактов при нажатии кнопок) MySQL Connector (реализует работу с базой данных) Сам скетч Сразу хочу уточнить некоторые моменты. В программе Вам необходимо указать имя пользователя и пароль к MySQL серверу. Пользователь должен обладать достаточными правами для доступа к созданной в начале статьи базе. Также не забудьте указать IP адрес самого сервера в Вашей локальной сети. IPAddress server(10, 10, 10, 254); // IP адрес MySQL сервера char user[] = "login"; // MySQL username char password[] = "password"; // MySQL password Если Вы решили изменить имя базы или таблицы на какие-нибудь другие, то необходимо отредактировать константы, содержащие SQL запросы. const char QUERY_S[] = "SELECT type FROM test.rc522 WHERE uid = %s;"; const char QUERY_I[] = "INSERT INTO test.rc522 (uid) VALUES ('%s');"; Как видите, имя базы и таблицы указаны через разделитель точку ".", и в данном примере база имеет имя test а таблица rc522, что соответствует записи test.rc522 Алгоритм работы схож с предыдущими вариантами замка, за исключением того, что EEPROM в данной версии не используется. Соответственно и мастер ключ самостоятельно не создается, именно поэтому мы добавили его в базу руками. Связь с базой и последующая обработка ответа происходит с некоторой задержкой, это связано с производительностью контроллера, особенностями работы библиотеки, самой программы и т.д и т.п. В моем случае, время с момента начала считывания метки до реакции на неё занимало до 3 сек. Плюс ко всему, из-за определенных обстоятельств, MySQL сервер пришлось поднимать на Raspberry PI, а это далеко не лучший вариант для СУБД. В данный момент на одну аутентификацию метки требуется создать одно подключение и один запрос, это тоже увеличивает время реакции. Можно устанавливать соединение с базой при подачи питания на Arduino и просто клепать запросы. Такой вариант уменьшит время реакции в два раза, НО есть ложка дегтя в этой бочке. Если по каким либо причинам связь с сервером будет прервана (а оно так и будет, т.к. 100% гарантию дает только страховой полис), то контроллер зависнет при попытке выполнить заброс к БД. Проснуться он сможет только с помощью сторожевого таймера. В общем, этот момент еще будет проработан в следующих версиях замка. Думаю, что с нормальной СУБД время реакции уменьшится до 2 сек. Для входа в режим программирования необходимо, после того как замок разблокируется, удерживать мастер ключ еще 5 секунд у RFID сканера. Произойдет звуковой сигнал, а замок откроется, и будет находиться в таком состоянии пока Вы не выйдите из режима программирования (повторно удерживаем мастер ключ у сканера до звукового сигнала). В режиме программирования, как и в предыдущих версиях замка, все новые ключи будут записаны в MySQL. Все действия по-прежнему сопровождаются отчетами в Serial мониторе. Вот пример с попытками добавить существующий ключ в базу и добавлением нового ключа. IP: 10.10.10.97 # <- IP адрес полученный от DHCP сервера iT4iT CLUB (C) 2015 https://it4it.club Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 26214177213 # <- ID текущего ключа у RC522 сканера access allow # <- Доступ разрешен (ключ в базе с меткой 1 - мастер) Disconnected. # <- Отключаемся от сервера * closed lock # <- Замок автоматически закрылся, НО КЛЮЧ ВСЕ ЕЩЕ У СКАНЕРА! MASTER PROGRAMMING MODE ON # <- После 5сек. Вход в режим программирования. Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 204641111 # <- ID текущего ключа у RC522 сканера error: key elrady exists in eeprom # <- ID ключа уже прописан на сервере <!> Disconnected. # <- Отключаемся от сервера Connected to server version 5.5.47-0+deb7u1 # <- Поднесен новый ключ. Подключаемся к MySQL серверу KEY: 3177510 # <- ID текущего ключа у RC522 сканера add key in MySQL # <- ID ключа не найден в СУБД. Arduino завписывает новый ключ в базу. Disconnected. # <- Отключаемся от сервера Connected to server version 5.5.47-0+deb7u1 # <- ID текущего ключа у RC522 сканера KEY: 26214177213 # <- ID ключа найден в СУБД (ключ в базе с меткой 1 - мастер) Disconnected. # <- Отключаемся от сервера MASTER PROGRAMMING MODE OFF # <- Выходим из режима программирования PS: На данный момент это полностью рабочий вариант и отличная отправная точка для будущих изменений.
×
×
  • Создать...