Радиочастотное (rfid) управление доступом с помощью arduino uno и модуля em-18

Чтение и запись RFID меток. Модуль RC522 для Arduino

Сегодня я расскажу про RFID модуль RC522, на базе чипа MFRC522. Питание 3.3В, дальность обнаружения до 6см. Предназначен для чтения и записи RFID меток с частотой 13.56 МГц. Частота в данном случае очень важна, так как RFID метки существуют в трех частотных диапазонах:

  • Метки диапазона LF (125—134 кГц)
  • Метки диапазона HF (13,56 МГц)
  • Метки диапазона UHF (860—960 МГц)

Конкретно этот модуль работает с метками диапазона HF, в частности с протоколом MIFARE.

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

Подключение

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

MFRC522 Arduino Uno Arduino Mega Arduino Nano v3 Arduino Leonardo/Micro Arduino Pro Micro
RST 9 5 D9 RESET/ICSP-5 RST
SDA(SS) 10 53 D10 10 10
MOSI 11 (ICSP-4) 51 D11 ICSP-4 16
MISO 12 (ICSP-1) 50 D12 ICSP-1 14
SCK 13 (ICSP-3) 52 D13 ICSP-3 15
3.3V 3.3V 3.3V Стабилизатор 3,3В Стабилизатор 3,3В Стабилизатор 3,3В
GND GND GND GND GND GND

Пины управления SS(SDA) и RST задаются в скетче, так что если ваша плата отличается от той, что я буду использовать в своих примерах, а использую я UNO R3, указывайте пины из таблицы в начале скетча:

#define SS_PIN 10
#define RST_PIN 9

Пример №1: Считывание номера карты

Рассмотрим пример из библиотеки RFID  – cardRead. Он не выдает данные из карты, а только ее номер, чего обычно бывает достаточно для многих задач.

