Проблема «Не найдена плата PN53x» Считыватель карт Arduino NFC

Я использую RFID-модуль elechouse PN532 с Wemos D1 mini в Arduino IDE. Я использую пример ISO1443a_uid из библиотеки elechouse. Все работает нормально, если я подключаю USB-кабель к wemos и демо-версия запускается. Но если я нажму кнопку сброса на Wemos D1 mini, серийный номер выведет этот вывод:

load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v0fd86a07
~ld
Hello!
Didn't find PN53x board

Иногда все работает нормально, но в основном возникает эта ошибка.

Вот пример кода (я использую режим I2C):

* When the number after #if set as 1, it will be switch to SPI Mode*/
if 0
 #include <SPI.h>
 #include <PN532_SPI.h>
 #include "PN532.h"

 PN532_SPI pn532spi(SPI, 10);
 PN532 nfc(pn532spi);

* When the number after #elif set as 1, it will be switch to HSU Mode*/
elif 0
 #include <PN532_HSU.h>
 #include <PN532.h>

 PN532_HSU pn532hsu(Serial1);
 PN532 nfc(pn532hsu);

* When the number after #if & #elif set as 0, it will be switch to I2C Mode*/
else 
 #include <Wire.h>
 #include <PN532_I2C.h>
 #include <PN532.h>
 #include <NfcAdapter.h>

 PN532_I2C pn532i2c(Wire);
 PN532 nfc(pn532i2c);
endif

oid setup(void) {
 Serial.begin(115200);
 Serial.println("Hello!");
 pinMode(D2,INPUT_PULLUP);
 pinMode(D1,INPUT_PULLUP);  
 nfc.begin();

 uint32_t versiondata = nfc.getFirmwareVersion();
 if (! versiondata) {
   Serial.print("Didn't find PN53x board");
   while (1); // остановка
 }

 // Данные в порядке, распечатайте их!
 Serial.print("Found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); 
 Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC); 
 Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);

 // Установить максимальное количество повторных попыток чтения с карты
 // Это предотвратит вечное ожидание карты, которая
 // поведение PN532 по умолчанию.
 nfc.setPassiveActivationRetries(0xFF);

 // настроить плату для чтения RFID-меток
 nfc.SAMConfig();

 Serial.println("Waiting for an ISO14443A card");


oid loop(void) {
 boolean success;
 uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Буфер для хранения возвращенного UID
 uint8_t uidLength;                        // Длина UID (4 или 7 байт в зависимости от типа карты ISO14443A)

 // Ждем карты типа ISO14443A (Mifare и т.п.). Когда один найден
 // 'uid' будет заполнен UID, а uidLength будет указывать
 // если uid равен 4 байтам (Mifare Classic) или 7 байтам (Mifare Ultralight)
 success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

 if (success) {
   Serial.println("Found a card!");
   Serial.print("UID Length: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
   Serial.print("UID Value: ");
   for (uint8_t i=0; i < uidLength; i++) 
   {
     Serial.print(" 0x");Serial.print(uid[i], HEX); 
   }
   Serial.println("");
   // Подождите 1 секунду, прежде чем продолжить
   delay(1000);
 }
 else
 {
   // PN532, вероятно, истекло время ожидания карты
   Serial.println("Timed out waiting for a card");
 }

Что не так? почему не всегда работает после сброса?

, 👍0

Обсуждение

У меня был один из тех elechouse PN532, который сидел в ящике стола и ждал, пока появится нужный проект – вау!! они точно ненадежны в режиме I2C - немного меньше, когда я добавил подтягивающие резисторы к SCL и SDA - но в лучшем случае 50/50 - никогда не было проблем с этим в режиме SPI, @Jaromanda X

I2C на PN532, по крайней мере, с использованием библиотеки, которую вы используете, не очень надежен - даже с библиотекой adafruit и использованием контактов IRQ и RESET вероятность обнаружения платы составляет 50/50. Я перепробовал много вещей, чтобы заставить свою работать, и пришел к выводу, что мне следует использовать либо режим SPI, либо режим HSU — они на 100% надежны — и, поскольку мне когда-либо нужно будет только читать теги NFC, я думаю, что я буду придерживаться MFRC522, @Jaromanda X


1 ответ


1

ИЗМЕНИТЬ: Попробуйте использовать библиотеку Elechouse, у меня сработало лучше.


Это может быть неактуально, но я хотел поделиться.

У меня была похожая проблема, не связанная с кодом скетча.

Поэтому убедитесь:

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

  2. Под модулем NFC не должно быть проводов или они должны находиться на значительном расстоянии.

  3. Припаянные провода лучше работают с модулем NFC.

Стабильное рабочее состояние

,