На сегодняшний день в сфере безопасности большую популярность завоевали различные системы контроля доступа. Под это громкое название попадает множество устройств, начиная от обычных электрозамков и заканчивая автоматизированными пропускными системами на промышленных предприятиях. Но все они в конечном итоге выполняют одну и ту же функцию – ограничение доступа посторонних лиц к охраняемому объекту.
Углубившись в данную тему, она показалась мне интересной и я, как радиолюбитель-программист микроконтроллеров, решил реализовать нечто подобное на популярной платформе 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.
Что касается скетча, то на его написание и отладку ушло немало времени. Код получился внушительным, и приводить его листинг в тексте статьи, на мой взгляд, не рационально – лучше оставлю ССЫЛКА НА КОД. Со своей стороны я постарался максимально задокументировать все важные моменты, чтобы каждый мог внести что-нибудь от себя при наличии на то желания.
Ну и напоследок небольшой фотоотчёт о работе системы доступа в разных режимах.