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

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

Системи контролю та управління доступом (СКУД) — це ефективна контрольно-пропускна система, яка дозволяє управляти безпекою об'єкта і здійснювати контроль доступу. Метою роботи є демонстрація можливості реалізації моделі СКУД на базі програмно сумісного аналога arduino, яка буде істотно більш вигідною в комерційному плані порівняно з існуючими промисловими аналогами.

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

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

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

RFID

Використовувана для реалізації системи технологія Radio Frequency IDentification (радіочастотна ідентифікація — РЧИ) — це метод віддаленого зберігання та отримання інформації шляхом передачі радіосигналів з допомогою пристроїв, званих RFID-мітками [Технологія 13.56 МГц, Принцип роботи RFID]. Дана технологія є однією з тих, елементами яких є носяться користувачами систем, побудованих на цих технологіях, спеціальні високотехнологічні ідентифікатори — токени(англ. token).

Використаний нами архітектурний тип мітки — «пасивна». Пасивні RFID-мітки не мають вбудованого джерела енергії. Чіп, що забезпечує роботу мітки, живиться від індукована в антені сигналом запиту електричного струму.

Таблиця 1

Пасивні RFID — мітки
Функціональні можливості. Тільки прочитання/прочитання-запис.
Частота. 125KHz / 13.56 MHz / 915 МHz / 2.45 GHz прочитання-запис.
Відстань прочитання. До 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-мітки повинен виконати зчитування та проаналізувати отримані дані, використовуючи базу даних системи, що містить відповідності між записами на мітках і співробітниками, яким мітки належать. Якщо надана мітка зареєстрована у базі, то система повинна пропустити працівника. В іншому випадку — опціонально просигналізувати про невдачу авторизації.


Рис. 1. Модульна діаграма.

Стрілками вказані шляхи обміну інформацією між компонентами.

Розробка моделі

Пристроєм управління буде виступати плата Arduino з записаною в її контролер програмою. Читанням інформації з RFID-мітки займеться спеціальна схема RFID-RC522[Mifare RC522 RFID Модуль], а сигнали про роботу моделі системи будуть подаватися за допомогою світлодіода і елементарного аудіопристрої (buzzer)[Buzzer Arduino Example Code]. Роботу модуля контролю доступу буде виконувати сервомотор SG90 [SG 90 9g Micro Servo].

Arduino

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

Для роботи з модулем RFID-RC522 була задіяна бібліотека <MFRC522.h>[Arduino library for MFRC522]. Використання методів з оголошеного в ній класу MFRC522 — це можливість зчитування інформації з RFID-міток. В даному випадку ми визначаємо «своїх» за допомогою тільки uid мітки. Це чотири байти, при збігу яких з записаними буде подаватися сигнал про успішної авторизації і здійснюватися дії, які символізують надання доступу.

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


Рис. 2. Принципова схема

Код програми контролера
/*
<Програма контролера моделі системи СКУД на Arduino. Використовує buzzer, RGBLED і RFID-reader>
Copyright © <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
*/



Рис. 3. Зовнішній вид результату складання Уроки Fritzing

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



Презентація

Підбиття підсумків

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

Наведені в таблиці ціни отримані в процесі аналізу ринку даних компонентів на момент виконання роботи і визнані авторами «помірними».

Таблиця 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).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.