Материал просмотрен 900 раз(а)

Всем привет! Вот я вернулся и опять за своё! Сегодня мы будем мастерить считыватель для RFID (Radio Frequency IDentification) карточке.

Нам понадобятся:

  1. Arduino Uno (или совместимая плата)
  2. RFID-ридер RC-522
  3. Несколько карточек от Метрополитена
  4. Соединительные провода

Кстати, на этот раз я начал собирать схемы на аналоге Arduino Uno R3 от RobotDyn, выполнен на аналогичном чипе, намного более бюджетный, чем итальянский Arduino, но так же прекрасно справляющийся со своими задачами.

Очень рекомендую, ссылка выше в списке. Правда пришлось установить дополнительно драйвер на порт CH341SER.zip

Макет

Макет

Пригодится так же библиотека для работы с ридером, качаем, распаковываем в каталог libraries среды разработки и получаем новые примеры использования. Берём штатный пример DumpInfo

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
while (!Serial);
SPI.begin();
mfrc522.PCD_Init();
ShowReaderDetails();
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("");
if ((v == 0x00) || (v == 0xFF)) {
Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
}
}

Компилим, заливаем скетч. Открываем монитор порта и прикладываем карточку к считывателю:

Дамп карточки

Дамп карточки

Копируем данные в WinHex и немного подсвечиваем нужные зоны:

whex

whex

  1. (жёлтая зона) 34 8F BC 49 91 30 66 – Уникальный идентификатор чипа.
  2. (коралловая зона) F0 00 – Блокировка блоков.
  3. (голубая зона) FF FF FF FC – OPT блоки однократного программирования.
  4. (зелёная зона) C8 DB DE 65 AD (на самом деле с небольшим урезанием на пол-байта с каждой стороны) 8 DB DE 65 A – в переводе на десятичный получим номер карточки 2378032730, он записан на самой картче (см. фото).
  5. (фиолетовая зона) 22 A0 (8864) – Дата покупки (количество дней, прошедших с 01.01.1992). Удобно рассчитать в Excel, в первую ячейку внести дату 01.01.1992, во вторую – формулу =A1+8864 и получим дату покупки билета. На самом деле у меня не очень точно определило (либо я карточки перепутал, либо так они были прошиты).
  6. Следом за датой идёт срок действиякарточки. 05 – пять суток. Я не выделил цветом. Это был билет на 2 поездки, похоже.
  7. (розовая зона) 00 – количество оставшихся поездок.
  8. (красная зона) F8 CA 36 D6 – контрольная сумма данных.
  9. (оранжевая зона) 22 A0 (8864) – Дата последнего прохода (так же количество дней с 1 января 92 года).
  10. (серая зона) дублирует предыдущие 4 строки.

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