#include #include #define SS_PIN 10
#define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); // Данные о номере карты храняться в 5 переменных, будем запоминать их, чтобы проверять, считывали ли мы уже такую карту int serNum0; int serNum1; int serNum2; int serNum3; int serNum4; void setup()
{ Serial.begin(9600); SPI.begin(); rfid.init(); } void loop()
{ if (rfid.isCard()) { if (rfid.readCardSerial()) { // Сравниваем номер карты с номером предыдущей карты if (rfid.serNum[0] != serNum0 && rfid.serNum[1] != serNum1 && rfid.serNum[2] != serNum2 && rfid.serNum[3] != serNum3 && rfid.serNum[4] != serNum4 ) { /* Если карта – новая, то считываем*/ Serial.println(” “); Serial.println(“Card found”); serNum0 = rfid.serNum[0]; serNum1 = rfid.serNum[1]; serNum2 = rfid.serNum[2]; serNum3 = rfid.serNum[3]; serNum4 = rfid.serNum[4]; //Выводим номер карты Serial.println(“Cardnumber:”); Serial.print(“Dec: “); Serial.print(rfid.serNum[0],DEC); Serial.print(“, “); Serial.print(rfid.serNum[1],DEC); Serial.print(“, “); Serial.print(rfid.serNum[2],DEC); Serial.print(“, “); Serial.print(rfid.serNum[3],DEC); Serial.print(“, “); Serial.print(rfid.serNum[4],DEC); Serial.println(” “); Serial.print(“Hex: “); Serial.print(rfid.serNum[0],HEX); Serial.print(“, “); Serial.print(rfid.serNum[1],HEX); Serial.print(“, “); Serial.print(rfid.serNum[2],HEX); Serial.print(“, “); Serial.print(rfid.serNum[3],HEX); Serial.print(“, “); Serial.print(rfid.serNum[4],HEX); Serial.println(” “); } else { /* Если это уже считанная карта, просто выводим точку */ Serial.print(“.”); } } } rfid.halt();
}

Скетч залился, светодиод питания на модуле загорелся, но модуль не реагирует на карту? Не стоит паниковать, или бежать искать “правильные” примеры работы.

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

3В, и убедитесь, что на плате она подключена именно к 3.3В, подача питания в 5В может вашу плату запросто убить.

Допустим, все у вас заработало. Тогда, считывая модулем RFID метки, в мониторе последовательного порта увидим следующее:

Здесь я считывал 3 разных метки, и как видно все 3 он успешно считал.

Пример №2: Считывание данных с карты

Рассмотрим более проработанный вариант – будет считывать не только номер карты, но и все доступные для считывания данные. На этот раз возьмем пример из библиотеки MFRC522 – DumpInfo.

#include #include #define RST_PIN 9 // #define SS_PIN 10 // MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance void setup() { Serial.begin(9600); // Инициализируем монитор последовательного порта while (!Serial); // Ничего не делаем пока он не открыт (для Arduino на чипе ATMEGA32U4) SPI.begin(); // Инициализируем SPI шину mfrc522.PCD_Init(); // Инициализируем RFID модуль ShowReaderDetails(); // Выводим данные о модуле MFRC522 Serial.println(F(“Scan PICC to see UID, type, and data blocks…”));
} void loop() { // Ищем новую карту if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбираем одну из карт if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Выводим данные с карты mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
} void ShowReaderDetails() { // Получаем номер версии модуля byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg); Serial.print(F(“MFRC522 Software Version: 0x”)); Serial.print(v, HEX); if (v == 0x91) Serial.print(F(” = v1.0″)); else if (v == 0x92) Serial.print(F(” = v2.0″)); else Serial.print(F(” (unknown)”)); Serial.println(“”); // Когда получаем 0x00 или 0xFF, передача данных нарушена if ((v == 0x00) || (v == 0xFF)) { Serial.println(F(“WARNING: Communication failure, is the MFRC522 properly connected?”)); }
}

Если предыдущий пример работал без ошибок, то и в этом проблем возникнуть не должно. Хотя, проездной на метро, без проблем выдававший номер карты в предыдущем примере, в этом оказался с неопределяемым типом данных, и модуль ничего кроме номера карты считать не смог.

Как результат, считав данные с карты, получим ее тип, идентификатор, и данные из 16 секторов памяти. Следует отметить, что карты стандарта MIFARE 1K состоят из 16 секторов, каждый сектор состоит из 4 блоков, а каждый блок содержит 16 байт данных.

Пример №3: Запись нового идентификатора на карту

В этом примере мы рассмотрим смену идентификатора карты (UID). Важно знать, что далеко не все карты поддерживают смену идентификатора. Карта может быть перезаписываемой, но это означает лишь перезаписываемость данных. К сожалению, те карты, которые были у меня на руках, перезапись UID не поддерживали, но код скетча я здесь на всякий случай приведу.

#include #include /* Задаем здесь новый UID */
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
#define SS_PIN 10
#define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); Serial.println(F(“Warning: this example overwrites the UID of your UID changeable card, use with care!”)); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } void loop() { if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); return; } // Считываем текущий UID Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Записываем новый UID byte newUid[] = NEW_UID; if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { Serial.println(F("Wrote new UID to card.")); } // Halt PICC and re-select it so DumpToSerial doesn't get confused mfrc522.PICC_HaltA(); if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { return; } // Считываем данные с карты Serial.println(F("New UID and contents:")); mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); delay(2000); }

Пример №4: Запись данных на карту

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

Изменим один из блоков данных на карте:

#include #include #define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); // Подготовим ключ // используем ключ FFFFFFFFFFFFh который является стандартом для пустых карт for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write.")); Serial.print(F("Using key (for A and B):")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); Serial.println(); Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1")); } void loop() { // Ждем новую карту if ( ! mfrc522.PICC_IsNewCardPresent()) return; // Выбираем одну из карт if ( ! mfrc522.PICC_ReadCardSerial()) return; // Показываем подробности карты Serial.print(F("Card UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("PICC type: ")); byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // Проверяем совместимость if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("This sample only works with MIFARE Classic cards.")); return; } // В этом примере мы используем первый сектор данных карты, блок 4 byte sector = 1; byte blockAddr = 4; byte dataBlock[] = { // Данные, которые мы запишем на карту 0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4, 0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8, 0x08, 0x09, 0xff, 0x0b, // 9, 10, 255, 12, 0x0c, 0x0d, 0x0e, 0x0f // 13, 14, 15, 16 }; byte trailerBlock = 7; byte status; byte buffer[18]; byte size = sizeof(buffer); // Аутентификация Serial.println(F("Authenticating using key A...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Показываем текущие данные сектора Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // Читаем данные из блока Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(); // Аутентификация Serial.println(F("Authenticating again using key B...")); status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Записываем данные в блок Serial.print(F("Writing data into block ")); Serial.print(blockAddr); Serial.println(F(" ...")); dump_byte_array(dataBlock, 16); Serial.println(); status = mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.println(); // Читаем данные снова, чтобы проверить, что запись прошла успешно Serial.print(F("Reading data from block ")); Serial.print(blockAddr); Serial.println(F(" ...")); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(F("Checking result...")); byte count = 0; for (byte i = 0; i < 16; i++) { if (buffer[i] == dataBlock[i]) count++; } Serial.print(F("Number of bytes that match = ")); Serial.println(count); if (count == 16) { Serial.println(F("Success :-)")); } else { Serial.println(F("Failure, no match :-(")); Serial.println(F(" perhaps the write didn't work properly...")); } Serial.println(); // Выводим данные Serial.println(F("Current data in sector:")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); } void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } }

И как результат, получаем карту с измененным блоком данных:

Теперь, научившись считывать и записывать блоки данных карты, вы можете поэксперементировать с метками, которые скорее всего есть у вас – пропуски, проездные общественного транспорта. Попробуйте считывать и записывать данные с этих карт, пара дубликатов пропуска никогда не помешает, так ведь?)

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

Источник: https://arthurphdent.livejournal.com/1759.html

Урок 10. Контроль доступа. RFID-rc522 + Servo + Arduino

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

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

В этом уроке нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • RFID Library for MFRC522.

Сборка:

1) RFID-модуль RC522 подключается к arduino проводами Папа-Мама в следующей последовательности:

Более подробно о подключении Rfid модуля.

2) Теперь нужно подключить Зуммер, который будет подавать сигнал, если ключ сработал и замок открывается, а второй сигнал, когда замок закрывается.

Зуммер подключаем в следующей последовательности:

ArduinoЗуммер
5V VCC
GND GND
pin 5 IO

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

ArduinoСервопривод
5V * Красный (Центральный)
GND Черный или Коричневый (Левый)
pin 6 Белый или Оранжевый (Правый)

*Сервопривод рекомендуется питать от внешнего источника питания, если запитать сервопривод от ардуины, то могут возникнуть помехи и перебои в работе arduino. Организовать это можно с помощью источника питания 9V и комбинированного стабилизатора 5V ,3.3V.

Более наглядно Вы можете посмотреть, как мы подключили все модули на картинке ниже:

Теперь, если все подключено, то можно переходить к программированию.

Скетч:

