- PVSM.RU - https://www.pvsm.ru -

Модель системы контроля и управления доступом на предприятии на базе Arduino

На форумах периодически возникают желающие слепить из arduino starter kit свою СКУД для машины, офиса. По схождению звёзд и при поддержке вдохновения, черпаемого из новостей о Free and open-source software (FOSS), именно этим мы решили заняться в свободное от учёбы время. Описание промежуточного результата работы оформили для подачи заявки на публикацию в почти небезызвестный журнал [1]. Окромя воды и кратких определений составных частей, в нём собрано описание всего необходимого для написания, успешной компиляции и прошивания скетча, управляющего моделью. Заявленная цель работы – создание аналога того, что сейчас на эту тему можно найти на рынке, который был бы конкурентоспособен за счёт низкой цены.

Системы контроля и управления доступом (СКУД) – это эффективная контрольно-пропускная система, которая позволяет управлять безопасностью объекта и осуществлять контроль доступа. Целью работы является демонстрация возможности реализации модели СКУД на базе программно совместимого аналога arduino, которая будет существенно более выгодной в коммерческом плане по сравнению с существующими промышленными аналогами.

Ключевые слова. Безопасность, инженерно-техническая защита информации, защита информации, предохранительные устройства и мероприятия, контроль территории, носимые устройства авторизации, RFID, токен, Arduino.

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

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

RFID

Используемая для реализации системы технология Radio Frequency IDentification (радиочастотная идентификация – РЧИ) — это метод удаленного хранения и получения информации путем передачи радиосигналов с помощью устройств, называемых RFID-метками [Технология 13.56 МГц [2], Принцип работы RFID [3]]. Данная технология является одной из тех, элементами которых являются носимые пользователями систем, построенных на этих технологиях, специальные высокотехнологичные идентификаторы — токены(англ. token).

Использованный нами архитектурный тип метки – «пассивная». Пассивные RFID-метки не имеют встроенного источника энергии. Чип, обеспечивающий работу метки, питается от индуцируемого в антенне сигналом запроса электрического тока.

Таблица 1

Пассивные RFID — метки

Функциональные возможности. Только прочтение/прочтение-запись.
Частота. 125KHz / 13.56MHz / 915 МHz / 2.45GHz прочтение-запись.
Расстояние прочтения. До 6 м + (с установленной антенной).
Размеры. Разные, ~ 0,8 мм в диаметре.
Вес. 6 — 54 гр.
Память. До 16 Kbit.
Срок эксплуатации. 10 лет.
Температурный режим. — 40 до + 70 по Цельсию.

Ниже приведён пример распределения характеристик РЧИ-меток по рабочим частотным диапазонам:

Таблица 2
Классификация RFID по диапазонам частот:

Характеристика Низкие частоты (НЧ, LF) – 125-134 КГц Высокие частоты (ВЧ, HF) – 13,56 МГц Ультра-высокие частоты (УВЧ, UHF) – 860-960 МГц Микроволны (SHF) – 2,4 ГГц
Максимальное расстояние считывания от 3 до 70 см. от 3 до 100 см. от 10 см до 4 м. 2-10 м.
Скорость передачи данных радиометка-считыватель около 9600 бит/сек. до 64 кбит/сек. до 128 кбит/сек. до 128 кбит/сек.
Наличие антиколлизии Есть, но не у всех микросхем. Есть. Есть. Есть.
Объем памяти радиометки 32-1024 байта. 8-16384 байт. 64-1024 бит (ISO), 64 или 96 бит (EPC). от 64 бит до 32 кбит.

Сферы применения RFID

СКУД на основе РЧИ устанавливаются повсюду, где целесообразно оные устанавливать. Это территории, доступ на которые должен предоставляться строго ограниченному кругу лиц. Кроме того, RFID применяются при изготовлении европейских и американских паспортов, различных кредитных карт; в животноводстве, системах охраны автомобилей.

Пользовательский интерфейс системы

