PN532 не обнаруживает RFID-карту при подключении к ESP32 в режиме I2C, но отлично работает с Arduino Uno

У меня есть модуль Elechhouse PN532 (купленный здесь - https://robu.in/product/pn532-nfc-rfid-read-write-module-v3-kit /). Когда я пытаюсь подключиться к нему с помощью I2C и подключить его к моему ESP32 (DOIT ESP32 DEV KIT V1, версия с 30 выводами), PN532 обнаруживается, но он не обнаруживает, когда ему показывают карту или токен. Когда я пробую точно такой же код с Arduino Uno с I2C, он работает безупречно. Ниже приведены соединения для обеих плат, код, выходные данные и фактическое изображение подключения (поскольку для PN532 имеет значение некоторое указанное положение проводов).

Соединения

  • ESP32
ESP32 PN532
GPIO 22 SCL
GPIO 21 ПДД
3,3 В VCC
ВНД ВНД
  • Arduino Uno
Uno PN532
A5 SCL
А4 ПДД
3,3 В VCC
ВНД ВНД

Кодекс

#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>

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

void setup(void) {
  Serial.begin(115200);        
  //Wire.begin(21, 22); // используется эта линия только при подключении к ESP32
  Serial.println("Hello!");

  pn532i2c.wakeup();    //задержка 500 мс
  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");
}

void loop(void) {
  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Буфер для хранения возвращенного UID
  uint8_t uidLength;                        // Длина идентификатора пользователя (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");
  }
}

Выходной сигнал

  • Для Arduino Uno
  • Для ESP32

Места размещения соединений

  • Для Arduino Uno

  • Для ESP32

Кроме того, конфигурация ESP32 в Arduino IDE

, 👍1

Обсуждение

PN532 требует растягивания тактовой частоты I2C. Он плохо работает по I2C с ESP8266 или ESP32 (у Adafruit он работает с ESP32 при определенных условиях - используя прерывание и являясь единственным устройством на шине I2C - вы можете попробовать [их драйвер] (https://github.com/adafruit/Adafruit-PN532 )). Ваше лучшее решение - подключить его через SPI, а не через I2C., @romkey

Есть ли подтягивания на плате? Я не знаю, включает ли arduino свои подтягивания в режиме I2C master, но я не вижу ничего на этих изображениях. Попробуйте включить их и использовать скетч I2CScanner для отладки., @Sim Son

@romkey При использовании моего PN532 с библиотекой Adafruit мне нужно подключить 6 контактов, верно? (VCC, GND, SDA, SCL, IRQ, RST), @Gagan G

@SimSon Я попробую с внешними подтягиваниями и еще кое-что, поскольку обнаруживается прошивка на PN532, не означает ли это, что I2C отлично работает между PN532 и ESP32 и не требует внешних подтягиваний? Я новичок в I2C, так что простите, если что-то нелогично., @Gagan G


1 ответ


1

Использование PN532, UART или SPI представляется хорошим выбором. Кроме того, маленькая красная плата нуждается в мощном источнике питания, а мощности источника питания из комплекта разработки ESP32 будет недостаточно; я рекомендую добавить конденсатор емкостью около 47 мкФ на PN532.

,