#include
#include
#include // библиотека “RFID”.
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате
Servo servo;
void setup() { Serial.begin(9600); Serial.println(“Waiting for card…”); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(6); servo.write(0); // устанавливаем серву в закрытое сосотояние
}
void loop() { // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние }

Разберем скетч более детально:

Для того, что бы узнать UID карточки(Метки), необходимо записать данный скетч в arduino, собрать схему, изложенную выше, и открыть Консоль (Мониторинг последовательного порта). Когда вы поднесете метку к RFID, в консоли выведется номер

Полученный UID необходимо ввести в следующую строчку:

if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданному то сервопривод открывает задвижку.

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

Видео:

Источник: https://lesson.iarduino.ru/page/kontrol-dostupa-rfid-rc522-servo-arduino/

Подключение RFID к Arduino с помощью RC522 и RDM3600

RFID метки стали неотъемлемой частью нашей жизни, без них немыслимы современные системы автоматизации и умные устройства.

Ардуино предоставляет нам отличные возможности использовать современные технологии даже в начальных проектах.

В этой статье мы расскажем, что такое RFID, сделаем обзор стандартов , типов карточек, узнаем как подключать популярные RFID-считыватели RC522 и RDM3600 к Arduino.

Что такое RFID

RFID (радиочастотная идентификация) – это метод обеспечения передачи, записи и хранения данных при помощи радиосигналов. Каждая RFID-система включает в себя считыватель/ридер и RFID-метку, в которой хранятся данные. Метки состоят из двух частей – интегральной схемы и антенны. Интегральная схема позволяет хранить и обрабатывать данные, антенна – принимать и передавать информацию.

Все RFID-системы можно разделить по дальности действия:

  • Ближней идентификации – расстояние не более 20 см;
  • Средней идентификации – расстояние от 20 см до 5 м;
  • Дальней идентификации – максимум 300 м.

С точки зрения частот можно выделить:

  • Системы, работающие в низкочастотном диапазоне (125 кГц, 134 кГц);
  • Работающие в среднечастотном диапазоне (13,56 МГц);
  • Работающие в высокочастотном диапазоне (800 МГц – 2, 4 ГГц).

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

Основными стандартами являются ISO 14443, ISO 15693 и EPC. На основе стандарта ISO 14443 изготавливаются смарт-карты. ISO 15693 используется для перезаписывания меток.

EPC – аналог штрихкодов, имеет более простую и понятную структуру.

ВЧ диапазон начали использовать недавно, в основном его применяют для складских приложений. Для этого диапазона используются стандарты ISO 18000 и EPC. Стандарты ISO 18000 вызывают наибольший интерес, они используются в приложениях с метками с увеличенной дальностью. Для ISO 18000 также можно выделить несколько стандартов, различающихся по  частоте:

  • ISO 18000-1 (определение тех параметров, которые необходимо стандартизировать);
  • ISO 18000-2 (для параметров с бесконтактным интерфейсом связи менее 135 кГц);
  • ISO 18000-3 (для бесконтактного интерфейса на частоте 13,56 МГц);
  • ISO 18000-4 (для частоты 2, 45 ГГц);
  • ISO 18000-6 (для частоты 860-930МГц);
  • ISO 18000-7 (для частоты 433 МГц).

Преимущества RFID

  • Не требуется прямая видимость;
  • Практически 100% идентификация сигнала;
  • Возможность применения в агрессивной среде;
  • Долгий срок службы;
  • RFID-метку трудно подделать;
  • Возможность хранения и передачи большого объема информации.

Области применения RFID идентификации

RFID-технология часто используется в розничной торговле, библиотеках и архивах, логистике, системах контроля и управления доступом (СКУД), инициализации людей, удостоверении подлинности товаров.

Для идентификации персонала самым популярным форматом являются пластиковые бесконтактные карты и бесконтактные брелки. С их помощью можно регистрировать вход/выход объектов на территории через точки прохода – ворота, КПП.

Основной задачей СКУД является управление доступом — например, ограничение в доступе на какую-либо территорию, идентификация лиц, которые могут попадать на территорию.

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

RFID-брелки используются и для подъездных домофонов. Для открытия дверей чаще всего используются брелки Proximity, то есть брелки ближнего действия, работающие на расстоянии 10-15 см.  Proximity также делятся на несколько форматов – наиболее популярные на сегодняшний день EM-Marin, HID для бесконтактных ключей и MIFARE, к которым относятся бесконтактные смарт карты.

Краткое описание Arduino модулей

Модуль Arduino RFID RC522

Модуль RFID RC522 выполнен на основе схемы MFRC522, которая обеспечивает беспроводную коммуникацию на частоте 13,56 МГц. Подключать микросхему можно по интерфейсу SPI, I2c и UART. Стандарт протокола NFC Reader ISO 14443.

Технические характеристики модуля RFID RC522:

  • Напряжение питания 3,3 В;
  • Максимальный потребляемый ток 30 мА;
  • Частотная полоса 13,55-13,57 МГц;
  • Расстояние считывания до 25 мм;
  • Рабочая температура от -20С до 80 С.

Распиновка модуля изображена на рисунке. Контакт SDA (SS, CS, NSS) отвечает за выбор ведомого устройства. Выход SCK является тактовым сигналом SPI. MOSI – отвечает за передачу данных от мастера к ведомому, MISO – от ведомого к мастеру.

IRQ – выполняет прерывание. RST – выполняет прерывание.

RDM6300 – бесконтактный считыватель, который используется для дистанционного считывания номера RFID брелка и передачи номера через UART на микроконтроллер, управляющий замком в системах доступа. Устройство обладает несколькими преимуществами – невысокая цена и простота в установке.

Чаще всего используется в системах контроля доступа в дома, гаражи, офисы, квартиры и другие здания с электромеханическим замком.  Считыватель используется для чтения карт EM4100/TK4100. RDM6300 может монтироваться в стену или в корпус.

В качестве микроконтроллера обычно применяется Ардуино.

Технические характеристики RDM6300:

  • Максимальный потребляемый ток 50 мА;
  • Напряжение питания 5 В;
  • Рабочая частота 125 кГц;
  • Рабочие температуры от -10С до 70 С.

Распиновка изображена на рисунке.

Пин TX отвечает за передачу данных, RX – за прием. 3 выход не используется.

Для P2 выходы ANT1 и ANT2 используются для подключения антенны.

Подключение RC522 к Ардуино

Для подключения понадобятся плата Ардуино, считыватель RC522, компьютер, провода и беспроводная RFID метка.

Подключается модуль RC522 к ардуино по следующей схеме:

Напряжение питания обеспечивается от 2,5 до 3,3 В. Выход RST подключается к D9 пину на ардуино, SDA – к D10, MOSI – D11, MISO – D12, SCK – D13. В данном случае рассмотрены платы Arduino Nano v3 и Arduino Uno. После того как все будет подключено, на RC522 загорится индикатор.

Плата Ардуино оснащена дополнительным разъемом ICSP, который используется для работы по интерфейсу  SPI. Распиновка для него изображена на рисунке, выводы с модуля RC522 можно подключить к этому разъему.

Для работы с модулем нужно установить библиотеку RFID Library for MFRC522. После установки нужно загрузить тестовый скетч для считывания номера карты cardRead, включить мониторинг последовательного порта. Затем метку нужно поднести к ридеру, произойдет инициализация метки и на мониторе появится следующее:

В данном примере произведено считывание трех различных меток.

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

Источник: https://ArduinoMaster.ru/datchiki-arduino/podklyuchenie-rfid-k-arduino/

Interfacing EM-18 RFID reader with Arduino Uno

Arduino Uno is an opensource physical computing platform based on ATmega328 microcontroller and provides a development environment for writing software for the board. It can be used for a variety of projects.

EM-18 RFID reader is one of the commonly used RFID reader to read 125KHz tags. It features low cost, low power consumption, small form factor and easy to use. It provides both UART and Wiegand26 output formats. It can be directly interfaced with microcontrollers using UART and with PC using an RS232 converter.

Working of EM-18 RFID module

The module radiates 125KHz through its coils and when a 125KHz passive RFID tag is brought into this field it will get energized from this field. These passive RFID tags mostly consist of CMOS IC EM4102 which can get enough power for its working from the field generated by the reader.

RFID – System Principle

By changing the modulation current through the coils, tag will send back the information contained in the factory programmed memory array.

Passive RFID Tag Block Diagram

EM-18 RFID Reader Module – Bottom View

Pin No.NameFunction
1 VCC 5V
2 GND Ground
3 BEEP BEEP and LED
4 ANT No Use
5 ANT No Use
6 SEL HIGH selects RS232, LOW selects WEIGAND
7 TX UART TX, When RS232 is Selected
8 D1 WIEGAND Data 1
9 D0 WIEGAND Data 0

Interfacing EM-18 RFID Reader Module with Arduino – Circuit Diagram

Interfacing EM-18 RFID Reader with Arduino Uno – Breadboard Wiring

int count = 0; // count = 0
char input[12]; // character array of size 12 boolean flag = 0; // flag =0
void setup()
{ Serial.begin(9600); // begin serial port with baud rate 9600bps
}
void loop()
{ if(Serial.available()) { count = 0; while(Serial.available() && count < 12) // Read 12 characters and store them in input array { input[count] = Serial.read(); count++; delay(5); } Serial.print(input); // Print RFID tag number if((input[0] ^ input[2] ^ input[4] ^ input[6] ^ input[8] == input[10]) && (input[1] ^ input[3] ^ input[5] ^ input[7] ^ input[9] == input[11])) Serial.println("No Error"); else Serial.println("Error"); } }

Upload the program.

Arduino RFID program

Output

Arduino serial monitor RFID output

The output consists of 12 character ASCII data, where first 10 bits will be the tag number and last 2 bits will be the XOR result of the tag number which can be used for error correction. For eg : If the RFID tag number is 500097892E, output of EM-18 Reader will be 500097892E60, where 60 is 50 xor 00 xor 97 xor 89 xor 2E.

Источник: https://electrosome.com/em-18-rfid-reader-arduino-uno/

CraftDuino и RFID-модуль RC522. Обзор, подключение, тестовый скетч. Хардварный “Свой-чужой”

Данил Борчевкин
команда

Что нам понадобится в данной статье:

1. или аналог;
2. ;
3.
4.
5.
6.

ОБЗОР

Комплект модуля мне по душе по 3 причинам: 1. Сам модуль; 2. RFID-карта с возможностью перезаписи; 3. RFID-брелок (да, тот же, который используется для открытия домофонной двери) с возможностью перезаписи. Даже один взгляд на данный комплект рисует в голове множество способов применения RC522: 1.

Автоматический замок для открывания двери, ящика, шкафа; 2. Программатор для домофонных ключей; 3. Организация складского учета (но с этим чуть сложней — нужно закупить RFID-метки, такие же, как и на любом товаре в современном магазине);

4.

Открытие закрытых ранее для вас дверей копирование и программирование карт для организации доступа к вашим сокровищам.

ПОДКЛЮЧЕНИЕ

RC522 имеет интерфейс , а это значит, что костылей в этой статье не будет, т.к. имеет его из коробки. Модуль RC имеет 8 выводов (написаны по порядку расположения на модуле):

VCC — Питание. Необходимо 3.3V;

RST — Reset. Линия сброса. Ни в коем случае не подключать к пину RESET на CraftDuino! Данный пин цепляется на цифровой порт с PWM;
GND — Ground. Земля=));
MISO — Master Input Slave Output — данные от ведомого к ведущему, SPI;
MOSI — Master Output Slave Input — данные от ведущего к ведомому, SPI;
SCK — Serial Clock — тактовый сигнал, SPI;
NSS — Slave Select — выбор ведомого, SPI;
IRQ — линия прерываний;

Для подключения к необходимо воспользоваться следующей распиновкой:

RC522 –> пин CraftDuino

VCC —-> 3.3V

RST —-> 9
GND —-> GND
MISO —> 12
MOSI —> 11
SCK —-> 13
NSS —-> 10
IRQ —-> NС — не подключаем [в рамках этого примера. Далее планируется его использовать]

ТЕСТОВЫЙ СКЕТЧ

Для работы с данным модулем есть 2 разных пути: 1. Изучить работу микросхемы, форматы команд и запросов и написать свой софт; 2.

Не заморачиваться на первом этапе и воспользоваться готовой библиотекой и примерами.

Первый путь мы отложим до последующих статей, а пока воспользуемся , установим ее в Arduino IDE с помощью копирования в папку %путь установки%/libraries/RFID и зальем тестовый скетч cardRead:

Источник: http://robocraft.ru/blog/3004.html

Как подключить RFID считыватель RC522 к Arduino

В этой статье мы рассмотрим подключение к Arduino считывателя карт и брелоков RFID RC522, работающего на частоте 13,56 МГц.

  • Arduino;
  • считыватель RFID RC522;
  • беспроводная RFID метка или обычный билет на метро/наземный транспорт;
  • компьютер;
  • соединительные провода.

Модуль RFID-RC522 выполнен на микросхеме MFRC522 фирмы NXP. Эта микросхема обеспечивает двухстороннюю беспроводную (до 6 см) коммуникацию на частоте 13,56 МГц.

Беспроводной модуль RFID-RC522

Микросхема MFRC522 поддерживает следующие варианты подключения:

ИнтерфейсСкорость передачи
SPI (Serial Peripheral Interface, последовательный интерфейс для связи периферийных устройств) до 10 Мбит/сек;
двухпроводной интерфейс I2C до 3400 кбод в режиме High-speed,до 400 кбод в режиме Fast;
последовательный UART (аналог RS232) до 1228,8 кбод.

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

RFID – это сокращение от “Radio Frequency IDentification” и переводится как «радиочастотная идентификация».
NFC – это “Near field communication”, «коммуникация ближнего поля» или «ближняя бесконтактная связь».

2Схема подключения RFID-RC522 к Arduino

Подключим модуль RFID-RC522 к Arduino по интерфейсу SPI по приведённой схеме.

Схема подключения RFID-RC522 к Arduino по интерфейсу SPI

Питание модуля обеспечивается напряжением от 2,5 до 3,3 В. Остальные выводы подключаем к Arduino так:

Пин RC522Пин Arduino
RST D9
SDA (SS) D10
MOSI D11
MISO D12
SCK D13

Не забывайте также, что Arduino имеет специальный разъём ICSP для работы по интерфейсу SPI. Его распиновка также приведена на иллюстрации. Можно подключить выводы RST, SCK, MISO, MOSI и GND модуля RC522 к разъёму ICSP на Ардуино.

3Библиотека для работы Arduino с RFID

Микросхема MFRC522 имеет достаточно обширную функциональность. Познакомиться со всеми возможностями можно изучив её паспорт (datasheet). Мы же для знакомства с возможностями данного устройства воспользуемся одной из готовых библиотек, написанных для работы Arduino с RC522. Скачайте её и распакуйте в директорию Arduino IDElibraries

Установка библиотеки “rfid-master” для работы Arduino с RFID-метками

После этого запустите среду разработки Arduino IDE.

4Скетч для считывания информации, записанной на RFID-метке

Теперь давайте откроем скетч из примеров: Файл Образцы MFRC522 DumpInfo и загрузим его в память Arduino.

Открываем скетч DumpInfo

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

#include #include const int RST_PIN = 9; // пин RST const int SS_PIN = 10; // пин SDA (SS) MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522 void setup() { Serial.begin(9600); // инициализация послед. порта SPI.begin(); // инициализация шины SPI mfrc522.PCD_Init(); // инициализация считывателя RC522 } void loop() { // Ожидание прикладывания новой RFID-метки: if ( ! mfrc522.PICC_IsNewCardPresent()) { return; // выход, если не приложена новая карта } // Считываем серийный номер: if ( ! mfrc522.PICC_ReadCardSerial()) { return; // выход, если невозможно считать сер. номер } // Вывод дампа в послед. порт: mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); }

Текст скетча достаточно хорошо прокомментирован.

Для более полного знакомства с библиотекой изучите файлы MFRC522.h и MFRC522.cpp из директории rfid-master.

5Дамп данных с RFID-метки

Запустим монитор последовательного порта сочетанием клавиш Ctrl+Shift+M, через меню Инструменты или кнопкой с изображением лупы. Теперь приложим к считывателю билет метро или любую другую RFID-метку. Монитор последовательного порта покажет данные, записанные на RFID-метку или билет.

Считываем данные с билета на наземный транспорт и метро с помощью RFID

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

Примечание

Да, с помощью модуля RFID-RC522 можно записать данные на билет метро.

Но не обольщайтесь, каждая карта имеет неперезаписываемый счётчик циклов записи, так что «добавить» поездок себе на метро не получится – это сразу будет обнаружено и карта будет забракована турникетом 🙂 А вот использовать билеты метро для записи на них небольших объёмов данных – от 1 до 4 кб – можно. И способы применения этому ограничены только вашей фантазией.

Источник: https://soltau.ru/index.php/arduino/item/399-kak-podklyuchit-rfid-schityvatel-rc522-k-arduino

Записки программиста

Вам, конечно же, знакомы карточки и брелки, которые нужно подносить к считывателю, а они при этом пропускают на работу или дают проехать в метро. Такие брелки и карточки используют технологию под названием RFID, Radio Frequency IDentification.

Сегодня мы познакомимся с основами этой технологии, а также узнаем, как использовать ее в своих проектах на базе Arduino.<\p>

Работа RFID неплохо расписана в соответствующей статье на Википедии. Если в двух словах, большую часть карточки или брелка, которые далее мы будем называть RFID-метками, занимает антенна.

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

Теперь метка и ридер могут пообщаться друг с другом при помощи радиосигнала, используя какой-то свой протокол и модуляцию сигнала.

Стоит отметить, что это описание касалось пассивных меток. Бывают и активные метки, имеющие собственный источник питания, а также полупассивные. Что же касается радиосигнала, в RFID сигнал типично передается на частоте 125 КГц или 13.56 МГц. Существует множество стандартов передачи сигнала и их реализаций.

Довольно распространенным является стандарт ISO/IEC 14443 и его реализация MIFARE от компании NXP Semiconductors. Еще одним известным стандартом является NFC, основанный на ISO 14443. Одна из его реализаций называется NTAG, также от NXP Semiconductors.

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

Fun fact! В метках MIFARE используется секретный шифр Crypto-1, выжигаемый прямо в железе, что изначально делало невозможным клонирование этих меток.

Шифр со временем отреверсили и предали широкой огласке, поэтому последние лет 10 метки MIFARE может свободно клонировать кто угодно. Кое-какие подробности описаны в этих слайдах.

Эта история наглядно демонстрирует, почему безопасность через неясность (security by obscurity) не работает.

Для Arduino существует несколько модулей для работы с RFID. Пожалуй, самым дешевым, и в то же время самым популярным, является модуль под названием RC522 на базе чипа MFRC522 от NXP (даташит [PDF]). На eBay комплект из такого модуля вместе с метками в виде карточки и брелка можно приобрести за 2$.

Чип MFRC522 поддерживает технологии MIFARE и NTAG, радиосигнал передается на частоте 13.56 МГц. С микроконтроллером чип общается по SPI. Однако прямо по SPI ходить в чип нам не придется, так как для работы с модулем существует готовая библиотека MFRC522. Ее можно установить прямо из Arduino IDE.

Подключение модуля к Arduino Uno осуществляется так:

  • Пины 3.3V и GND Arduino подключаем к аналогичным пинам модуля;
  • Пины с 9 по 13 Arduino подключаем к пинам RST, SDA, MOSI, MISO и SCK модуля соответственно;

В итоге должно получиться что-то в таком стиле:

Рассмотрим простейший пример кода:

#include
#include

#define SS_PIN 10

#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {

  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  Serial.println(“Ready.”);
}

