Система беспроводного доступа RFID
На сегодняшний день в сфере безопасности большую популярность завоевали различные системы контроля доступа. Под это громкое название попадает множество устройств, начиная от обычных электрозамков и заканчивая автоматизированными пропускными системами на промышленных предприятиях.
На сегодняшний день в сфере безопасности большую популярность завоевали различные системы контроля доступа. Под это громкое название попадает множество устройств, начиная от обычных электрозамков и заканчивая автоматизированными пропускными системами на промышленных предприятиях. Но все они в конечном итоге выполняют одну и ту же функцию – ограничение доступа посторонних лиц к охраняемому объекту.
Углубившись в данную тему, она показалась мне интересной и я, как радиолюбитель-программист микроконтроллеров, решил реализовать нечто подобное на популярной платформе Arduino. Из имеющихся в наличии компонентов были выбраны следующие:
-
LCD-дисплей 16х2 с I2C-интерфейсом;
-
Пьезоэлектрический излучатель (буззер).
После того, как весь вышеуказанный перечень был подготовлен, наступило время кропотливой работы над техническим заданием. Без него работа над системой контроля доступа затянулась бы на неопределённое время, а может быть и вовсе не завершилась.
Техническое задание
После подачи питания, устройство оповещает пользователя о готовности к работе, издавая характерный звуковой сигнал. Модуль реле, с помощью которого планируется управлять электрозамком, находится в обесточенном состоянии. На дисплее в течение трёх секунд высвечивается надпись:
По истечении этого времени, стартовая надпись пропадает, и устройство переходит в рабочий режим. Система контроля доступа поддерживает два основных режима: рабочий и режим администратора. Последний служит для регистрации новых карт и смены паролей.
1.1. Рабочий режим
В рабочем режиме пользователю предлагается приложить к терминалу RFID-карту или ввести пароль на матричной клавиатуре. Об этом говорит соответствующая надпись на дисплее:
Ввод пароля осуществляется нажатием цифр на матричной клавиатуре с последующим подтверждением или отменой. Для подтверждения ввода используется клавиша [#], а для отмены – клавиша [*].
Если к терминалу приложена зарегистрированная в системе карта или введён правильный пароль, устройство издаёт характерный звук и на реле управления электрозамком подаётся питание в течение 1-9 сек. (настраивается в меню). На дисплее выводится информация об успешном доступе к объекту и остаток времени открытого состояния замка.
В случае, когда пароль введён неверно или определён RFID-ключ, который отсутствует в базе данных, устройство выводит мигающую информацию об ошибке доступа с соответствующим звуковым сопровождением.
1.2 Режим администратора
Данный режим предназначен для удаления или добавления новых RFID-карт в энергонезависимую память Arduino, смены паролей и настройки некоторых рабочих параметров. Чтобы войти в меню администратора, необходимо ввести в рабочем режиме специальный пароль на матричной клавиатуре и нажать клавишу [#]. По умолчанию пароль представляет последовательность цифр 1234567, но в дальнейшем может быть изменён на свой собственный.
Итак, меню администратора состоит из 4-х пунктов, изображение которых представлены ниже.
Как видно из вышеприведенных примеров, навигация по пунктам меню вверх и вниз осуществляется нажатием клавиш [А] и [В]. Вход в выбранное подменю происходит при нажатии [#], а выход на верхний уровень – нажатием [*].
1.2.1. Подменю редактирования RFID-карт «EDIT RFID DATA»
При переходе в данное подменю пользователю предоставляется возможность добавления, замены или редактирования RFID-ключей в базе данных устройства. Всего в базу можно занести до 30 уникальных кодов ключей (при необходимости это число можно увеличить). Для перелистывания списка используются клавиши [А] и [В]. На дисплее пользователь видит следующую информацию:
В левой верхней части показан порядковый номер ячейки, связанный с энергонезависимой памятью Arduino. Напротив порядкового номера ячейки указан код привязанной карты (обозначен красным цветом). Если ячейка пустая, то вместо кода выводиться надпись «empty», как показано ниже:
Нажимая кнопку [#], пользователь может произвести три манипуляции с выбранной ячейкой, а именно: добавить в неё ключ или заменить существующий, очистить ячейку, оставить всё без изменений. В этом ему поможет следующий экран с подсказками:
Если принято решение добавить/зарегистрировать, то после нажатия кнопки [А] издаётся звуковой сигнал, система ожидает поднесения карты-ключа к приёмному терминалу, о чём говорит соответствующее изображение на дисплее:
На обнаружение карты отводится 5 секунд, по истечение которых будет выведено сообщение об успешной или неуспешной регистрации.
Удаление карты из ячейки базы сопровождается кратковременным сообщением «CARD DELETED». Таким образом, описанные выше манипуляции с конкретной ячейкой <01> аналогично применимы для всех остальных ячеек.
1.2.2. Подменю смены пароля доступа «ACCESS PASWORD»
Подменю предлагает ввести новый пароль доступа к объекту, т.е. тот пароль, с помощью которого можно будет открыть электрозамок. Соответствующее меню показано ниже.
По аналогии с предыдущими пунктами, для подтверждения ввода используется клавиша [#], а для отмены – клавиша [*].
1.2.3. Подменю смены пароля администратора «ADMIN PASSWORD»
Здесь всё аналогично предыдущему пункту, только меняется пароль, позволяющий войти в меню администратора.
1.2.4. Подменю установки времени открытого замка «SET OPEN TIME».
В этом пункте меню пользователь может задать время, в течение которого замок будет удерживаться в открытом состоянии после поднесения зарегистрированной карты или вводе правильного пароля. Интерфейс выглядит следующим образом.
Установка времени возможна в пределах от 1 до 9 секунд и задаётся нажатием соответствующей цифры на матричной клавиатуре. Подтверждение – клавиша [#], отмена – клавиша [*].
Итак, все пункты тщательно проработаны и задана конкретная функция каждого из них. Но перед тем, как двигаться дальше, неплохо было бы составить целостную карту меню с отражением всех взаимосвязей между его подпунктами. Карта будет служить своеобразной шпаргалкой при составлении программного обеспечения для системы контроля доступа.
Схемное решение
После определения с техническим заданием, можно приступить к соединению всех компонентов схемы в единое устройство. Для этого следует учесть некоторые особенности модулей, которые планируется использовать в схеме.
Первым делом обращаем внимание на модуль RFID-приёмника RC-522. Он работает по SPI-протоколу и, следовательно, должен взаимодействовать с чётко определёнными выводами Arduino Nano, на которые завязан аппаратный SPI. Согласно документации на плату имеем следующую картину:
Выводы MISO, MOSI и SCK являются постоянными и не могут быть переопределены. Выводы SS и RST могут цепляться к любым пинам Arduino Nano, а их номера должны быть прописаны в скетче.
Второй момент, на который необходимо обратить внимание – это дисплей, работающий по протоколу I2C. Для платы Arduino Nano шина I2C выведена на A4(SDA) и A5(SCL), как показано ниже.
Остальные элементы схемы (клавиатура, буззер и модуль реле) потребуют ещё 10 пинов микроконтроллера. Из вышеприведенного рисунка видно, что выбранная плата Arduino способна целиком удовлетворить эту потребность.
В итоге, после учета всех необходимых потребностей, у меня получилась следующая схема:
Обратите внимание, что приёмник RC-522 необходимо питать напряжением 3.3V, чтобы не вывести его из строя. Реле, предназначенное для открытия электрозамка, управляется логическим уровнем 5V. На практике встречаются 12-вольтовые релейные модули, так что этот момент тоже следует учитывать. Излучатель звука – пьезоэлектрический, без встроенного звукового генератора. Использование обычного динамика с большой долей вероятности спалит выход А1 платы Arduino Nano. Советую уделить внимание всем вышеперечисленным моментам, чтобы максимально исключить возможные неприятности.
В собранном виде электросхема выглядит следующим образом:
В качестве RFID-ключей будут использованы пластиковые карты, которые шли в комплекте с модулем RC-522.
Где приобрести Arduino модули и датчики? Купить модули Arduino можно в нашем магазине 3DIY с доставкой по всей России!
Программирование
Перед тем, как окунуться с головой в составление программного кода, я решил уделить немного времени вопросу организации данных в энергонезависимой памяти Arduino Nano. Как следует из технического задания, мы должны иметь возможность хранить в EEPROM данные следующего характера:
-
Уникальные идентификаторы ключей доступа в количестве 30 штук;
-
Пароль доступа, при вводе которого замок должен открываться;
-
Пароль администратора для входа в меню настроек;
-
Время, в течение которого замок будет удерживаться в открытом состоянии;
-
Уникальный идентификатор первичного запуска программы.
3.1. Уникальные идентификаторы RFID-ключей
Как известно, каждая RFID-метка содержит свой уникальный идентификатор (UID), который состоит из 4-х байт. Именно эти данные будут записываться в EEPROM при регистрации ключа, и извлекаться оттуда для сравнения при попытке открытия замка картой. Я решил, что помимо 4-х байтного UID буду дописывать спереди ещё один байт как признак пустой или занятой строки, отведённой в базе данных под карту. Итого, структура одной записи конкретного ключа будет представлять собой последовательность из 5 байт данных. Ниже представлена карта EEPROM, где наглядно показано к каким физическим адресам памяти будут привязаны данные о всех RFID-ключах в системе:
Номер ключа или строки |
Адрес в EEPROM |
||||
Признак регистрации ключа в базе данных (1-ключ зарегистрирован; 0-ячейка не занята) |
Уникальный UID |
||||
Ключ №0 |
0000 |
0001 |
0002 |
0003 |
0004 |
Ключ №1 |
0005 |
0006 |
0007 |
0008 |
0009 |
Ключ №2 |
0010 |
0011 |
0012 |
0013 |
0014 |
Ключ №3 |
0015 |
0016 |
0017 |
0018 |
0019 |
Ключ №4 |
0020 |
0021 |
0022 |
0023 |
0024 |
Ключ №5 |
0025 |
0026 |
0027 |
0028 |
0029 |
Ключ №6 |
0030 |
0031 |
0032 |
0033 |
0034 |
Ключ №7 |
0035 |
0036 |
0037 |
0038 |
0039 |
Ключ №8 |
0040 |
0041 |
0042 |
0043 |
0044 |
Ключ №9 |
0045 |
0046 |
0047 |
0048 |
0049 |
Ключ №10 |
0050 |
0051 |
0052 |
0053 |
0054 |
Ключ №11 |
0055 |
0056 |
0057 |
0058 |
0059 |
Ключ №12 |
0060 |
0061 |
0062 |
0062 |
0064 |
Ключ №13 |
0065 |
0066 |
0067 |
0068 |
0069 |
Ключ №14 |
0070 |
0071 |
0072 |
0073 |
0074 |
Ключ №15 |
0075 |
0076 |
0077 |
0078 |
0079 |
Ключ №16 |
0080 |
0081 |
0082 |
0083 |
0084 |
Ключ №17 |
0085 |
0086 |
0087 |
0088 |
0089 |
Ключ №18 |
0090 |
0091 |
0092 |
0093 |
0094 |
Ключ №19 |
0095 |
0096 |
0097 |
0098 |
0099 |
Ключ №20 |
0100 |
0101 |
0102 |
0103 |
0104 |
Ключ №21 |
0105 |
0106 |
0107 |
0108 |
0109 |
Ключ №22 |
0110 |
0111 |
0112 |
0113 |
0114 |
Ключ №23 |
0115 |
0116 |
0117 |
0118 |
0119 |
Ключ №24 |
0120 |
0121 |
0122 |
0123 |
0124 |
Ключ №25 |
0125 |
0126 |
0127 |
0128 |
0129 |
Ключ №26 |
0130 |
0131 |
0132 |
0133 |
0134 |
Ключ №27 |
0135 |
0136 |
0137 |
0138 |
0139 |
Ключ №28 |
0140 |
0141 |
0142 |
0143 |
0144 |
Ключ №29 |
0145 |
0146 |
0147 |
0148 |
0149 |
Из вышеприведенной таблицы видно, что данные о всех ключах доступа (30шт.) будут храниться в диапазоне адресов 0-149. Не так уж и много, учитывая то, что Arduino Nano может предоставить в наше распоряжение 1024 ячейки энергонезависимой памяти.
3.2. Пароль доступа и пароль администратора
Ранее для себя я определился, что длина того или иного пароля будет составлять 7 цифр, что эквивалентно 7 байтам данных. Ввиду того, что пароли могут быть изменены посредствам меню администратора, их также следует хранить в EEPROM, чтобы не потерять при отключении питания. Пользуясь предыдущим опытом составления карты памяти для RFID-ключей, выполню аналогичную работу, только для этих двух паролей. Соответствующая таблица приведена ниже:
Пароль |
Адрес в EEPROM |
||||||
Доступ |
0150 |
0151 |
0152 |
0153 |
0154 |
0155 |
0156 |
Админ |
0157 |
0158 |
0159 |
0160 |
0161 |
0162 |
0163 |
Таким образом, получаем, что пароль для доступа будет храниться в диапазоне адресов 150-159, а пароль администратора в диапазоне 157-163.
3.3. Время, в течение которого замок будет удерживаться в открытом состоянии.
Напомню, что при наборе правильного пароля или поднесения зарегистрированного ключа к терминалу должно срабатывать реле открытия электрозамка. Это реле в течение некоторого времени должно быть под током, чтобы дать возможность не спеша открыть дверь. Вышеуказанный параметр настраивается в меню администратора и может лежать в диапазоне 1-9 сек. Следовательно нам потребуется ещё одна ячейка в памяти EEPROM.
Параметр |
Адрес в EEPROM |
Время удержания реле электрозамка |
0164 |
3.4. Уникальный идентификатор первичного запуска программы
Этот параметр необходим для того, чтобы программа отличала самый первый запуск от всех последующих. Дело в том, что при первом запуске мы должны инициализировать EEPROM значениями по умолчанию, так как в ней пока ничего нет. Последующие запуски не должны больше изменять энергонезависимую память, так как в процессе работы пользователь мог там что-либо сохранить на своё усмотрение. Пусть адрес, по которому разместиться этот флаг будет равен 500.
Параметр |
Адрес в EEPROM |
Признак первичного запуска программы |
0500 |
3.5. Библиотеки и код.
После составления карты энергонезависимой памяти, остаётся всего один шаг до написания программы. Этот шаг заключается в скачивании и установке нескольких библиотек, которые в значительной степени упростят разработку скетча и сделают его более читаемым. Итак, библиотеки понадобятся следующие:
-
New-LiquidCrystal-master. Позволяет работать с LCD-дисплеем по шине I2C.
-
Keypad-master. Для удобной работы с матричной клавиатурой.
-
rfid-master. Библиотека служит для работы с RFID-модулем RC-522.
Что касается скетча, то на его написание и отладку ушло немало времени. Код получился внушительным, и приводить его листинг в тексте статьи, на мой взгляд, не рационально – лучше оставлю ССЫЛКА НА КОД. Со своей стороны я постарался максимально задокументировать все важные моменты, чтобы каждый мог внести что-нибудь от себя при наличии на то желания.
Ну и напоследок небольшой фотоотчёт о работе системы доступа в разных режимах.