Проблема при считывании карты с помощью RFID/NFC ридера Troyka на Arduino

Добрый день, только начинаю знакомство с кодом и Arduino, а также дополнительными модулями. Собрал схему с Arduino и Troyka RFID/NFC модулем. Хочу попробовать запустить код из примера с документацией, но столкнулся с проблемой. Ридер вроде бы работает, дополнительные библиотеки от Adafruit поставил, и в код их тоже подключил.

При запуске кода, как есть, в монитор порта ничего не выводится вообще. Попробовал полностью убрать цикл со чтением карт. Получил вывод в serial monitor:

Found RFID/NFC reader
Waiting for a card ...

То есть ридер подключен и работает.

Вопрос тогда в этом куске, и как лучше его отладить и найти в чем проблема?

void loop(void)
{
  uint8_t success;
  // буфер для хранения ID карты
  uint8_t uid[8];
  // размер буфера карты
  uint8_t uidLength;
  // слушаем новые метки
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  // если найдена карта
  if (success) {
    // выводим в консоль полученные данные
    Serial.println("Found a card");
    Serial.print("ID Length: ");
    Serial.print(uidLength, DEC);
    Serial.println(" bytes");
    Serial.print("ID Value: ");
    nfc.PrintHex(uid, uidLength);
    Serial.println("");
    delay(1000);
  }
}

Пробовал убирать все, и оставить только вывод в порт текста, если карта найдена, если нет, то выводить ошибку. Но все равно не работает. В чем может быть еще проблема? Спасибо.

Ээээ… Setup типа лишний? Ну тогда ой…
Поищите как правильно подключить библиотеки, поставьте старую версию программы. Измените имя нужной вам библиотеки и поменяйте ее в коде на соответствующее.

Нет, убрал только void loop(void) весь. Библиотеки подключены

#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <Adafruit_I2CRegister.h>
#include <Adafruit_SPIDevice.h>
#include <Wire.h>
#include <SPI.h>
// библиотека для работы с RFID/NFC
#include <Adafruit_PN532.h>

@maximstudent , если хотите глум, - Вы его получите.
А если не хотите, вопрос надо задавать по следующей схеме:

  • Опубликовать полный код (полный, а не отдельные фрагменты из него).
  • Опубликовать схему (свою, а не похожую из И-нета).
  • Описать проблему:
  1. Что должен делать скетч.
    2.Что он на самом деле делает.
  2. Чем 2 отличается от 1.
  • Полный код:
#include <Adafruit_BusIO_Register.h>
#include <Adafruit_I2CDevice.h>
#include <Adafruit_I2CRegister.h>
#include <Adafruit_SPIDevice.h>

#include <Wire.h>
#include <SPI.h>
// библиотека для работы с RFID/NFC
#include <Adafruit_PN532.h>
 
// пин прерывания
#define PN532_IRQ   9
// создаём объект для работы со сканером и передаём ему два параметра
// первый — номер пина прерывания
// вторым — число 100
// от Adafruit был программный сброс шилда 
// в cканере RFID/NFC 13,56 МГц (Troyka-модуль) этот пин не используется
// поэтому передаём цифру, большая чем любой пин Arduino
Adafruit_PN532 nfc(PN532_IRQ, 100);
 
void setup(void)
{
  Serial.begin(9600);
  // инициализация RFID/NFC сканера
  nfc.begin();
  int versiondata = nfc.getFirmwareVersion();
  if (!versiondata) {
    Serial.print("Didn't find RFID/NFC reader");
    while(1) {
    }
  }
 
  Serial.println("Found RFID/NFC reader");
  // настраиваем модуль
  nfc.SAMConfig();
  Serial.println("Waiting for a card ...");
}
 
void loop(void)
{
  uint8_t success;
  // буфер для хранения ID карты
  uint8_t uid[8];
  // размер буфера карты
  uint8_t uidLength;
  // слушаем новые метки
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
  // если найдена карта
  if (success) {
    // выводим в консоль полученные данные
    Serial.println("Found a card");
    Serial.print("ID Length: ");
    Serial.print(uidLength, DEC);
    Serial.println(" bytes");
    Serial.print("ID Value: ");
    nfc.PrintHex(uid, uidLength);
    Serial.println("");
    delay(1000);
  }
}
  • Схема примитивная:

  • Проблема:
    При выполнении кода на Arduino в монитор порта ничего не выводится. Код должен определить, что ридер rfid/nfc подключен и ожидает сканирования карт/меток. При сканировании карты, выводить в монитор порта информацию о ней.

Сейчас, в serial monitor вообще ничего не выводиться. Если убрать все, что в цикле void loop(void), то выводится информация, что ридер обнаружен и подключен.

Сделайте самое тупое, перед строкой 23 поставьте задержку 10 сек , чтобы успеть после включения запустить сериал монитор. Что-то поменялось? Появляются строки в мониторе? Из строк 27-36.
Если отключить ридер, появляется ошибка, что ридер не подключен?
Посли строки 59 поставьте задержку 2-5 сек и что-нибудь печатайте в порт, просто проверить попадаете в петлю или где-то повисли.
У вас вообще ключ подходит к ридеру? нет ни одного сообщения в коде, что ридер не может прочитать карту.
Попробуйте в петле выводить только строку 26, соответственно перепишите ее под петлю. Нужно понять , в каком месте кривулина, в железе или библиотеках. Ну или может у кого сей девайс в наличии, так чего умнее подскажет

Спасибо, без строки nfc.PrintHex(uid, uidLength); все работает. Хотя если только ее оставить, uid удается считать с карты. Пойду дальше разбираться.

Коллеги, подскажите такой момент: Спаял схему на ардуино и NFC module V3. банковские карты читает, метки , брелки и тп. Задача - управлять электрозамком на калитке. Все работает, детям купил браслеты типа как в аквапарке, жене на брелок от ключей метку приклеил, красота ! Но вот мне захотелось со смартфона открывать калитку. Типа приложил и по-красоте зашел. И тут столкнулся с проблемой - Каждый раз прикладывая смартфон к считывателю - получаю разные данные. Всего 4 байта, первый всегда восьмерка. Остальные 3 меняются по какому-то случайному алгоритму чтоли. Вот хотелось бы понять что за алгоритм и можно ли им допилить существующий девайс. Ну и вообще, в целом, почему смартфон меняет их.

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

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