void loop() {

  if(!mfrc522.PICC_IsNewCardPresent())
    return;

  if(!mfrc522.PICC_ReadCardSerial())

    return;

  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

}

Этот код полностью считывает содержимое метки и передает его в компьютер по UART. Если теперь поднести карточку к считывателю, вы увидите что-то вроде:

Card UID: EF FB F6 01 Card SAK: 08 PICC type: MIFARE 1KB Sector Block  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 AccessBits  15     63   00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]         62   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]         61   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]         60   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]  14     59   00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]         58   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]         57   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]         56   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ] … и так далее …   0      3   00 00 00 00 00 00 FF 07 80 69 FF FF FF FF FF FF [ 0 0 1 ]          2   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]          1   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [ 0 0 0 ]

         0   EF FB F6 01 E3 08 04 00 62 63 64 65 66 67 68 69 [ 0 0 0 ]

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

Теперь допустим, что у нас есть дверь, и мы хотим открывать ее только тем, кто приложит правильную карточку. Проще всего это сделать, проверяя UID карточки:

#include
#include

#define SS_PIN 10

#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

const uint8_t valid_uid[] = { 0xEF, 0xFB, 0xF6, 0x01 };

void setup() {

  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
}

void loop() {

  if(!mfrc522.PICC_IsNewCardPresent())
    return;

  if(!mfrc522.PICC_ReadCardSerial())

    return;

  if((mfrc522.uid.size == sizeof(valid_uid)) &&

      (memcmp(&mfrc522.uid.uidByte, &valid_uid,
              sizeof(valid_uid)) == 0))
  {
    Serial.println(“ACCESS GRANTED!”);    
  } else {
    Serial.println(“Access denied.”);
  }
}

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

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

