Как сделать считыватель карт

Сообщества › Сделай Сам › Блог › RFID контроль доступа

cd8616u 100

Что такое RFID
Википедия нам говорит следующее:
RFID (англ. Radio Frequency IDentification, радиочастотная идентификация) — способ автоматической идентификации объектов, в котором посредством радиосигналов считываются или записываются данные, хранящиеся в так называемых транспондерах, или RFID-метках.
Внешне метки выглядят либо так

bc7be95s 960

a27be95s 960

fafbe95s 960

867be95s 960

f27be95s 960

ce7be95s 960

Считываем
В теории каждая карта имеет уникальный собственный номер Uid, зная который мы можем идентифицировать и саму карту (на самом деле карты можно дублировать, но пока об этом скромно умолчим 🙂 )
Для того, чтобы считать нам понадобится собственно сам модуль rc522 и плата Arduino Pro Mini или другая подобная, но тогда нужно будет помотреть к каким выводам подключаться. Предостерегаю от использования Pro Micro — у меня с ней нормально не заработало, возможно нужно было просто поиграться с выводами RST и SS

e1fbe95s 960

8efbe95s 960

86fbe95s 960

RST — Reset. Линия сброса. Данный пин цепляется на цифровой порт с PWM на пин 9 Pro Mini;

GND — Ground. Земля — тут очевидно

MISO — Master Input Slave Output — Данные от ведомого к ведущему, SPI; на Pro Mini это пин 12

MOSI — Master Output Slave Input — данные от ведущего к ведомому, SPI; — к 11 пину на Pro Mini

SCK — Serial Clock — тактовый сигнал, SPI; — пин 13

NSS — Slave Select — выбор ведомого, SPI; — пин 10

IRQ — линия прерываний; — оставляем свободным.

У меня получилось нечто подобное:

72fbe95s 960

Для работы с модулем RC522 нам понадобиться специальная библиотека. Скачать ее можно отсюда.
Для подключения библиотеки идем, как показано на картинке ниже, и указываем путь, куда скачали zip-архив с библиотекой

59fbe95s 960

Заливаем в Ардуинку код, который будет передавать данные:
#include
#include // библиотека «RFID».
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате

void setup() <
Serial.begin(9600);
Serial.println(«Waiting for card…»);
SPI.begin(); // инициализация SPI / Init SPI bus.
mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.
>

Разработка электронной схемы
Так как сайт это все таки автомобильный, то контроль доступа мы будем делать для автомобиля. Следовательно наша плата будет иметь 3 вывода: открытие центрального замка, закрытие центрального замка и выход на реле поворотов. (В принципе, эта же схема пригодна и для кнопки «Старт-стоп», отличие будет только в программной части).
Можно было конечно, как делают многие «Кулибины», использовать макетную плату, ту же Arduino Pro Mini и соединить все проводочечками, перемычечками, но как бы мне противно видеть такую работу, да и зачем?
Забегая вперед скажу, что код вполне влазит в Atmega8, а «плюшки» в виде кварца и сомнительного стабилизатора 78L05 не сильно то и нужны. Так что используем в схеме честный микроконтроллер Atmega8.

7dfbe95s 960

b3fbe95s 960

997be95s 960

Программная часть
Как несложно догадаться, прошивка написана на «Ардуиновском» языке.
Алгоритм работы следующий
При поднесении метки к считывателю происходит изменение статуса «открыто/закрыто», которое индицируется поворотами, управлемыми 14 выходом. один «миг» — открываем замок, два — закрываем.
Для следующего изменения необходимо убрать метку от считывателя не менее, чем на 2 секунды (время установлено, чтобы у нас замок не впал в режим самовозбуждения) или поднести другую метку.
Прошивка разработана под использование двух меток, при необходимости это число можно увеличить.

Кроме того, как защита от зависания, возможного в авто, при скачках напряжения, используется Сторожевой таймер (он же watchdog)
Чтобы в случае перезагрузки система восстанавливала свой статус, он записывается каждый раз в энергонезависимую память EEPROM

Еще обратите внимание, что все временные интервалы в функциях delay(), millis() отсчитываются не в милисекундах, а как 10*милисекунды. Это особенность интерпретатора Arduino для микроконтроллеров, куда не загружен загрузчик Ардуино — я о ней писал ранее

Тем, кто будет повторять устройство рекомендую не собирать все «до купи», а проверить отдельно плату на соответствие напряжений, корректную работу ключей и отдельно прошивку — подцепив на выходы вместо ключей светодиоды, чтобы увидеть наглядно работу замка

