Система контроля доступа

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Добрый день.

Хочу создать систему контроля доступа на 5 дверей.

Сейчас есть один контроллер который подключен к компьютеру. RFID считывает номер карты, номер карты обрабатывает Arduino Uno и отдает на комп, программа идентифицирует карту и дает команду открывать замок или нет. Минус такой реализации в том, что если комп выключен, завис ну или отвалился порт, то в кабинет никто не войдет, приходится лезть за потолок и выключать магнит.

Номера карт хочу хранить в EEPROM, для этого хочу использовать микросхему памяти, а не память самой ардуины.

Для заливки номеров карт хочу все ардуины соединить по RS485

И так, что  у меня есть:
1. Arduino Nano которую собераюсь использовать как мастер - 2$ за шт. Плюс гальваническую развязку между Arduino и RS485. (сейчас этим занимаюсь)

2. Arduino Pro Mini контроллер на месте - 1.6 $ за шт.

3. UART RFID-считыватель 125 кГц RDM6300 - 3$ за шт. Счытывател без корпуса, но к счастью у меня есть подходящие корпуса.

4. RS485 to UART переходник - 0.5$ за шт.

5. UPS 12v 2A. безперебойный блок питания на 12 вольт, аккумулятор и корпус - 30$ за комплект.

6. Магнитные замки - 20$ за шт.

7. Плюс расходники (провода, кнопки, реле и т.д.) еще 50$ - 70$

Итого: ~350$

Готовое решение стоит порялка 1 500 - 2 000$.

С электронникой я дружу, с программрованием на С# тоже чуть-чуть (по крайней мере для первого проэкта програмку общения с контроллером написал), а вот с С++ не очень.

Основные вопросы:

1. Есть наброски протокола общения программы с контроллерами, но не знаю как наладить общение между мастером и контроллерами, а также идентификацию контроллера.

2. Как работать с ЕЕПРОМ? как записать данные (номера карт), а потом искать в памяти карту для идентификации?

Так, что кто может помочь с решением задачи, буду рад услышать (прочитать).

А может кому-то интересно, есть замечания и предложения, присоеденяйтесь.

vvadim
Offline
Зарегистрирован: 23.05.2012

а почему дуня на месте не может открыть дверь без компа

MaxShadow
Offline
Зарегистрирован: 13.04.2015

vvadim пишет:

а почему дуня на месте не может открыть дверь без компа

Потому как нужно идентифицировать карту.

Карту могут потерять, у некоторых ограничение по времени на вход (виход у всех по кнопке).

А каждый раз перешивать дуню не фен-шуй.

MaxShadow
Offline
Зарегистрирован: 13.04.2015

а с ЕЕПРОМ я еще не разобрался

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

MaxShadow, о каком количестве карт идет речь? Может оказаться, что с EEPROM будет слишком медленно.

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

MaxShadow
Offline
Зарегистрирован: 13.04.2015

до 100 штук

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Карты с разных партий и разных типов.

Раньше была одна карта которая забита в лоб, но ее удачно потеряли. А до этого чато забывали в кабинете

А ехать через ввесь город заливать сново дуню времени нет.

Хочу заливать в память по аналогии с нормальными СКД.

Вопрос с опросом контроллера по логам пока не стоит.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

MaxShadow пишет:
1. Есть наброски протокола общения программы с контроллерами, но не знаю как наладить общение между мастером и контроллерами, а также идентификацию контроллера.

Постоянный опрос контроллеров мастером. Потеря связи = переход в offline режим. Каждому контроллеру нужно присвоить уникальный номер, в случае с 5 шт проще прописать прямо в коде. Предусмотри световую и звуковую индикацию. Предусмотри разные режимы работы для online и offline.

MaxShadow пишет:
2. как записать данные (номера карт), а потом искать в памяти карту для идентификации?

Раскидай карты в EEPROM по блокам в соответствии с остатком от деления номера на 256 или 128.

MaxShadow
Offline
Зарегистрирован: 13.04.2015

1.

Запись номеров карт в еепром самого контроллера (ардуины про мини, а не мастера) для тогого, чтобы контроллеры были автономны и могли свободно работать в офлайн режиме. Мастер служит как преобразователь USB - UART - RS485, и на мастер подключен считыватель для вноса карт в базу.

Для RS485 взял DO, D1, D2

Для считывателя SoftSerial D3,D4 (может кто подскажет как можно использовать только RX без TX, потому как ТХ для считывателя не нужен)

На D5 пишалка (Один длинный открыто, два кототких закрыто)

На D6 и D7 двухцветный светодиод (красный и зеленый) ожидание - мигает желтый (два вместе), открыто - горит зеленый, закрыто - горит красный

2.

С еепром у меня получилось по адресу записать значение и считать.

К тому же я хочу хранить не только номер карточки но и его права: можно или нельзя проходить в эту дверь. и доступ когда дверь заблокированна (предусмотрено открытие или блокировка двери удаленно с программы)