А доводилось ли вам делать что-то с RFID-метками и если да, то каковы ваши последние достижения на этом поприще?

Источник: https://eax.me/arduino-rfid/

Arduino + RFID + Excel. Сбор данных

2017-05-07 в 17:17

В этой статье я хочу рассказать как можно занести в таблицу Excel данные через com последовательный порт. А данными у нас будет время и код RFID карты. Считыватель – RFID-RC522. Все это работает на Arduino Uno.
Все подключаем по следующей схеме.

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

Для работы с данным считывателем нам необходимо установиться библиотеку rfid-master.

Код был разработан благодаря статье.

Код

#include
#include<\p>

#define RST_PIN         9
#define SS_PIN          10

int row_excel = 0; // количество строк

MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {   pinMode(5, OUTPUT);   Serial.begin(9600);   SPI.begin();   Serial.println(“CLEARDATA”);                           // очистка листа excel   Serial.println(“LABEL,Time,Code”);                     // заголовки столбцов   mfrc522.PCD_Init();

}

void loop() {

  row_excel++; // номер строки + 1

  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  byte block;   byte len;

  MFRC522::StatusCode status;

  if ( ! mfrc522.PICC_IsNewCardPresent()) {     return;

  }

  if ( ! mfrc522.PICC_ReadCardSerial()) {     return;

  }

  beep(50);
  beep(50);

  Serial.print(“DATA,TIME,”); // запись в excel текущей даты и времени

  mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid));

  delay(1000); //измените если необходимо считывать карты быстрее

  mfrc522.PICC_HaltA();   mfrc522.PCD_StopCrypto1();     Serial.println(row_excel); } void beep(unsigned char delayms) {   analogWrite(5, 25);      // значение должно находится между 0 и 255, поэкспериментируйте для получения хорошего тона   delay(delayms);          // пауза delayms мс   analogWrite(5, 0);       // 0 – выключаем пьезо   delay(delayms);          // пауза delayms мс

}