Ну и собственно говоря сам код:

MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате
unsigned long uidOld = 0;
unsigned long kod1=1**********8; // код метки 1, записать свой
unsigned long kod2=2**********5; // код метки 2, записать свой
int stat =0; //Состояние замка: 0 — открыт; 1 — закрыт (после первого запуска и отладки, оставить только int stat =0;
unsigned long time_s; // Время от последнего изменения статуса

void setup() <
WDT_off(); // Останавливаем сторожевой таймер, если он был запущен ранее
SPI.begin(); // инициализация SPI / Init SPI bus.
mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card.
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
pinMode(16, OUTPUT);
WDT_on(); // Запускаем сторожевой таймера с тайм-аутом 2,2с
>

// Сброс таймера watchdog
wdt_reset();

// Считываем текущее состояние замка
stat = EEPROM.read(0);

digitalWrite(14, HIGH); // turn the LED on (HIGH is the voltage level)
delay(50); // wait for a second
digitalWrite(14, LOW); // turn the LED off by making the voltage LOW
delay(50); // wait for a second
uidOld=uidDec;
time_s=millis();
stat=0;
EEPROM.write(0, stat); // Записываем текущее состояние замка
>
>
>
>

inline void WDT_on(void) < // запуск вачдога с периодом 2.2с
WDTCR = 0x1F;
WDTCR |= (1 5 декабря 2017 в 00:59 Метки: sam_электрик

Источник

Что такое RFID? Как это работает? Взаимодействие RFID модуля RC522 с Arduino

Давно прошли те времена, когда люди стояли и ждали в длинных кассовых очередях в продуктовом магазине. Но теперь, благодаря технологии радиочастотной идентификации (RFID, Radio Frequency IDentification), с помощью решений на базе RFID вы можете заполнить корзину и выйти прямо за дверь. Вам больше не придется ждать, пока кассир пробьет каждый товар в вашей корзине по отдельности. Вместо этого RFID метки, прикрепленные к предметам, будут связываться с RFID считывателем, который будет обнаруживать каждый товар в корзине и пробивать его практически мгновенно.

f3527585cac670f184733f0b7ba1d7399e526597 Что такое RFID? Как это работает? Взаимодействие RFID модуля RC522 с Arduino

Для большинства наших проектов на Arduino отличным выбором будет RFID модуль чтения/записи RF522. Он обладает низким энергопотреблением, низкой стоимостью, он довольно прочный, прост для взаимодействия и безумно популярен среди любителей.

Что такое технология RFID и как она работает?

RFID или система радиочастотной идентификации состоит из двух основных компонентов: транспондера или метки, прикрепленной к идентифицируемому объекту, и приемопередатчика, также известного как интеррогатор (interrogator) или считыватель.

5c4f6d696b44ccbd9e28344129b34b1e76064db1 Рисунок 1 – Как работает технология RFID

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

Для считывания информации, закодированной в метке, она размещается в непосредственной близости от считывателя (она не обязательно должна находиться в пределах прямой видимости от считывателя). Считыватель генерирует электромагнитное поле, которое заставляет электроны проходить через антенну метки и обеспечивать чип питанием.

e6895bfd0411430b9ed8f7027be66786a1d9a2f2 Рисунок 2 – Как работает технология RFID

Обеспеченная питанием микросхема внутри метки затем отвечает отправкой своей сохраненной информации обратно считывателю в виде другого радиосигнала. Это называется обратным рассеянием (backscatter). Обратное рассеяние или изменение электромагнитной/радиочастотной волны обнаруживается и интерпретируется считывателем, который затем отправляет данные на компьютер или микроконтроллер.

RFID модуль RC522 на основе микросхемы MFRC522 от NXP – это один из самых недорогих вариантов RFID, который вы можете найти в интернете менее чем за четыре доллара. Обычно он поставляется с картой RFID метки и брелоком с объемом памяти 1 КБ. И что лучше всего, он может записать метку, чтобы вы могли хранить в ней свое секретное сообщение.

Модуль считывателя RFID RC522 предназначен для создания электромагнитного поля на частоте 13,56 МГц, которое он использует для связи с метками RFID (стандартные метки ISO 14443A). Считыватель может взаимодействовать с микроконтроллером через 4-контактный последовательный периферийный интерфейс (SPI) с максимальной скоростью передачи данных 10 Мбит/с. Он также поддерживает связь по протоколам I2C и UART.

У модуля имеется вывод прерывания. Это удобно потому, что вместо того, чтобы постоянно опрашивать RFID модуль «есть ли карта в поле зрения?», модуль сам предупредит нас, когда метка окажется рядом.

Рабочее напряжение модуля составляет от 2,5 до 3,3 В, но хорошая новость заключается в том, что логические выводы допускают напряжение 5 вольт, поэтому мы можем легко подключить его к Arduino или любому микроконтроллеру с 5-вольтовой логикой без использования какого-либо преобразователя логических уровней.

Характеристики RFID модуля RC522

Частотный диапазон 13,56 МГц, ISM диапазон
Интерфейс SPI / I2C / UART
Рабочее напряжение питания от 2,5 В до 3,3 В
Максимальный рабочий ток 13-26 мА
Минимальный ток (отключение питания) 10 мкА
Логические входы допускают 5 В
Расстояние считывания 5 см

Распиновка RFID модуля RC522

Модуль RC522 имеет всего 8 контактов, соединяющих его с внешним миром.

05aeea8d14d750412ec55b36b617954ac724b0cb Рисунок 4 – Распиновка RFID модуля считывателя RC522

VCC обеспечивает питание для модуля. Напряжение питания может быть в диапазоне от 2,5 до 3,3 вольт. Вы можете подключить его к выходу 3.3V вашей платы Arduino. Помните, что подключение его к выводу 5V, скорее всего, выведет модуль из строя!

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

GND вывод земли, должен быть подключен к выводу GND на Arduino.

IRQ – вывод прерывания, который может предупредить микроконтроллер, когда поблизости будет RFID метка.

Вывод MISO / SCL / Tx действует либо как Master-In-Slave-Out (вход ведущего – выход ведомого) при включенном интерфейсе SPI, либо как последовательный тактовый сигнал при включенном интерфейсе I2C, либо как выход последовательных данных при включенном интерфейсе UART.

MOSI (Master Out Slave In) – вход SPI для модуля RC522.

SCK (Serial Clock) принимает тактовые импульсы, предоставляемые мастером на шине SPI, то есть Arduino.

Вывод SS / SDA / Rx действует либо как вход, когда включен интерфейс SPI, либо как линия последовательных данных, когда включен интерфейс I2C, либо как вход последовательных данных, когда включен интерфейс UART. Этот вывод обычно помечается заключением в квадрат, чтобы его можно было использовать в качестве опорной точки для идентификации других выводов.

Подключение RFID модуля RC522 к Arduino UNO

Теперь, когда мы знаем всё о модуле, мы можем подключить его к нашей плате Arduino!

Теперь у нас остаются выводы, которые используются для связи по SPI. Поскольку модуль RC522 требует передачи больших данных, то наилучшая производительность будет обеспечена при использовании аппаратного модуля SPI в микроконтроллере. Использование выводов аппаратного SPI модуля намного быстрее, чем «дергание битов» в коде при взаимодействии через другой набор выводов.

Обратите внимание, что у плат Arduino выводы SPI различаются. Для плат Arduino, таких как UNO/Nano V3.0, это цифровые выводы 13 (SCK), 12 (MISO), 11 (MOSI) и 10 (SS).

Если у вас Arduino Mega, выводы отличаются! Вы должны использовать цифровые выводы 50 (MISO), 51 (MOSI), 52 (SCK) и 53 (SS). В таблице ниже приведен список выводов для связи по SPI для разных плат Arduino.

Список выводов для связи по SPI для разных плат Arduino

MOSI MISO SCK CS
Arduino Uno 11 12 13 10
Arduino Nano 11 12 13 10
Arduino Mega 51 50 52 53

В случае если вы используете плату Arduino, отличную от приведенных выше, рекомендуется проверить официальную документацию Arduino, прежде чем продолжить.

3775b7231975a7c61fac5cda9e9526f8dd36818e Рисунок 5 – Подключение модуля RFIDсчитывателя RC522 к Arduino UNO

Как только вы всё подключите, вы готовы к работе!

Код Arduino. Считывание RFID метки

Связь с RFID модулем RC522 – это сложная работа, но, к счастью для нас, есть библиотека MFRC522, которая упрощает чтение и запись в RFID меток. Спасибо Мигелю Бальбоа. Сначала скачайте библиотеку, посетив репозиторий GitHub, или просто нажмите на кнопку ниже, чтобы скачать архив:

acd6c20ff004ac5f32ba36f48d65222662f24486 Рисунок 6 – Скетч DumpInfo библиотеки MFRC522

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

Перейдите к началу скетча и убедитесь, что RST_PIN инициализирован правильно, в нашем случае мы используем цифровой вывод 5, поэтому измените его на 5!

6b57cfd3bec5f0509cba99dce6a20f50418d5f17 Рисунок 7 – Изменение вывода RST в примере скетча

Хорошо, теперь загрузите скетч в Arduino и откройте монитор последовательного порта. Как только вы приблизите метку к модулю, вы, вероятно, получите что-то вроде следующего. Не двигайте метку, пока не отобразится вся информация.

c4a436a48b36987f9402cc4aee7e57e40e546ab3 Рисунок 8 – Вывод скетча DumpInfo

Он отображает всю полезную информацию о метке, включая уникальный идентификатор (UID) метки, объем памяти и содержание всей памяти в 1 КБ.

Распределение памяти MIFARE Classic 1K

Память метки 1 КБ организована в 16 секторов (от 0 до 15). Каждый сектор дополнительно делится на 4 блока (блоки 0–3). Каждый блок может хранить 16 байтов данных (от 0 до 15).

Это говорит нам, что у нас точно

16 секторов x 4 блока x 16 байтов данных = 1024 байта = 1 КБ памяти

Весь 1 килобайт памяти с секторами, блоками и данными показан ниже.

4edef43c41c7450cc93da011a7acd90f161a362c Рисунок 9 – Вывод скетча DumpInfo. Структура памяти 026dcd30d41bd7b1d8719601c4693e122d8f215e Рисунок 10 – Трехмерное представление структуры памяти MIFARE Classic 1K

Блок 3 каждого сектора называется Sector Trailer и содержит информацию, называемую Access Bits (биты доступа), для предоставления доступа на чтение и запись к остальным блокам в секторе. Это означает, что в каждом секторе на самом деле для хранения данных доступны только 3 нижних блока (блоки 0, 1 и 2), а это означает, что в 64 байтовом секторе у нас есть только 48 байтов, доступных для нашего собственного использования.

Блок 0 сектора 0 также известен как Manufacturer Block / Manufacturer Data содержит данные производителя микросхемы и уникальный идентификатор (UID). Блок производителя выделен ниже красным цветом.

0eee570d93c93ab9e286fc859e086bd93c004baf Рисунок 11 – Вывод скетча DumpInfo. Блок производителя

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

Код Arduino. Запись в RFID метку

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

Вывод в мониторе последовательного порта будет выглядеть следующим образом.

b2406db48890760f9a87c84e3abf76e2822b83f2 Рисунок 12 – Вывод скетча записи RFID метки с помощью RC522

Объяснение кода:

Скетч начинается с включения библиотек MFRC522 и SPI, определения выводов Arduino, к которым подключен RC522, и создания объекта считывателя MFRC522.

Далее нам нужно определить блок, в котором мы собираемся хранить наши данные. Здесь выбран сектор 0, блок 2. Помните, никогда не выбирайте блок 3 в любом секторе. Запись в блок Sector Trailer может сделать блок непригодным для использования.

В функции loop() мы сначала сканируем, есть ли поблизости карта, если да, эта карта выбирается для записи и чтения.

Наконец, мы печатаем содержимое массива readbackblock с помощью цикла for и отображаем его в мониторе последовательного порта.

Проект на Arduino

RFID система контроля доступа для дверного замка

Давайте создадим небольшой проект на Arduino, чтобы продемонстрировать, как простой модуль RFID считывателя RC522 можно использовать для создания RFID системы контроля доступа для дверного замка. Наша программа будет сканировать уникальный идентификатор каждой RFID метки, когда она достаточно близко, чтобы запитываться от считывателя RC522. Если UID метки соответствует предопределенному значению ( MasterTag ), которое хранится в памяти Arduino, доступ будет предоставлен. И если сканируем любую неизвестную метку, доступ будет запрещен. Круто! Так ведь?

Так выглядит результат.

f335b58fe17057ccc76375e22c105b01d6672599 Рисунок 13 – Демонстрация работы RFID системы контроля доступа для дверного замка

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

Если вы не знакомы с символьными LCD дисплеями размером 16×2, то взгляните на эту статью.

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

7e5aad067dd5c9e29e2d12f57032ba9081750c0a Рисунок 14 – RFID система контроля доступа для дверного замка. Подключение RFID считывателя RC522 и LCD дисплея к Arduino

Всё! Теперь попробуйте приведенный ниже скетч в работе.

Программа довольно проста. Сначала мы включаем необходимые библиотеки, определяем выводы Arduino, создаем объекты LCD и MFRC522 и определяем главную метку.

В функции setup() мы инициализируем интерфейс SPI, объект MFRC522 и LCD дисплей. После этого мы печатаем на LCD дисплее приветственное сообщение.

Источник