Далее описывается сценарий взаимодействия с системой (рис. 1). Сотрудник предприятия или предполагаемый злоумышленник, проходя на контролируемую территорию, предоставляет свою RFID-метку. Модуль системы, отвечающий за получение информации с RFID-метки должен выполнить считывание и проанализировать полученные данные, используя базу данных системы, содержащую соответствия между записями на метках и сотрудниками, которым метки принадлежат. Если предоставленная метка зарегистрирована в базе, то система должна пропустить работника. В ином случае – опционально просигнализировать о неудаче авторизации.

Модель системы контроля и управления доступом на предприятии на базе Arduino - 1
Рис. 1. Модульная диаграмма.

Стрелками указаны пути обмена информацией между компонентами.

Разработка модели

Устройством управления будет выступать плата Arduino с записанной в её контроллер программой. Чтением информации с RFID-метки займётся специальная схема RFID-RC522[Mifare RC522 RFID Модуль [4]], а сигналы о работе модели системы будут подаваться при помощи светодиода и элементарного аудиоустройства (buzzer)[Buzzer Arduino Example Code [5]]. Работу модуля контроля доступа будет исполнять сервомотор SG90 [SG 90 9g Micro Servo [6]].

Arduino

Выбранная в качестве базы для разработки системы платформа Arduino обеспечена разработанным для использования именно с ней ПО[Arduino code tutorials and examples [7]].
Бесплатно распространяющаяся интегрированная среда разработки Arduino IDE 1.0.6 решает задачу удобных написания, компилирования и загрузки управляющего кода.

Для работы с модулем RFID-RC522 была задействована библиотека <MFRC522.h>[Arduino library for MFRC522 [8]]. Использование методов из объявленного в ней класса MFRC522 – это возможность считывания информации с RFID-меток. В данном случае мы определяем «своих» при помощи только uid метки. Это четыре байта, при совпадении которых с записанными будет подаваться сигнал об успешной авторизации и производиться действия, символизирующие предоставление доступа.

Для управления сервомотором понадобилась поставляемая вместе с IDE <Servo.h>, содержащая, кроме прочих, описание класса Servo. Данный класс «подключается» к указываемому по номеру порту и позволяет при помощи предоставляемого им методов attach(int port) и write(int val) выбирать порт для работы с сервомотором и задавать положение ротора сервомотора соответственно.

Модель системы контроля и управления доступом на предприятии на базе Arduino - 2
Рис. 2. Принципиальная схема

Код программы контроллера

/*
	<Программа контроллера модели системы СКУД на Arduino. Использует buzzer, RGBLED и RFID-reader>
	Copyright (C) <2014>  <Ilyin I.I. Zubov Y.M.>
	
	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software Foundation,
	Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
*/

#include <SPI.h>	// стандартная в Arduino IDE библиотека для работы с SPI шиной. Шта? https://ru.wikipedia.org/wiki/Serial_Peripheral_Interface
#include <Servo.h>  // стандартная в Arduino IDE библиотека для управления сервомоторчиком
#include <MFRC522.h> // Хэдер с одноимённым классом для управления РЧИ-читалкой. Шта? https://github.com/miguelbalboa/rfid

// Номера пинов управления РЧИ-читалкой
#define SS_PIN 10
#define RST_PIN 9

const int RGB_LED_PINUMBERS[] = { 5, 6, 7 }; // Номера пинов-выходов для RGB-светодиода
const int SERVO_PINUMBER = 3; // Номер пина управления сервомоторчиком
const int BUZZER_PINUMBER = 4; // номер пина управления пищалкой
const int BUTTON_PINUMBER = 2;     // номер входа, подключенный к кнопке

const int NEW_CARD_CHECK_DELAY = 500; // задержка между проверками поднесённости карты в милисекундах
const int OPEN_CLOSE_DELAY = 3000; // задержка между открытием и закрытием

const byte tehUID[4] = { 0x33, 0xFF, 0x6B, 0x9A }; // tehUID карты, на котороую реагируем положительно

bool buttonState = 0; // переменная для хранения состояния кнопки

enum States { // Состояния контроллера:
	wait, check, open, close
}; States state; // текущее состояние

bool rightCard; // Для запоминания в цикле проверки верности карты, верна ли она
bool white;		// Состояние светодиода(горит ли), пока находимся в состоянии ожидания карты
int pos = 0;	// Положение ротора сервомотора (градусы)

