Форумы » Arduino » Общие вопросы по Arduino

RFID-RC522 с ардуиной уно

veter900


Сообщений: 33

отправлено 24 Март 2017 в 21:52

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

alfacom


Сообщений: 45

отправлено 01 Май 2017 в 17:36

Например здесь - http://arthurphdent.livejournal.com/1759.html раздел 3 и 4. Надеюсь, ваши домофонные чипы поддерживают перезапись данных и/или идентификатора?

veter900


Сообщений: 33

отправлено 03 Май 2017 в 09:55

дайте ещё раз ссылку а то не открываеться вообще

veter900


Сообщений: 33

отправлено 03 Май 2017 в 09:56

http://arthurphdent.livejournal.com  может вот эта сссылка?

veter900


Сообщений: 33

отправлено 03 Май 2017 в 10:28

вот это вроде,спасибо буду лазить проверять потом напишу подошло для кольца или нет
ПодключениеНекоторые столкнуться с проблемой - название пинов в большинстве уроков и руководств может не соответствовать распиновке на вашем модуле. Если в скетчах указан пин SS, а на вашем модуле его нет, то скорее всего он помечен как SDA. Ниже я приведу таблицу подключения модуля для самых распространенных плат.MFRC522Arduino UnoArduino MegaArduino Nano v3Arduino Leonardo/MicroArduino Pro MicroRST95D9RESET/ICSP-5RSTSDA(SS)1053D101010MOSI11 (ICSP-4)51D11ICSP-416MISO12 (ICSP-1)50D12ICSP-114SCK13 (ICSP-3)52D13ICSP-3153.3V3.3V3.3VСтабилизатор 3,3ВСтабилизатор 3,3ВСтабилизатор 3,3ВGNDGNDGNDGNDGNDGND
Пины управления SS(SDA) и RST задаются в скетче, так что если ваша плата отличается от той, что я буду использовать в своих примерах, а использую я UNO R3, указывайте пины из таблицы в начале скетча:
#define SS_PIN 10
#define RST_PIN 9


5.jpg
Пример №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 метки, в мониторе последовательного порта увидим следующее:
1.jpgЗдесь я считывал 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 байт данных.
2.jpg3.jpg
Пример №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);
}
}




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

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

veter900


Сообщений: 33

отправлено 03 Май 2017 в 13:39

здесь выдаёт ошибку какие то библиотеки нужно включать только какие?

veter900


Сообщений: 33

отправлено 04 Май 2017 в 10:27

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

Для того, чтобы написать сообщение в тему, необходимо авторизоваться!