2 módulos RFID MFRC522 e Arduino Mega

Boa Tarde,

Por favor, como eu teria que gerenciar a comunicação SPI, para conseguir fazer dois módulos RFID MFRC522 comunicarem-se ao mesmo tempo com um arduino Mega?

Tentei duplicar o código do tutorial abaixo, mas provavelmente os dois módulos estão ficando ligados ao mesmo tempo.

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

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

LiquidCrystal lcd(6, 7, 5, 4, 3, 2);

char st[20];

void setup()
{
Serial.begin(9600); // Inicia a serial
SPI.begin(); // Inicia SPI bus
mfrc522.PCD_Init(); // Inicia MFRC522
Serial.println("Aproxime o seu cartao do leitor...");
Serial.println();
//Define o número de colunas e linhas do LCD:
lcd.begin(16, 2);
mensageminicial();
}

void loop()
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
//Mostra UID na serial
Serial.print("UID da tag :");
String conteudo= "";
byte letra;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte < 0x10 ? " 0" : " ");
_ Serial.print(mfrc522.uid.uidByte*, HEX);_
_ conteudo.concat(String(mfrc522.uid.uidByte < 0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522.uid.uidByte, HEX));
}
Serial.println();
Serial.print("Mensagem : ");
conteudo.toUpperCase();
if (conteudo.substring(1) == "ED 78 03 CA") //UID 1 - Chaveiro*

* {
Serial.println("Ola FILIPEFLOP !");
Serial.println();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ola FILIPEFLOP !");
lcd.setCursor(0,1);
lcd.print("Acesso liberado!");
delay(3000);
mensageminicial();
}*_

* if (conteudo.substring(1) == "BD 9B 06 7D") //UID 2 - Cartao*
* {*
* Serial.println("Ola Cartao !!!");*
* Serial.println();*
* lcd.clear();*
* lcd.setCursor(0,0);*
* lcd.print("Ola Cartao !");*
* lcd.setCursor(0,1);*
* lcd.print("Acesso Negado !");*
* delay(3000);*
* mensageminicial();*
* }*
}

void mensageminicial()
{
* lcd.clear();*
* lcd.print(" Aproxime o seu"); *
* lcd.setCursor(0,1);*
* lcd.print("cartao do leitor"); *
}
Já tentei gerenciar os pinos de chip select, conferi os pinos de ligação do SPI (pois o do Mega é diferente), mas por enquanto nada deu certo.
Agradeço desde já.

Ao mesmo tempo não dá. Tem que comunicar com um dos dispositivos (seleccionando-o através do chip select), e posteriormente com os outro (desactivando o primeiro e activando o CS do segundo).

Sim, é um de cada vez mesmo através do Chip Select. Porém, todas as minhas tentativas de gerenciar o CS fracassaram. Não sei se a biblioteca suporta o que desejo fazer. E também não achei ninguém que tenta usado 2 dispositivos com SPI em um arduino apenas.

No código que postou (já agora existe uma forma de postar código aqui no no fórum, depois de colar deve seleccionar todo o código e clicar no primeiro botão que aparece na barra de ferramentas '</>'), apenas está um dispositivo. Como estava a fazer com os 2?

Quando comento essa parte do código, funciona um módulo.

// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent() )
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial() )
{
return;
}

Quando comento essa, funciona o outro módulo.

// Look for new cards
if ( ! mfrc522_2.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522_2.PICC_ReadCardSerial())
{
return;
}

Esse é o código inteiro:

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

#define SS_PIN 53
#define RST_PIN 9
#define SS_PIN2 48
#define RST_PIN2 49

MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522 mfrc522_2(SS_PIN2, RST_PIN2); // Create MFRC522 instance.

LiquidCrystal lcd(6, 7, 5, 4, 3, 2);

char st[20];

int row=0;

void setup()
{
Serial.begin(9600); // Inicia a serial
SPI.begin(); // Inicia SPI bus
mfrc522.PCD_Init();
mfrc522_2.PCD_Init(); // Inicia MFRC522
Serial.println("CLEARDATA");
Serial.println("LABEL,Time,TAG");
//Define o número de colunas e linhas do LCD:
lcd.begin(16, 2);
mensageminicial();
pinMode(30,OUTPUT);
pinMode(31,OUTPUT);
pinMode(32,OUTPUT);
pinMode(33,OUTPUT);
pinMode(26,OUTPUT);
pinMode(28,OUTPUT);

digitalWrite(26,HIGH);
digitalWrite(28,HIGH);

}

void loop()
{

// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent() )
{
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial() )
{
return;
}

// Look for new cards
if ( ! mfrc522_2.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards
if ( ! mfrc522_2.PICC_ReadCardSerial())
{
return;
}

//Mostra UID na serial
Serial.print("DATA,TIME,");
String conteudo= "";
byte letra;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte < 0x10 ? " 0" : " ");
_ Serial.print(mfrc522.uid.uidByte*, HEX);_
_ conteudo.concat(String(mfrc522.uid.uidByte < 0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522.uid.uidByte, HEX));
}_

for (byte i = 0; i < mfrc522_2.uid.size; i++)
_ {_
Serial.print(mfrc522_2.uid.uidByte < 0x10 ? " 0" : " ");
Serial.print(mfrc522_2.uid.uidByte, HEX);
conteudo.concat(String(mfrc522_2.uid.uidByte < 0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522_2.uid.uidByte, HEX));
_ }*_

* Serial.println();*
* conteudo.toUpperCase();*
* if (conteudo.substring(1) == "E1 DC D0 0E")*
* {*
* Serial.println("OSCILOSCOPIO!");*
* Serial.println();*
* lcd.clear();*
* lcd.setCursor(0,0);*
* lcd.print("OSCILOSCOPIO!");*
* lcd.setCursor(0,1);*
* lcd.print("ACESSO LIBERADO!");*
* digitalWrite(30,HIGH);*
* digitalWrite(31,HIGH);*
* digitalWrite(28,LOW);*
* delay(3000);*
* digitalWrite(30,LOW);*
* digitalWrite(31,LOW);*
* digitalWrite(28,HIGH);*
* mensageminicial();*
* }*

* if (conteudo.substring(1) == "71 15 D9 0E")*
* {*
* Serial.println("MULTIMETRO!");*
* Serial.println();*
* lcd.clear();*
* lcd.setCursor(0,0);*
* lcd.print("MULTIMETRO!");*
* lcd.setCursor(0,1);*
* lcd.print("ACESSO NEGADO!");*
* digitalWrite(32,HIGH);*
* digitalWrite(33,HIGH);*
* digitalWrite(26,LOW);*
* delay(3000);*
* digitalWrite(32,LOW);*
* digitalWrite(33,LOW);*
* digitalWrite(26,HIGH);*
* mensageminicial();*
* }*
}

void mensageminicial()
{
* lcd.clear();*
* lcd.print(" Aproxime o seu"); *
* lcd.setCursor(0,1);*
* lcd.print("cartao do leitor"); *
}
Desculpe, não consegui usar o botão da barra de ferramentas.

Por favor, alguém teria alguma dica para que eu consiga fazer essa implementação de 2 módulos RFID com um arduino?

Agradeço desde já.

Achei esse vídeo. Ainda não testei. Mas aparentemente é funcional.

Esse tópico está morto há.... 4 anos e 3 meses...