Servo myservo; // Экземпляр Servo для управления сервомотором

MFRC522 mfrc522(SS_PIN, RST_PIN); // Экземпляр MFRC522 для управления РЧИ-ридером.

void setup() {
	Serial.begin(9600);	// Начать общение с компом по последовательному порту
	SPI.begin();			// Инициализация SPI-шины. 
	mfrc522.PCD_Init();	// Инициализация РЧИ-читалки
	myservo.attach(SERVO_PINUMBER);	// Инициализация управляющего сервоприводом объекта с указанием пина для работы

	Serial.println("Scan PICC to see UID and type..."); // разговариваем с портом, ага.

	white = false; // До начала работы светодиод не горит
	state = wait; // Работа начинается с состояния ожидания

	// активируем на выход пины для RGB-лампочки:
	pinMode(RGB_LED_PINUMBERS[0], OUTPUT); // red
	pinMode(RGB_LED_PINUMBERS[1], OUTPUT); // green
	pinMode(RGB_LED_PINUMBERS[2], OUTPUT); // blue

	pinMode(BUZZER_PINUMBER, OUTPUT); // активируем на выход пин для гудка
	pinMode(BUTTON_PINUMBER, INPUT); //активируем пин на вход, ждем кнопку
}


void loop() {
	switch (state){
	case wait:
		Waiting();
		return;
	case check:
		Checking();
		return;
	case open:
		Opening();
		return;
	case close:
		Closing();
		return;
	}
}

void Waiting(){
	delay(NEW_CARD_CHECK_DELAY);

	/// мигаем белым:
	if (!white){
		digitalWrite(RGB_LED_PINUMBERS[0], HIGH);   // зажигаем светодиод
		digitalWrite(RGB_LED_PINUMBERS[1], HIGH);   // зажигаем светодиод
		digitalWrite(RGB_LED_PINUMBERS[2], HIGH);   // зажигаем светодиод
		white = true;
	}
	else{
		digitalWrite(RGB_LED_PINUMBERS[0], LOW);   // зажигаем светодиод
		digitalWrite(RGB_LED_PINUMBERS[1], LOW);   // зажигаем светодиод
		digitalWrite(RGB_LED_PINUMBERS[2], LOW);   // зажигаем светодиод
		white = false;
	}

	// проверяем наличие новой карты:
	if (mfrc522.PICC_IsNewCardPresent())
		state = check;
	// считываем значения с входа кнопки
	buttonState = digitalRead(BUTTON_PINUMBER);
	// проверяем нажата ли кнопка
	// если нажата, то buttonState будет HIGH:
	if (buttonState == HIGH) {
		state = open;
	}
}

void Checking(){
	// Желтеем:
	digitalWrite(RGB_LED_PINUMBERS[0], HIGH);   // зажигаем красный
	digitalWrite(RGB_LED_PINUMBERS[1], HIGH);   // зажигаем зелёный
	digitalWrite(RGB_LED_PINUMBERS[2], LOW);   // тушим синий
	
	// Считываем UID одной из поднесённых карточек
	if (!mfrc522.PICC_ReadCardSerial()) {
		return;
	}
	delay(500);

	rightCard = true; // Забываем о предыдущей проверке
	// Проверяем считанный UID:
	for (byte i = 0; i < 4; i++) {
		if (tehUID[i] != mfrc522.uid.uidByte[i])
			rightCard = false;
	}

	if (rightCard)
		state = open; // Открываемся, если та самая
	else{
		Serial.println("Unknown CARD.");
		digitalWrite(5, HIGH);   // зажигаем светодиод
		digitalWrite(6, LOW);   // тушим светодиод
		digitalWrite(7, LOW);   // тушим светодиод
		digitalWrite(4, HIGH);
		//buzz(4, 7000, 2000); // buzz the buzzer on pin 4 at 2500Hz for 500 milliseconds
		delay(2000); // wait a bit between buzzes
		digitalWrite(4, LOW);

		state = wait; // Ждём другую, если не
	}
}