Загрузили. Работает. Теперь нам нужно вписать данные в таблицу Excel. Для этого загрузите документ с макросами. В окне укажите какой com порт использует Arduino и с какой скоростью (обычно 9600). И нажмите Connect.

После того как произойдет соединение прикладывайте свои карты и в строках появятся код карты и время ее считывания.

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

Считыватель RFID-RC522 – найти в магазине
Arduino UNO – найти в магазине
Пьезоизлучатель – найти в магазине

Источник: http://TehnoPage.ru/arduino-rfid-excel

Ардуино и карты доступа

Не так давно ко мне в руки попало довольно интересное устройство RDM6300, данное устройство предназначено для считывания информации с карт (и брелоков) работающих при помощи RFID (радиочастотной идентификации) по протоколу EM4100.

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

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

В своих экспериментах мне понадобился ARDUINO UNO (приобретается здесь: arduino-kit.com.ua/uno-r3-new.html или здесь: arduino-kit.com.ua/arduino-leonardo-original-italiya-new-rev3.

html) , а также картридер RDM6300 125KHz (по очень демократичной цене приобретается здесь: arduino-kit.com.ua/kardrider-rdm6300.html), если у Вас есть брелок от домофона или карточка 125KHz, то в принципе всё. Если нет – можно еще купить пару брелочков здесь:arduino-kit.com.

