Несколько RFID-считывателей MFRC522 на ошибках Uno

У меня проблема!

Мне нужно подключить 5 считывателей MFRC522 к Arduino Uno, но это не работает !

С одним или двумя модулями MFRC522 это работает, когда я использую три или более, больше ничего не работает... Последовательное считывание не работает, ничто не считывается более чем с 2 модулями. Мне так грустно. Поэтому сегодня вечером мне нужна ваша помощь, скажите мне, что не работает в моем коде или в моей настройке!

Сначала я подумал, что это Arduino не обеспечивает достаточный ток для модулей (на линии 3,3 В), но, похоже, это не так. Мы добавили некоторое внешнее питание блока питания ATX и подключили заземление. Ничего не изменилось.

Итак, мы посмотрели на код и считаем, что это проблема библиотеки. Похоже, никто не смог успешно подключить более 3 модулей MFRC522. Действительно ли в библиотеке есть проблема? Как мы могли бы добиться успеха?

#include <SPI.h>
#include <MFRC522.h>
#include <EEPROM.h>

#define SS_PIN_1 10 // PIN SDA pour le module RFID (1)
#define RST_PIN_1 9 // PIN RESET pour le module RFID (1)
#define SS_PIN_2 8 // PIN SDA pour le module RFID (2)
#define RST_PIN_2 7 // PIN RESET pour le module RFID (2)
#define SS_PIN_3 6 // PIN SDA pour le module RFID (3)
#define RST_PIN_3 5 // PIN RESET pour le module RFID (3)
#define SS_PIN_4 4 // PIN SDA pour le module RFID (4)
#define RST_PIN_4 3 // PIN RESET pour le module RFID (4)
#define SS_PIN_5 2 // PIN SDA pour le module RFID (5)
#define RST_PIN_5 A0 // PIN RESET pour le module RFID (5)
#define RELAY_PIN A1 // Pin du signal du Relais
#define RELAY_ON 1024 // Valeur de seuil d'activation du relais
#define RELAY_OFF 0 // Valeur de seuil de désactivation du relais
#define MASTER_BUTTON_PIN A2 // Pin du bouton d'ouverture prioritaire
#define CONFIGURE_BUTTON_PIN A3 // Pin du bouton de reprogrammation des badges
MFRC522 rfid1(SS_PIN_1, RST_PIN_1);
MFRC522 rfid2(SS_PIN_2, RST_PIN_2);
MFRC522 rfid3(SS_PIN_3, RST_PIN_3);
MFRC522 rfid4(SS_PIN_4, RST_PIN_4);
MFRC522 rfid5(SS_PIN_5, RST_PIN_5);
byte tag1[4] = {0xD6, 0x92, 0xBF, 0x93};
byte tag2[4] = {0xC6, 0xA3, 0xC0, 0x93};
byte tag3[4] = {0x96, 0x58, 0x68, 0x8E};
byte tag4[4] = {0x06, 0xFB, 0xC1, 0x93};
byte tag5[4] = {0x66, 0xF3, 0x63, 0x8E};

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid1.PCD_Init();
  rfid2.PCD_Init();
  rfid3.PCD_Init();
  rfid4.PCD_Init();
  rfid5.PCD_Init();
  Serial.println("Initialisation du système terminé, en attente de badges...");
}

void activate_relay(){
  analogWrite(RELAY_PIN, RELAY_ON);
  Serial.println("Le relay est activé");
}

void desactivate_relay(){
  analogWrite(RELAY_PIN, RELAY_OFF);
  Serial.println("Le relay est désactivé");
}

void loop() {
  if (! rfid1.PICC_IsNewCardPresent()) {
    return;
  }
  if (! rfid1.PICC_ReadCardSerial()) {
    return;
  }
  if (! rfid2.PICC_IsNewCardPresent()) {
    return;
  }
  if (! rfid2.PICC_ReadCardSerial()) {
    return;
  }
   if (! rfid3.PICC_IsNewCardPresent()) {
    return;
  }
  if ( ! rfid3.PICC_ReadCardSerial()) {
    return;
  }
   if (! rfid4.PICC_IsNewCardPresent()) {
    return;
  }
  if ( ! rfid4.PICC_ReadCardSerial()) {
    return;
  }
   if (! rfid5.PICC_IsNewCardPresent()) {
    return;
  }
  if ( ! rfid5.PICC_ReadCardSerial()) {
    return;
  }
  if (rfid1.uid.uidByte[0] == tag1[0]  & rfid1.uid.uidByte[1] == tag1[1] & rfid1.uid.uidByte[2] == tag1[2] & rfid1.uid.uidByte[3] == tag1[3]) {
    if (rfid2.uid.uidByte[0] == tag2[0]  & rfid2.uid.uidByte[1] == tag2[1] & rfid2.uid.uidByte[2] == tag2[2] & rfid2.uid.uidByte[3] == tag2[3]) {
      if (rfid3.uid.uidByte[0] == tag3[0]  & rfid3.uid.uidByte[1] == tag3[1] & rfid3.uid.uidByte[2] == tag3[2] & rfid3.uid.uidByte[3] == tag3[3]) {
        if (rfid4.uid.uidByte[0] == tag4[0]  & rfid4.uid.uidByte[1] == tag4[1] & rfid4.uid.uidByte[2] == tag4[2] & rfid4.uid.uidByte[3] == tag4[3]) {
          if (rfid5.uid.uidByte[0] == tag5[0]  & rfid5.uid.uidByte[1] == tag5[1] & rfid5.uid.uidByte[2] == tag5[2] & rfid5.uid.uidByte[3] == tag5[3]) {
          } else {desactivate_relay();}
        } else {desactivate_relay();}
      } else {desactivate_relay();}
    } else {desactivate_relay();}
  } else {desactivate_relay();}
}

