Несколько 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.
Заранее благодарю вас.
@masterleo, 👍1
Обсуждение2 ответа
Для удобства, вот комментарий: Вы написали: “Я пробовал приведенный выше код, но он не сработал”. Этого недостаточно, чтобы передать, что произошло и что вы хотели, чтобы произошло. Пожалуйста, отредактируйте свой вопрос, чтобы включить четкое описание симптомов и желаемых результатов.
Теперь перейдем к ответу.
Из “Я использую только 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
после примерно миллиона попыток и попыток я обнаружил, что правильный способ подключения 4 RFID RC522-это поместить их в одну строку на тестовой плате, за исключением контактов SS, и код, как обычно, считывается с помощью считывателя из библиотеки RFID ... вроде этого:
да, именно так работает SPI. вы можете прочитать об этом в википедии, но тема вопроса выше другая. ОП действительно знает, как связаться с читателями. они не спрашивают о проводке., @Juraj
Этот способ решил ту же проблему, потому что, если вы не разместите их в одной строке на тестовой плате, вы не получите достаточного тока для 2 или 3 из них., @هبة الجبه جي
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- rfid_default_keys проверить с помощью RC522
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- MFRC522: прошивка неизвестна
- MFRC522 не сканируется карта
- Поддерживают ли чипы ATMega 328/2560 JTAG-программатор и аппаратный отладчик?
Я не вижу кода, @Mazaryk
@Mazaryk Привет ! Я рад, что ты здесь, чтобы помочь сообществу ^^. Код был добавлен. Наслаждайтесь :D, @masterleo
Вы можете использовать аналоговые контакты в качестве цифровых. Вам не нужно использовать " аналоговую запись`. Кроме того, ваш код может быть намного короче с массивами и циклами., @gre_gor
Я работаю над схемой для тебя, фриц <3, @masterleo
@gre_gor Это действительно хорошая идея ! Попробую сделать это завтра, когда вернусь в свой местный Фаблаб., @masterleo
Я заметил, что эта проблема очень распространена. Взгляните сюда : https://github.com/miguelbalboa/rfid/issues/290, @masterleo