ua/rfid , а здесь: arduino-kit.com.ua/karta-rfid-tag-125khz-dlya-arduino.html пару карточек.

Почему именно RDM6300, ведь разнообразие считывателей RFID довольно велико? Ну, во-первых демократичная цена. А во-вторых «на все про все» ему нужно всего 2 провода (кроме питания, естественно), а это значит, что конструкция, которую предполагается оснастить данным устройством не будет излишне усложнена.

Итак, приступим. В отличие от многих других ардуино-устройств картридер RDM6300 имеет 3 разъема. 2-пиновый для антенны, причем судя по всему не имеет значения, как именно подключать к нему антенну (она, кстати, идет в комплекте).

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

Как именно подключать ясно из Таблицы 1.

RDM6300

Arduino Uno

Примечание

1

9

TX

2

8

RX

4

GND

5

+5V

Таблица 1.Подключение контактов.

Платы Raspberry Pi на портале Arduino-Kit.com.ua

Причем 1-й контакт находится в углу, а сам контакт имеет квадратную форму, зато 5-й зачем-то обведен в рамочку. Оставим это решение на совести разработчиков. Подключение хорошо видно на Рисунке 1. Также там изображены карточки и варианты брелоков. 

 
Рисунок 1. Ардуино и RDM6300, а также брелоки и карточки.

Первое, что нам было-бы интересно узнать – это собственно серийный номер наших брелоков, или карточек. Для этого загружаем простенький (всего 19 строчек) скетч. И на мониторе СОМ-порта наблюдаем номера имеющихся у нас карточек. Карточки к антенне приходится подносить практически вплотную.

#include

SoftwareSerialSoftSerial(9, 8);// Подключение RDM6300 к 8 и 9 пинамArduino Uno

unsignedcharbuffer[64]; //Описание 64-битного массива буфера

intcount=0;//Описание переменной для работы с массивом

void setup(){

SoftSerial.begin(9600);// Запуск RDM6300  

Serial.begin(9600);}//ЗапускСОМ-порта

void loop(){

if (SoftSerial.available()){//Если в RDM6300 есть данные – переписываем из в массив

while(SoftSerial.available()){//Чтение данных из RDM6300

buffer[count++]=SoftSerial.read();//Запись данных в переменную массива

if(count == 64)break; }//Если считали первые 64 бита – обрываем чтение

Serial.write(buffer,count);//Если данных больше нет – записываем значение в порт

clearBufferArray();//Запуск подпрограммы очистки буфера

count = 0;//Обнуление переменной массива

Serial.println();}}//Перевод строки перед записью нового значения

