Go Down

Topic: 2 módulos RFID MFRC522 e Arduino Mega (Read 1 time) previous topic - next topic

ViniciusMoscardini

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á.

luisilva

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

ViniciusMoscardini

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.

luisilva

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?

ViniciusMoscardini

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.


ViniciusMoscardini

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á.

jairoofilho

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

https://youtu.be/HmGmFknAIqc

alkuentrus

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

Go Up