Problema con lectores RFID

Hola a todos.

Estoy intentando desde hace semanas hacer que un Arduino UNO encienda un led verde cuando la tarjeta A esté en el lector A y la tarjeta B esté en el lector B o un led rojo en caso de que alguna tarjeta no sea la correcta. Funciona durante un rato, a veces durante horas o días y otras durante unos minutos; pero tarde o temprano se bloquea y deja de leer tarjetas.

He probado todo lo que se me ha ocurrido, como probar distintas maneras de hacer funcionar los lectores. He empezando el código desde 0 por si había algún error que por lo que sea no veía, pero siempre acaba bloqueándose. También lo he instalado en 4 Arduinos diferentes (entre ellos NANO y MEGA) con lectores diferentes y siempre obtengo el mismo resultado.

¿Alguien sabe qué puede estar mal en el código para que se bloquee?
Gracias de antemano.

#include <SPI.h>                //Incluye esta librería
#include <MFRC522.h>            //Incluye esta librería    

#define RST_PIN 9  //Define el pin que va a RST
#define pinA 10    //Define el pin que va a SDA del lector A
#define pinB 6     //Define el pin que va a SDA del lector B
#define ledVerde 3 //Define el pin al que va el led verde
#define ledRojo 4  //Define el pin al que va el led verde

byte codigo[2][4] = { //Código de las tarjetas. Se pone 0x (para indicar que es hexadecimal) seguido de la clave de las tarjetas en los cuatro números (en este caso: 01:EB:25:1C)
                      {0x01, 0xEB, 0x25, 0x1C},                                    
                      {0x01, 0xDE, 0x2C, 0x1C}
};

byte lectura [2][4];            //Crea el array para almacenar el UID del lector correspondiente
byte ssPins[] = {PIN_A, PIN_B}; //Escribe el nombre de todos los pines que van a cada lector (al SDA). Están nombrados arriba
byte nLectores = 2;             //Indica cuántos lectores tenemos. 

bool verifica [2] = {false, false}; //La verificación de A es falsa porque no se ha puesto la tarjeta correcta en el lector A. El último verifica impide que el programa entre en bucle cuando se ejecuta el código correcto
bool correcto = false;              //Será true cuando cada tarjeta esté en su lector

MFRC522 mfrc522[2];



void setup(){
  
  Serial.begin(9600);   //Inicia el puerto para poder leerla con el monitor serial
  SPI.begin();          //Inicia el Bus SPI

  for (byte x=0; x<nLectores; x++) {         //Bucle para activar y comprobar que todos los lectores son correctos
    mfrc522[x].PCD_Init(ssPins[x], RST_PIN); //Inicia el lector
    Serial.print(F("Lector "));              //Imprime "Lector "
    Serial.print(x);                         //Imprime el número del lector
    Serial.print(F(": "));                   //Imprime ": "
    mfrc522[x].PCD_DumpVersionToSerial();    //Imprime la versión del lector
  }

} //Fin de setup



void loop(){

  for(byte x=0; x<nLectores; x++){   //Bucle para activar los lectores uno por uno

    if (mfrc522[x].PICC_IsNewCardPresent() && mfrc522[x].PICC_ReadCardSerial()){  //Se activa cuando una nueva tarjeta es puesta en el lector x

      Serial.print("Lector ");  //Imprime "Lector "
      Serial.print(x);          //Imprime el número del lector
      Serial.print(": ");       //Imprime ": "

      for(byte i=0; i<mfrc522[x].uid.size; i++){   //Bucle recorre todo el UID para leer la tarjeta y almacenar su valor en la variable lectura:

        if(mfrc522[x].uid.uidByte[i]<0x10){           //si el byte leído es menor a 0x10
          Serial.print(" 0");                         //imprime espacio en blanco y numero cero,
        }else{ Serial.print(" ");}                    //si no, imprime espacio en blanco

        Serial.print(mfrc522[x].uid.uidByte[i], HEX); //Imprime el byte del UID leído hexadecimal

        lectura[x][i]=mfrc522[x].uid.uidByte[i];      //Almacena el dato que lee en el lector x, posición i en la variable Lectura posición xi.
        
      } //Bucle recorre todo el UID para leer la tarjeta y almacenar su valor en la variable lectura

      Serial.println("\t");         //Imprime tabulación
      mfrc522[x].PICC_HaltA();      //Detiene la comunicación con la tarjeta     
      mfrc522[x].PCD_StopCrypto1(); //Detiene el cifrado de PCD

      for(byte i=0; i<mfrc522[x].uid.size; i++){ //Bucle que recorre todo el UID para comprobar si la tarjeta está en la posición correcta:
    
        if(lectura[x][i] != codigo[x][i]){ //Si el valor que se ha guardado al leer la tarjeta x en la posición i es distinto al código x en la posición i:
          verifica[x]=false;               //la variable verifica en la posición x vuelve a ser falsa
          i=mfrc522[x].uid.size;           //y sale del loop
        }else{                             //Si el valor es correcto:
          verifica[x]=true;                //la variable verifica en la posición x vuelve a ser verdadera
        }                                  //y continúa 

      } //Bucle que recorre todo el UID para comprobar si la tarjeta está en la posición correcta

    } //Se activa cuando una nueva tarjeta es puesta en el lector x
    
  } //Bucle para activar los lectores uno por uno 

  for(uint8_t x=0; x<nLectores; x++){ //Bucle para comprobar uno a uno si cada verifica de cada tarjeta es correcto:              
    if(verifica[x]){                  //Si la variable verifica en la posición x es correcta:
      correcto=true;                  //Convierte la variable correcto en verdadera y continúa
    }else{                            //Si la variable verifica en la posición x es incorrecta:
      correcto=false;                 //la variable correcto vuelve a ser falsa
      x=nLectores;                    //y sale del bucle.
    }
  }

  if(correcto){   //Función que se ejecuta cuando todas las tarjetas están en los lectores correctos.
    
    digitalWrite(ledVerde, HIGH); //Enciende el led verde
    digitalWrite(ledRojo, LOW);   //Apaga el led rojo

  }else{                          //Alguna tarjeta no está en su lector

    digitalWrite(ledVerde, LOW);  //Apaga el led verde
    digitalWrite(ledRojo, HIGH);  //Enciende el led rojo

  }

} //Fin de loop()

Es muy posible que el problema no este en el Arduino/NANO/MEGA sino en algun ruido electrico el cual no has tenido en cuenta.

Para ello te recomiendo prestes atención a la fuente de alimentación que estas usando.
Lo que me ha dado los mejores resultados es un cilindro ferrite como el que tienen los buenos cables USB, o cables HDMI.
Algo asi

image

Est simplemente bloquea las perturbaciones de modo común que vienen por la linea electrica directo al Arduino.
Tambien sería bueno otras practicas como usar cables con malla, donde la malla sea parte de un cable a tierra. cable que no debe ser el negativo o GND, sino tierra y tierra que no deberías compartir con la tierra de la instalación electrica, ahora esto es dificil de realizar pero debo comentartelo.
Por ultimo usar una caja metalica y ésta a su vez a tierra seria como el ultimo paso.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.