voidclearBufferArray(){//Подпрограммаочисткибуфера

for (int i=0; i

{ buffer[i]=NULL;}}//Обнуление ячейки массива

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

 
Рисунок 2. Пример работы программы определения номеров карточек.

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

#include

#include

prog_char tag_0[] PROGMEM = “565A1132E0CF”;//Значение нулевого слота памяти

prog_char tag_1[] PROGMEM = “000000000000”;//Значение первого слота памяти

prog_char tag_2[] PROGMEM = “000000000000”;//Значение второго слота памяти

prog_char tag_3[] PROGMEM = “000000000000”;//Значение третьего слота памяти

prog_char tag_4[] PROGMEM = “000000000000”;//Значение четвертого слота памяти

prog_char tag_5[] PROGMEM = “000000000000”;//Значение пятого слота памяти

prog_char tag_6[] PROGMEM = “000000000000”;//Значение шестого слота памяти

PROGMEM const char *tag_table[] ={tag_0,tag_1,tag_2,tag_3,tag_4,tag_5,tag_6};

SoftwareSerial SoftSerial(9, 8);// Подключение RDM6300 к 8 и 9 пинам Arduino Uno

unsigned char buffer[64]; //Описание 64-битного массива буфера

int count=0;//Описание переменной для работы с массивом

char tagNumber[14];

boolean receivedTag;

void setup(){

 SoftSerial.begin(9600);// Запуск RDM6300  

  Serial.begin(9600);}//Запуск СОМ-порта

  void loop(){

if (SoftSerial.available()){//Если в RDM6300 есть данные – переписываем из в массив

receivedTag=false;

  while(SoftSerial.available()){//Чтение данных из RDM6300

    int BytesRead = SoftSerial.readBytesUntil(3, tagNumber, 15);

  receivedTag=true;} 

    Serial.print(tagNumber);//Если данных больше нет – записываем значение в порт

     if (checkTag(tagNumber)){// Запрос сравнения значения с тем, что хранится в памяти

      Serial.print(” Svoy”);}// Если значение есть, значит свой

    else{

      Serial.print(” Chuzhoy”);}// Если значения нет, значит чужой

    clearBufferArray();//Запуск подпрограммы очистки буфера

    count = 0;//Обнуление переменной массива

    Serial.println();}}//Перевод строки перед записью нового значения

     boolean checkTag(String tag){// Определение значения переменной

   char testTag[14];

   for (int i = 0; i < sizeof(tag_table)/2; i++)

  {strcpy_P(testTag, (char*)pgm_read_word(&(tag_table[i])));

    if(tag.substring(1,13)==testTag){

      return true;// Возвращаем значение “Истина”

      break;}}

   return false;}// Возвращаем значение “Ложь”

void clearBufferArray(){//Подпрограмма очистки буфера

for (int i=0; i

    { buffer[i]=NULL;}}//Обнуление ячейки массива

То, что получилось видно на рисунке 3. 

 
Рисунок 3.

Теперь остались сущие пустяки: сделать данную программу практически полезной. Это совершенно не сложно. Пропишем и подключим 2 светодиода. Аноды светодиодов подключим на 10 (зеленый) и 11 (красный) пины Ардуино, а катоды, через токоограничительный резистор (мне под руки попался на 200Ом) к GND.

Пусть для «своих» зажигается зеленый, а для «чужих» – красный. То, что получилось видно на рисунке 4. Более опытные ардуинщики улыбнутся, а менее опытным предоставляю следующий скетч.

Да, и еще одно, думаю, что всем понятно, что вместо (или совместно) со светодиодами можно подключить реле, которое сможет управлять электрозамком или каким-либо оборудованием, а это уже простейшая система доступа.

#include

#include

prog_char tag_0[] PROGMEM = “565A1132E0CF”;//Значение нулевого слота памяти

prog_char tag_1[] PROGMEM = “000000000000”;//Значение первого слота памяти

prog_char tag_2[] PROGMEM = “000000000000”;//Значение второго слота памяти

prog_char tag_3[] PROGMEM = “000000000000”;//Значение третьего слота памяти

prog_char tag_4[] PROGMEM = “000000000000”;//Значение четвертого слота памяти

prog_char tag_5[] PROGMEM = “000000000000”;//Значение пятого слота памяти

prog_char tag_6[] PROGMEM = “000000000000”;//Значение шестого слота памяти

PROGMEM const char *tag_table[] ={tag_0,tag_1,tag_2,tag_3,tag_4,tag_5,tag_6};

SoftwareSerial SoftSerial(9, 8);// Подключение RDM6300 к 8 и 9 пинам Arduino Uno

unsigned char buffer[64]; //Описание 64-битного массива буфера

int count=0;//Описание переменной для работы с массивом

char tagNumber[14];

boolean receivedTag;

void setup(){

 SoftSerial.begin(9600);// Запуск RDM6300  

  Serial.begin(9600);//Запуск СОМ-порта

  pinMode(10,OUTPUT);// Указываем порт светодиода “Свой”

  pinMode(11,OUTPUT);}// Указываем порт светодиода “Чужой”

  void loop(){

if (SoftSerial.available()){//Если в RDM6300 есть данные – переписываем из в массив

receivedTag=false;

  while(SoftSerial.available()){//Чтение данных из RDM6300

    int BytesRead = SoftSerial.readBytesUntil(3, tagNumber, 15);

  receivedTag=true;} 

    Serial.print(tagNumber);//Если данных больше нет – записываем значение в порт

     if (checkTag(tagNumber)){// Запрос сравнения значения с тем, что хранится в памяти

      Serial.print(” Svoy”);// Если значение есть, значит свой

    digitalWrite(10,HIGH);// Зажигаем диод “Свой”

  delay(1000);// Ждем секунду

  digitalWrite(10,LOW);}// Гасим диод “Свой”

    else{

      Serial.print(” Chuzhoy”);// Если значения нет, значит чужой

        digitalWrite(11,HIGH);// Зажигаем диод “Чужой”

  delay(1000);// Ждем секунду

  digitalWrite(11,LOW);}// Гасим диод “Чужой”

    clearBufferArray();//Запуск подпрограммы очистки буфера

    count = 0;//Обнуление переменной массива

    Serial.println();}}//Перевод строки перед записью нового значения

     boolean checkTag(String tag){// Определение значения переменной

   char testTag[14];

   for (int i = 0; i < sizeof(tag_table)/2; i++)

  {strcpy_P(testTag, (char*)pgm_read_word(&(tag_table[i])));

    if(tag.substring(1,13)==testTag){

      return true;// Возвращаем значение “Истина”

      break;}}

   return false;}// Возвращаем значение “Ложь”

void clearBufferArray(){//Подпрограмма очистки буфера

for (int i=0; i

    { buffer[i]=NULL;}}//Обнуление ячейки массива

Рисунок 4.

Обзор подготовил Павел Сергеев

Источник: http://arduino-kit.com.ua/arduino-i-karty-dostupa.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}