Не работает 1 из 4 модулей RFID RC522 подключенных к Nano

markendroid

✩✩✩✩✩✩✩
15 Фев 2022
2
0
Добрый день!

Подключил по классической схеме (RST - D10, MOSI - D11, MISO - D12, SCK - D13), все выводы параллельно, кроме SDA (D6 - D9). Мой модуль на 6 пине не работает. (Сейчас он на D7 - не работает (попытка проверить пин ардуино)). Вот пример кода из библиотеки GitHub для этих модулей, который я подправил под 4 модуля (пробовал и другие примеры).

Пример с github страницы библиотеки MFRC522 На подключение нескольких модулей, немного измененный под 4 модуля.:
#include <SPI.h>
#include <MFRC522.h>


#define RST_PIN         10          // Configurable, see typical pin layout above

#define SS_1_PIN        6         // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 2
#define SS_2_PIN        7          // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 1
#define SS_3_PIN        8
#define SS_4_PIN        9

#define NR_OF_READERS   4

byte ssPins[] = {SS_1_PIN, SS_2_PIN, SS_3_PIN, SS_4_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

/**

* Initialize.

*/

void setup() {



  Serial.begin(9600); // Initialize serial communications with the PC

  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

  SPI.begin();        // Init SPI bus

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {

    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card

    Serial.print(F("Reader "));

    Serial.print(reader);

    Serial.print(F(": "));

    mfrc522[reader].PCD_DumpVersionToSerial();

  }

}



/**

* Main loop.

*/

void loop() {

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {

    // Look for new cards
    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {

      Serial.print(F("Reader "));

      Serial.print(reader);

      // Show some details of the PICC (that is: the tag/card)

      Serial.print(F(": Card UID:"));

      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);

      Serial.println();

      Serial.print(F("PICC type: "));

      MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);

      Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));



      // Halt PICC

      mfrc522[reader].PICC_HaltA();

      // Stop encryption on PCD

      mfrc522[reader].PCD_StopCrypto1();

    } //if (mfrc522[reader].PICC_IsNewC

  } //for(uint8_t reader

}
/**

* Helper routine to dump a byte array as hex values to Serial.

*/

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);

  }
}
Что получаю в COM:

Reader 0: Firmware Version: 0x82
Reader 1: Firmware Version: 0xB2 (тот самый нерабочий модуль)
Reader 2: Firmware Version: 0x82
Reader 3: Firmware Version: 0x82

Рабочие модули выводят 0x82, читают, записывают. Что я пытался сделать для решения проблемы:
  • Попробовал два новых модуля вместо нерабочего
  • Заменил кабель (использую витую пару для этих модулей длиной 1 метр)
  • Я проверил все соединения и не обнаружил ошибок. Максимальное сопротивление между модулями и контактами Arduino составило 0,1 Ом.
  • Чат GPT подсказал, что один из модулей может создавать помехи на линии MOSI. Я физически отключал по очереди каждый работающий модуль от линии MOSI — в терминале тот же код (0xB2), даже после отключения всех модулей. Остальные теперь показывают 0x0.
Ничего не помогает, вторые сутки борюсь с проблемой.

Думал может проблема в питании, и нужно стабилизатор на 3.3 поставить, но тогда бы не было бы проблем только с одним конкретным, да ведь?
 

markendroid

✩✩✩✩✩✩✩
15 Фев 2022
2
0
Код немного изменил. Добавил перед инициализацией код на отключение всех модулей (все SDA пины на HIGH). Теперь нерабочий модуль выдает 0x90, но он все еще нерабочий(
Добавил отключение модулей перед инициализацией:
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         10          // Configurable, see typical pin layout above
#define SS_1_PIN        6         // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 2
#define SS_2_PIN        7          // Configurable, take a unused pin, only HIGH/LOW required, must be different to SS 1
#define SS_3_PIN        8
#define SS_4_PIN        9

#define NR_OF_READERS   4

byte ssPins[] = {SS_1_PIN, SS_2_PIN, SS_3_PIN, SS_4_PIN};

MFRC522 mfrc522[NR_OF_READERS];   // Create MFRC522 instance.

/**
 * Initialize.
 */
void setup() {

  Serial.begin(9600); // Initialize serial communications with the PC
  while (!Serial);    // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)

  SPI.begin();        // Init SPI bus1
  delay(250);
  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
   pinMode(ssPins[reader], OUTPUT);
   digitalWrite(ssPins[reader], HIGH);
   }

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    mfrc522[reader].PCD_Init(ssPins[reader], RST_PIN); // Init each MFRC522 card
    Serial.print(F("Reader "));
    Serial.print(reader);
    Serial.print(F(": "));
    mfrc522[reader].PCD_DumpVersionToSerial();
  }
}

/**
 * Main loop.
 */
void loop() {

  for (uint8_t reader = 0; reader < NR_OF_READERS; reader++) {
    // Look for new cards

    if (mfrc522[reader].PICC_IsNewCardPresent() && mfrc522[reader].PICC_ReadCardSerial()) {
      Serial.print(F("Reader "));
      Serial.print(reader);
      // Show some details of the PICC (that is: the tag/card)
      Serial.print(F(": Card UID:"));
      dump_byte_array(mfrc522[reader].uid.uidByte, mfrc522[reader].uid.size);
      Serial.println();
      Serial.print(F("PICC type: "));
      MFRC522::PICC_Type piccType = mfrc522[reader].PICC_GetType(mfrc522[reader].uid.sak);
      Serial.println(mfrc522[reader].PICC_GetTypeName(piccType));

      // Halt PICC
      mfrc522[reader].PICC_HaltA();
      // Stop encryption on PCD
      mfrc522[reader].PCD_StopCrypto1();
    } //if (mfrc522[reader].PICC_IsNewC
  } //for(uint8_t reader
}

/**
 * Helper routine to dump a byte array as hex values to Serial.
 */
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);
  }
}
 

Bruzzer

★★★★✩✩✩
23 Май 2020
687
210
@markendroid,
Не понятно. Если у вас есть проблемный модуль, почему вы проверяете его работоспособность в скетче для 4-х устройств.
Поверьте его в скетче для одного модуля. При проверке, питание 3.3 В подавайте не с NANO, а с отдельного источника питания, или если есть UNO то запустите скетч на UNO. На NANO выход 3.3 В имеет малую нагрузочную способность. На UNO стоит отдельный преобразователь для 3.3 В

Я не работал с MFRC522. Это общие рекомендации.