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