Я попробовал приведенный выше код, но он не сработал. Я также попробовал пример кода ReadUidMultiReader, но работает только один считыватель. Оба считывателя работают индивидуально, но только один, когда я их подключаю. Я использовал SCK, MISO, MOSI, RST, и у меня разные контакты SS.

Заранее благодарю вас.

, 👍1

Обсуждение

Я не вижу кода, @Mazaryk

@Mazaryk Привет ! Я рад, что ты здесь, чтобы помочь сообществу ^^. Код был добавлен. Наслаждайтесь :D, @masterleo

Вы можете использовать аналоговые контакты в качестве цифровых. Вам не нужно использовать " аналоговую запись`. Кроме того, ваш код может быть намного короче с массивами и циклами., @gre_gor

Я работаю над схемой для тебя, фриц <3, @masterleo

@gre_gor Это действительно хорошая идея ! Попробую сделать это завтра, когда вернусь в свой местный Фаблаб., @masterleo

Я заметил, что эта проблема очень распространена. Взгляните сюда : https://github.com/miguelbalboa/rfid/issues/290, @masterleo


2 ответа


5

Для удобства, вот комментарий: Вы написали: “Я пробовал приведенный выше код, но он не сработал”. Этого недостаточно, чтобы передать, что произошло и что вы хотели, чтобы произошло. Пожалуйста, отредактируйте свой вопрос, чтобы включить четкое описание симптомов и желаемых результатов.

Теперь перейдем к ответу.

Из “Я использую только 2 читателя, чтобы найти правильный и заставить его работать”, я делаю вывод, что у вас есть два читателя. Этого самого по себе достаточно, чтобы код не выдавал выходные данные. Предполагая, что эти два считывателя идентифицируются как rfid1 и rfid2, когда выполнение доходит до if ( ! rfid3.PICC_IsNewCardPresent()), он выполняет возврат; который завершает обработку цикла (). То есть выполнение никогда не пройдет, если ( ! rfid3.PICC_IsNewCardPresent()). Чтобы устранить эту проблему, удалите весь код, который ссылается на переменные rfid, отличные от rfid1 и rfid2 (правильнее, кроме тех двух, которые вы прикрепили).

Это повлечет за собой удаление 18 строк в ранней части цикла ()и трех строк в большой вложенной части цикла().

Вот еще один комментарий: когда вы отлаживаете код, имеет смысл сообщать о большом количестве промежуточных результатов и сообщать о них, как только они будут доступны. Не просматривайте длинную стопку операторов if и не получайте выходных данных, а затем говорите, что это не работает; вместо этого отображайте и проверяйте результаты, когда вы их впервые прочитаете.

,

Я поддержал этот вопрос, когда он помогал мне, но теперь я не могу отказаться от голосования ? веб-сайт stange. Проект по-прежнему не работает., @masterleo

“все еще не работает” не говорит о том, что произошло и что вы хотите, чтобы произошло. Пожалуйста, отредактируйте свой вопрос, чтобы включить четкое описание симптомов и желаемых результатов. Вы отредактировали вопрос, чтобы добавить диаграмму, но все равно просто сказали "не сработало" вместо чего-либо о промежуточных результатах. * Представление о том, что вы должны отменить это, которое раньше помогало, но теперь не помогает, потому что вы что-то изменили, извращено. Это обескураживает меня от дальнейших ответов: Если я отредактирую свой ответ, вы можете изменить свой голос; так что сейчас я его не изменю и, вероятно, не буду отвечать дальше. Ну что ж., @James Waldby - jwpat7

Тем не менее, вы можете написать новый вопрос с четким описанием симптомов, желаемых результатов, текущего кода и распечатки промежуточных значений., @James Waldby - jwpat7

Нет, не волнуйтесь, я не буду голосовать против вашего вопроса, поэтому я отредактирую свой вопрос и сделаю лучшую схему., @masterleo

Хорошо, отлично. Печать промежуточных значений, вероятно, была бы наиболее полезным элементом для добавления. Кроме того, последовательность из 10 операторов "if (...) { return;}" такова, что если какой-либо из этих тестов завершится неудачей, вы вернетесь из "цикла ()" без дальнейшей обработки на этом проходе. Вместо этого вы могли бы установить переменные состояния (или биты состояния в слове), чтобы, по крайней мере, что-то сообщалось., @James Waldby - jwpat7


0

после примерно миллиона попыток и попыток я обнаружил, что правильный способ подключения 4 RFID RC522-это поместить их в одну строку на тестовой плате, за исключением контактов SS, и код, как обычно, считывается с помощью считывателя из библиотеки RFID ... вроде этого:

,

да, именно так работает SPI. вы можете прочитать об этом в википедии, но тема вопроса выше другая. ОП действительно знает, как связаться с читателями. они не спрашивают о проводке., @Juraj

Этот способ решил ту же проблему, потому что, если вы не разместите их в одной строке на тестовой плате, вы не получите достаточного тока для 2 или 3 из них., @هبة الجبه جي