Buenas noches, espero que se encuentren muy bien. Con los pocos conocimientos que dispongo logré diseñar un circuito para implementar una cerradura con RFID el mismo es el que se acompaña en la imagen y el código que abajo se detalla, la cuestión es que no logro que el circuito funcione, está un par de días andando a la perfección y a los días ya deja de funcionar, la arduino está siendo alimentada por un cargador de celular y el circuito de potencia por otro cargador de 12V
#include <EEPROM.h>
#include <SPI.h>
#include <MFRC522.h>
/*
In the ESP8266, D3 pin is RST_PIN and
D4 pin is SS_PIN
*/
#define RST_PIN 0
#define SS_PIN 2
// Buzzer
#define Buz 16
// Portón
#define Por 15
MFRC522 reader(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
// Inicio de la EEPROM
#define EEPROM_ADDR 0
// Asignamos los valores de los llaveros RFID
String CardNumber = "EXXXXXX1 - EXXXXXX2";
void setup()
{
// Definimos la función de los pines
pinMode(Buz, OUTPUT);
pinMode(Por, OUTPUT);
Serial.begin(9600); // Initialize serial communications and wait until it is ready
while (!Serial)
{
// Nothing here. Just wait for serial to be present
}
SPI.begin();
reader.PCD_Init();
// Just wait some seconds...
delay(4);
// Prepare the security key for the read and write functions.
// Normally it is 0xFFFFFFFFFFFF
// Note: 6 comes from MF_KEY_SIZE in MFRC522.h
for (byte i = 0; i < 6; i++)
{
key.keyByte[i] = 0xFF; //keyByte is defined in the "MIFARE_Key" 'struct' definition in the .h file of the library
}
// Definimos los estados iniciales de las salidas
digitalWrite(Buz, LOW);
digitalWrite(Por, LOW);
Serial.println(CardNumber);
delay(2000);
}
void loop()
{
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if (!reader.PICC_IsNewCardPresent())
{
return;
}
// Select one of the cards. This returns false if read is not successful; and if that happens, we stop the code
if (!reader.PICC_ReadCardSerial())
{
return;
}
// At this point, the serial can be read. We transform from byte to hex
String serial = "";
for (int x = 0; x < reader.uid.size; x++)
{
// If it is less than 10, we add zero
if (reader.uid.uidByte[x] < 0x10)
{
serial += "0";
}
// Transform the byte to hex
serial += String(reader.uid.uidByte[x], HEX);
// Add a hypen
if (x + 1 != reader.uid.size)
{
serial += "";
}
}
// Transform to uppercase
serial.toUpperCase();
Serial.println(CardNumber);
Serial.println("Read serial is: " + serial);
// Halt PICC
reader.PICC_HaltA();
// Stop encryption on PCD
reader.PCD_StopCrypto1();
if (CardNumber.indexOf(serial) >= 0) {
// Encendemos el buzzer
digitalWrite(Buz, LOW);
// Apagamos el electroimán
digitalWrite(Por, HIGH);
delay(1500);
}
else {
Serial.println("Access denied");
//Emitimos 3 pitidos para avisar de un error en la lectura de la tarjeta
emitirPitido(5);
}
// Apagamos el buzzer
digitalWrite(Buz, LOW);
// Encendemos el electroimán
digitalWrite(Por, LOW);
delay(500);
}
// Función para emitir un pitido en el buzzer
void emitirPitido(int cantidad) {
for (int i = 0; i < cantidad; i++) {
digitalWrite(Buz, HIGH);
delay(100);
digitalWrite(Buz, LOW);
delay(100);
}
}
El funcionamiento de los circuitos con Arduino depende de como construyes tu equipo.
Acá vendría bien una foto de como esta armado todo, mas datos de la fuente que alimenta el circuito de potencia.
Es posible que el circuito de potencia en algun momento genere alguna perturbación electrica que haga que el arduino falle.
Solo especulo. Debo ver mas datos para poder guiarte mejor y claramente puedo estar equivocado. Pero tu problema es muy común y siempre se debe a perturbaciones electricas.
Tal vez en el recinto donde estas haya un motor electrico y su accionamiento genere el problema, tal vez una lampara fluorescente que son muy ruidosas.
Busca cosas como estas.
Reemplaza la lampara fluorescente, por alguna LED, hoy hay reemplazo de todo.
No pierdas el tiempo porque esta fuera de tus capacidades o eso me imagino.
Pero no podrías facilitarme algo para leer o introducirme para filtrar ese ruido?
En este momento está fuera de mis capacidades ya que desconozco como filtrarlo, pero me gustaría conocer como hacerlo.
Muchas gracias!
Si claro, en este foro hemos debatido el tema muchas veces.
Todo tema de interferencia, ruidos en Arduino.
La solución mejor que he encontrado es usar un cilindro similar al que tienen algunos cables de buena calidad que actuan eleminando la interferencia de modo comun. eso debes ponerlo antes de la entrada de la fuente del arduino. https://www.xataka.com/componentes/para-que-sirve-ese-cilindro-situado-en-el-extremo-de-nuestros-cables
Ni la jaula de faraday (meter al arduino en una caja metálica) ni otras consideraciones han funcionado tan bien como el tema que te señalo.
Buenas noches, mil disculpas por la demora en la respuesta, pero acabo de probar y sigue dando errores a los días, noté que el edificio del lado tiene una lámpara igual, pero no creo que me den bolilla de cambiarla. le cambié el cable USB que alimenta la arduino por uno que tenga el núcleo de ferrita, pero no tiene caso. Estaba pensando en lo siguiente:
Si le pongo un filtro emi en la alimentación de la arduino?
Si cambio el cable del lector RFID por uno mallado?
La jaula de Faraday será al vicio?
Si en la fuente de arduino pongo un varistor como el de la publicación? varistor
Si pongo en Vin un capacitor de 2200 uF en paralelo con el de 0.1?
Estos dos útlimos puntos son ideas que saco de aquí: Publicación foro
Hi,
Como tienes montado el NANO? Usa un shield .Normalmente se usa un condesador de .1pfd para las altas frecuencias y uno electrolitico para ls bajas frecuencias. Estos se conectan lo mas cercanos a los pines del micro. No mencionas como tienes montado el micro. El power supply que alimentas el micro es de los tipos de switches. Con estos debes de tener cuidado ya que usan un condesador para bajar el voltaje. Normalente yo uso los de tranformadores ya que estos te aislan el alto voltaje del de bajo voltaje. Posiblementa no sea el problema pero yo no los usos para alimentar el micro en mis projectos. Ya que el micro no tien mucha carga yo usaria un condensador electrolitico de por lo menos 470 a 1000 mfd . Una pregunta que lejos esta el opto del micro ya que de la distancia puede ser una causa.
Buenos días, muchas gracias por tu respuesta, voy respondiendo por partes:
El power supply que alimentas el micro es de los tipos de switches.
El arduino está como viene, conectado al optoacoplador y al lector RFID mediante cables dupont, sobre los pines de Vin y GND soldé un capacitor de 0.1 uF.
El power supply que alimentas el micro es de los tipos de switches.
Las fuente que utilizo son las que puse al principio en la publicación, creo que utilizan mini transformadores para reducir la tensión.
El power supply que alimentas el micro es de los tipos de switches.
El optoacoplador se encuentra a escasos centímetros de la Arduino.
Ya que el micro no tien mucha carga yo usaria un condensador electrolitico de por lo menos 470 a 1000 mfd
Le añado un capacitor de 1000 uF en Vin y GND en paralelo al de 0.1uF entonces?
Desde ya muchas gracias por tu respuesta, espero haber solucionado todos las dudas.