void Opening(){
	Serial.println("OPEN");
	digitalWrite(RGB_LED_PINUMBERS[0], LOW);
	digitalWrite(RGB_LED_PINUMBERS[1], HIGH); // Зеленеем
	digitalWrite(RGB_LED_PINUMBERS[2], LOW);
	delay(500); // имитируем активную деятельность. Считывание происходит гораздо быстрее. Эта задержка создана для красоты презентации.
	
	ServoOpen();
	state = close;
}

void Closing(){
	delay(OPEN_CLOSE_DELAY);
	digitalWrite(RGB_LED_PINUMBERS[1], LOW); // Обеззелёниваемся
	ServoClose();
	state = wait;
}

// Две процедурки поворота ротора сервы на 180:
void ServoOpen(){
	for (pos = 0; pos <= 180; pos += 1){ // Крутим с нулеградусного положения на противоположное по одному градусу
		myservo.write(pos);              // Говорим серве двигаться на градус далее
		delay(15);                       // 15мс ждём завершения поворота 
	}
}
void ServoClose(){
	for (pos = 180; pos >= 0; pos -= 1){
		myservo.write(pos);
		delay(15);
	}
}

/*
	Программа написана для работы, выполненной из любопытства и, по схождению звёзд, для участия
	в конференции БИП 2014.
	Код распространяется под лицензией GPLv3. На здоровье.
	Текст лицензии: http://www.gnu.org/licenses/gpl-3.0.html
*/

Модель системы контроля и управления доступом на предприятии на базе Arduino - 3
Рис. 3. Внешний вид результата сборки Уроки Fritzing [9]

Видео демонстрация:

Презентация [10]

Подведение итогов

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

Приведённые в таблице цены получены в процессе анализа рынка данных компонентов на момент выполнения работы и признаны авторами «умеренными».

Таблица 3
Список компонентов и цены:

Обозначение Кол-во Тип Свойства Стоимость
LED1 1 RGB LED 4х контактный RGB светодиод с общим анодом 10-20р / шт
R1,R2,R3 3 220Ωрезистор допуск ± 5% сопротивление 220Ω 30р / 50шт
SG1 1 Buzzer 12mm Зуммер 12мм 5р / шт
Часть1 1 Arduino Uno (Rev3) микроконтроллер платы на основе ATmega328 300-400р / шт
Часть 2 1 RFID-RC522 Модуль чтения-записи RFID карт на частоте 13,56 Мгц 250-350р / шт

Вывод

Результатом нашей работы стала модель СКУД, не претендующая на статус прототипа готового коммерческого продукта. Данный программно-аппаратный комплекс не завершен, что делает затруднительным оценку результирующей стоимости нашего устройства. Но уже на основе имеющихся у нас данных можно сказать, что материальные затраты на техническую сторону реализации данной системы (предполагается написание комплекса программных решений, предоставляющих управление ею с помощью ПК), незначительные по сравнению с существующими промышленными аналогами. А труд, приложение которого необходимо для окончательной реализации всей СКУД, является студенческим, то есть бесплатным.

P.S. Для дальнейшего сокращения стоимости СКУД можно использовать touch memory вместо RFID и более дешевый аналог Arduino (Nano).

Автор: veter069

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/arduino/81627

Ссылки в тексте:

[1] журнал: http://www.info-secur.ru/index.htm

[2] Технология 13.56 МГц: http://idcards.ru/materials/technology/skud/hif.php

[3] Принцип работы RFID: http://www.ms-keys.narod.ru/princip_proxi.htm

[4] Mifare RC522 RFID Модуль: http://arduino.ru/forum/apparatnye-voprosy/mifare-rc522-rfid-modul

[5] Buzzer Arduino Example Code: http://www.faludi.com/2007/04/23/buzzer-arduino-example-code/

[6] SG 90 9g Micro Servo: http://datasheet.sparkgo.com.br/SG90Servo.pdf

[7] Arduino code tutorials and examples: http://arduino.cc/en/Tutorial/HomePage

[8] Arduino library for MFRC522: https://github.com/miguelbalboa/rfid

[9] Уроки Fritzing: http://blog.amperka.ru/уроки-fritzing

[10] Презентация: https://drive.google.com/file/d/0B-tk-VyBe4iWVno2QlBrSnVRVHc/view?usp=sharing

[11] Источник: http://habrahabr.ru/post/249693/