Система контроля доступа
- Войдите на сайт для отправки комментариев
Добрый день.
Хочу создать систему контроля доступа на 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. Как работать с ЕЕПРОМ? как записать данные (номера карт), а потом искать в памяти карту для идентификации?
Так, что кто может помочь с решением задачи, буду рад услышать (прочитать).
А может кому-то интересно, есть замечания и предложения, присоеденяйтесь.
а почему дуня на месте не может открыть дверь без компа
а почему дуня на месте не может открыть дверь без компа
Потому как нужно идентифицировать карту.
Карту могут потерять, у некоторых ограничение по времени на вход (виход у всех по кнопке).
А каждый раз перешивать дуню не фен-шуй.
а с ЕЕПРОМ я еще не разобрался
MaxShadow, о каком количестве карт идет речь? Может оказаться, что с EEPROM будет слишком медленно.
В случае потери связи с компом обычно предусматривают переход в режим общего кода. У карт часть бит одинаковая, её называют общим кодом.
до 100 штук
Карты с разных партий и разных типов.
Раньше была одна карта которая забита в лоб, но ее удачно потеряли. А до этого чато забывали в кабинете
А ехать через ввесь город заливать сново дуню времени нет.
Хочу заливать в память по аналогии с нормальными СКД.
Вопрос с опросом контроллера по логам пока не стоит.
Постоянный опрос контроллеров мастером. Потеря связи = переход в offline режим. Каждому контроллеру нужно присвоить уникальный номер, в случае с 5 шт проще прописать прямо в коде. Предусмотри световую и звуковую индикацию. Предусмотри разные режимы работы для online и offline.
Раскидай карты в EEPROM по блокам в соответствии с остатком от деления номера на 256 или 128.
1.
Запись номеров карт в еепром самого контроллера (ардуины про мини, а не мастера) для тогого, чтобы контроллеры были автономны и могли свободно работать в офлайн режиме. Мастер служит как преобразователь USB - UART - RS485, и на мастер подключен считыватель для вноса карт в базу.
Для RS485 взял DO, D1, D2
Для считывателя SoftSerial D3,D4 (может кто подскажет как можно использовать только RX без TX, потому как ТХ для считывателя не нужен)
На D5 пишалка (Один длинный открыто, два кототких закрыто)
На D6 и D7 двухцветный светодиод (красный и зеленый) ожидание - мигает желтый (два вместе), открыто - горит зеленый, закрыто - горит красный
2.
С еепром у меня получилось по адресу записать значение и считать.
К тому же я хочу хранить не только номер карточки но и его права: можно или нельзя проходить в эту дверь. и доступ когда дверь заблокированна (предусмотрено открытие или блокировка двери удаленно с программы)
получается в памяти надо хранить строку в виде '12345678910;F', а при считывании карты искать карту в памяти и если она там есть то проверять права
Andy Интерфейс у считки случаем не wiegand?
Нет, UART, заказал с китая и вмонтировал в плоский корпус
Я хочу использовать внешнюю память 24 микросхему, в наличии есть 24С16 это 16К
Andy
Основной вопрос это быстрый поиск карты. Для этого карты раскидывают по остатку от деления на какое либо число, например на 256. Получив номер карты берем младший байт номера
А можно пример кода, если не сложно, я в плюсах далекий
что-то типа такого:
01
#define HASH 256
02
#define BLOCKSIZE 64
03
#define CARDSIZE 8
04
struct
card
05
{
06
unsigned
long
cardNum;
07
byte
accessLevel;
08
byte
reserve[3];
09
}
10
11
byte
FindCard(unsigned
long
cardNum)
12
{
13
byte
buf[BLOCKSIZE];
//буфер куда читаем карты из eeprom
14
byte
blockNum = CardNum % HASH;
//номер блока в eeprom
15
card Card;
16
eeprom_read_block(buf, blockNum*BLOCKSIZE, BLOCKSIZE);
//чтение
17
for
(i=0; i<BLOCKSIZE/CARDSIZE; i++)
18
{
19
Card=(card*)&buf[i*CARDSIZE];
//смотрим на буфер как на карту
20
if
(Card.cardNum == cardNum)
return
Card.accessLevel;
//возвращаем уровень доступа
21
}
22
return
-1;
//карту не нашли
23
}
За место CARDSIZE лучше заюзать sizeof(card). При изменении структуры, вся адресация сама перестроится под нужное форматирование.
Либо в CARDSIZE число 8 сменить на sizeof, что даже будет более правильнее.
там есть и другие траблы.... переменной card присваиваю указатель на буфер... очевидная ошибка. Цель не код, а идея.
Идея хорошая, но несовсем понятная.
Имеем, к примеру, 256 блоков размером по 256 байт. Младший байт карты - адрес блока. Но, это сработало бы, если бы номер карты был всего 2 байта. Ибо, с одним и тем же младшим байтом номера, может существовать множество карт, намного больше размера блока.
В таком случае, памяти под хранение нужно ровно столько, сколько всего имеется вариантов номеров карт.
Карты покупаются пачками, у них номера по порядку, в этом случае 256 карт попадут в 256 блоков, в каждый по одной. Покупая 10 раз по пачке карт, можно ожидать, что в каждом блоке окажется по 10 карт.
В свое время разрабатывал "взрослую" СКУД, делал поиск по 1 000 000 карт за 10 итераций.
Ну вот, а покупая 300 пачек, уже можно ожидать, что будет переполнение блока )
Да и не известно, с какими вообще номерами может быть пачка, может у неё будут отличаться только 2-ой байт.
Думаю, нельзя надеятся на то, что карточек с одинаковым младшим байтом не будет больше размера блока. ИМХО.
Ну а вообще, размер блока всегда можно же увеличить. Например сделав его двухбайтным, уже вероятность его переполнения будет мизерная, даже при количестве карт в миллионы. Но.. вероятность всё-таки есть, думаю, что её нужно предусматривать.
В данной ситуации челу нужно реализовать 100 карт из 3-4 пачек.
Здравствуйте!
Тема мне интересная. Что в итоге получилось? Довели до конца?