RFID в названии этой штуки означает технологию радиоидентификации, то есть ничего конкретно не означает. Зато из спецификаций следует, что она совместима с распространенными RFID карточками с протоколом MIFARE.
Скорее всего, вы неоднократно встречались с такими карточками. Чаще всего — в виде офисного пропуска. Другой яркий пример — бесконтактные билеты для прохода в метро.
Базовый принцип действия довольно прост для понимания. В карточке и в считывателе есть антенны, при этом сигнал считывающего устройства (суть электромагнитное поле) одновременно служит источником питания для карточки. Т.е. и в части энергетики, и в части передачи данных это очень похоже на ставшие сверхпопулярными беспроводные зарядки.
Сами же карточки, в зависимости от модификации, могут нести в себе от нескольких десятков байт до нескольких килобайт данных (в том числе — уникальный серийный номер). Также, в зависимости от модификации, карточка может быть укомплектована криптографической защитой информации.
RFID-модуль 13.56 МГц с SPI-интерфейсом. В комплекте к модулю идет 2 RFID-метки — в виде карты и брелока.
Характеристики модуля RC522:
1. Потребляемый ток в активном состоянии:13-26mA/DC 3.3V;
2. Потребляемый ток в состоянии ожидания:10-13mA/DC 3.3V;
3. Ток в режиме сна:<80uA;
4. Пиковое потребление:<30mA;
5. Рабочая частота:13.56MHz;
6. Поддержвиаемые типы карт: MIFARE S50, MIFARE S70, MIFARE UltraLight, MIFARE Pro, MIFARE DESfire;
7. Размер: 40mm?60mm;
8. Температура, при которой работает модуль: от -20 до +80 С*;
9. Температура, в которой надо хранить модуль: от -40 до +85 С*;
10 .Относительная влажность воздуха: от 5% до 95%;
11. Модуль интерфейсов и параметров SPI;
12. Скорость передачи данных: максимум 10Мбит/с;
13. Основан на микросхеме MFRC522.
Данный модуль может быть использован для различных радиолюбительких и коммерческих применений, в том числе контроля доступа, автоматической идентификации, робототехники, отслеживания вещей, платежных систем и т.д.
Подключение модуля:
Модуль RC имеет 8 выводов (написаны по порядку расположения на модуле):
- SDA (NSS) — выбор ведомого SPI;
- SCK — тактовый сигнал, SPI;
- MOSI — данные от ведущего к ведомому, SPI;
- MISO — данные от ведомого к ведущему, SPI;
- IRQ — линия прерываний;
- GND — Земля;
- RST — Линия сброса. Ни в коем случае не подключать к пину RESET на Arduino! Данный пин цепляется на цифровой порт с PWM;
- VCC — Питание. Необходимо 3.3V;
Для подключения к Arduino Uno необходимо воспользоваться следующей распиновкой:
- SDA — 10 pin;
- SCK — 13 pin;
- MOSI — 11 pin;
- MISO — 12 pin;
- IRQ — N/C;
- Gnd — Gnd;
- RST — 9 pin;
- 3.3v — 3.3v.
Распиновка.
В первую очередь подключим его к Arduino:
1. SDA — 10 цифровой
2. SCK — 13 цифровой
3. MOSI — 11 цифровой
4. MISO — 12 цифровой
5. IRQ — не подключаем
6. GND — GND
7. RST — 9 цифровой
8. VCC — 3.3V
Далее качаем библиотеку для работы с ним: RFID library
Для начала просто считаем адрес поднесенной карты и выведем его в порт. Скоро в статью добавится пример чтения и записи данных.
#include SPI.h #include RFID.h #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); 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()) { // Выводим его в порт в десятичном представлении Serial.println("Card number:"); 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(" "); } } rfid.halt(); }
Вот что у нас получилось:
Программный код включения и выключения светодиода при подносе ключа:
#include SPI.h #include RFID.h #define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN, RST_PIN); int count=0; // Setup variables: int serNum0; int serNum1; int serNum2; int serNum3; int serNum4; void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); pinMode(8,OUTPUT); } void loop() { if (rfid.isCard()) { if (rfid.readCardSerial()) { if ((rfid.serNum[0] == 18 rfid.serNum[1] == 130 rfid.serNum[2] == 144 rfid.serNum[3] == 85 rfid.serNum[4] == 85 ) (count==0)) { digitalWrite(8,HIGH); count=1; delay(1500); } else if((rfid.serNum[0] == 18 rfid.serNum[1] == 130 rfid.serNum[2] == 144 rfid.serNum[3] == 85 rfid.serNum[4] == 85 ) (count==1)){ digitalWrite(8,LOW); count=0; delay(1500); } } } rfid.halt(); }