получается в памяти надо хранить строку в виде '12345678910;F', а при считывании карты искать карту в памяти и если она там есть то проверять права

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

MaxShadow пишет:
Запись номеров карт в еепром самого контроллера (ардуины про мини, а не мастера) для тогого, чтобы контроллеры были автономны и могли свободно работать в офлайн режиме.
Терзают меня смутные сомнения EEPROM МК будет мала для 100 карт. Если это mega168 - то всего 512 байт. Если карта 37 бит, то уже 5 байт на номер + права доступа 1 байт.

MaxShadow пишет:
получается в памяти надо хранить строку в виде '12345678910;F', а при считывании карты искать карту в памяти и если она там есть то проверять права
Основной вопрос это быстрый поиск карты. Для этого карты раскидывают по остатку от деления на какое либо число, например на 256. Получив номер карты берем младший байт номера (это и есть остаток от деления на 256). Лезем в соответствующий блок в EEPROM, там лежат несколько номеров карт, находим нашу, берем её права доступа, лезем в таблицу прав доступа. В этой таблице лежат интервалы времени, когда доступ разрешен, проверяем время, открываем замок. Вот как-то так.

MaxShadow пишет:
Для считывателя SoftSerial D3,D4 (может кто подскажет как можно использовать только RX без TX, потому как ТХ для считывателя не нужен)
Интерфейс у считки случаем не wiegand?

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Andy Интерфейс у считки случаем не wiegand?

Нет, UART, заказал с китая и вмонтировал в плоский корпус

Я хочу использовать внешнюю память 24 микросхему, в наличии есть 24С16 это 16К

MaxShadow
Offline
Зарегистрирован: 13.04.2015

Andy

Основной вопрос это быстрый поиск карты. Для этого карты раскидывают по остатку от деления на какое либо число, например на 256. Получив номер карты берем младший байт номера

А можно пример кода, если не сложно, я в плюсах далекий

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

что-то типа такого:

#define HASH 256
#define BLOCKSIZE 64
#define CARDSIZE 8
struct card
{
  unsigned long cardNum;
  byte accessLevel;
  byte reserve[3];
}

byte FindCard(unsigned long cardNum)
{
  byte buf[BLOCKSIZE];//буфер куда читаем карты из eeprom
  byte blockNum = CardNum % HASH;//номер блока в eeprom
  card Card;
  eeprom_read_block(buf, blockNum*BLOCKSIZE, BLOCKSIZE);//чтение
  for (i=0; i<BLOCKSIZE/CARDSIZE; i++)
  {
    Card=(card*)&buf[i*CARDSIZE];//смотрим на буфер как на карту
    if (Card.cardNum == cardNum) return Card.accessLevel;//возвращаем уровень доступа
  }
  return -1;//карту не нашли
}

 

Alexino
Offline
Зарегистрирован: 29.12.2015

За место CARDSIZE лучше заюзать sizeof(card). При изменении структуры, вся адресация сама перестроится под нужное форматирование.
Либо в CARDSIZE число 8 сменить на sizeof, что даже будет более правильнее.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

там есть и другие траблы.... переменной card присваиваю указатель на буфер... очевидная ошибка. Цель не код, а идея.

Alexino
Offline
Зарегистрирован: 29.12.2015

Идея хорошая, но несовсем понятная.
Имеем, к примеру, 256 блоков размером по 256 байт. Младший байт карты - адрес блока. Но, это сработало бы, если бы номер карты был всего 2 байта. Ибо, с одним и тем же младшим байтом номера, может существовать множество карт, намного больше размера блока.
В таком случае, памяти под хранение нужно ровно столько, сколько всего имеется вариантов номеров карт.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Карты покупаются пачками, у них номера по порядку, в этом случае 256 карт попадут в 256 блоков, в каждый по одной. Покупая 10 раз по пачке карт, можно ожидать, что в каждом блоке окажется по 10 карт.

В свое время разрабатывал "взрослую" СКУД, делал поиск по 1 000 000 карт за 10 итераций.

Alexino
Offline
Зарегистрирован: 29.12.2015

Ну вот, а покупая 300 пачек, уже можно ожидать, что будет переполнение блока )
Да и не известно, с какими вообще номерами может быть пачка, может у неё будут отличаться только 2-ой байт.
Думаю, нельзя надеятся на то, что карточек с одинаковым младшим байтом не будет больше размера блока. ИМХО.

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

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Alexino пишет:
Ну вот, а покупая 300 пачек, уже можно ожидать, что будет переполнение блока
Зная алгоритм можно подобрать номера карт так, что бы затолкать их все в один блок. Вероятность такого расклада стремится к нулю.

В данной ситуации челу нужно реализовать 100 карт из 3-4 пачек.

yrichs
Offline
Зарегистрирован: 18.05.2018

Здравствуйте!

Тема мне интересная. Что в итоге получилось? Довели до конца?