Buenos días,
Estoy realizando un pequeño proyecto, que consiste en un lector RFID (RDM6300), basando en una librerias existentes con alguna pequeña modificación por mi parte.
Utilizo Arduino Leonardo, aunque también he probado con Arduino Uno la misma aplicación, quitando la opción de keyboard.
El tema es que en ambos casos me sucede lo mismo. Lee correctamente los códigos RFID y los presenta por teclado o consola dependiendo del Arduino elegido, pero la salida de buzzer, funciona solo durante los primeros segundos de funcionamiento del Arduino con cada una de las lecturas, luego sigue leyendo bien, pero no suena. He probado también a cambiar el buzzer por un led con su correspondiente resistencia, para descartar un posible problema de incompatibilidades entre ambos. He probado a poner unos println en la función beep para comprobar que el hilo de ejecución está pasando por la función, y lo hace bien.
Creo que se puede estar escapando algo y espero que alguno me podáis ayudar con mi problema.
Gracias
LectorRFID.ino
/*
RFID RDM6300 Arduino library
(c) Trystan4861 20180323
*/
#include <Keyboard.h>
#include "RDM6300.h"
#define PINTXRFID 10 // PIN del arduino donde se conectará el pin1 (TX) del rdm6300
#define IgnoreTime 2000 // Tiempo de espera entre dos lecturas consecutivas del mismo tag en milisegundos
#define PinBuzzer 11 //PIN del arduino donde se conectará el "+" del buzzer activo
RDM6300 RDM6300(PINTXRFID, IgnoreTime, PinBuzzer);
void setup()
{
Serial.begin(9600); // start serial to PC
RDM6300.begin(); //start rfid
Keyboard.begin();
//Serial.println("Ready");
}
void loop()
{
if (RDM6300.isNewTagReaded()) {
//Serial.println(RDM6300.DecimalID());
//Serial.println(RDM6300.HexID());
Keyboard.print(RDM6300.HexIDCompleto());
Keyboard.releaseAll(); //Release all keyboard buttons
//delay(200); //Wait 200ms before hitting ENTER
Keyboard.press(KEY_RETURN); //Hit ENTER
Keyboard.releaseAll(); //Release all keyboard buttons
}
}
/*
Función para sacar mensajes por puerto serie con retorno de carro
Parametro: message
*/
void setMessage(String message) {
setMessage(message, true);
}
/*
Función para sacar mensajes por puerto serie
Parametro:
message: Mensaje
newLine: Retorno de carro Si o No
*/
void setMessage(String message, bool newLine) {
String timeStamp = String(millis());
String finalMessage = timeStamp + " - " + message;
if (newLine) Serial.println(finalMessage);
else Serial.print(message);
}
RDM6300.cpp
/*
RFID RDM6300 data decoder library
(c) Stephane Driussi 20150623
Modded Trystan4861@gmail.com
*/
#include <Arduino.h>
#include "RDM6300.h"
#include "SoftwareSerial.h"
/*
numPitidos: numero de repeticiones del pitidos deseadas
duracion: tiempo del pitido en milisegundos
*/
void RDM6300::beep(int numPitidos, int duracion)
{
for (int i = 0; i < numPitidos; i++)
{
digitalWrite(_PinBuzzer, HIGH);
int Sleep = millis();
while (millis() - Sleep < duracion);
digitalWrite(_PinBuzzer, LOW);
if (numPitidos > 1) {
Sleep = millis();
while (millis() - Sleep < 50);
}
}
}
RDM6300::~RDM6300() {};
RDM6300::RDM6300(int RXPin, int waitTime, int PinBuzzer = 0): _pRFID(RXPin, NULL)
{
_RXPin = RXPin;
_IgnoreSameTime = waitTime;
_LastMillis = 0;
_PinBuzzer = PinBuzzer;
if (_PinBuzzer != 0) pinMode(_PinBuzzer, OUTPUT);
}
void RDM6300::begin()
{
_pRFID.begin(9600);
}
void RDM6300::end()
{
_pRFID.end();
}
String RDM6300::DecimalID()
{
uint32_t foo = (uint32_t) _Payload[1] << 24;
for (int i = 2; i < 5; i++) foo |= (uint32_t) _Payload[i] << ((4 - i) * 8);
String result = (String) foo;
while (result.length() < 10) result = "0" + result;
return result;
}
String RDM6300::HexID()
{
String result;
for (int i = 1; i < 5; i++) result += String(_Payload[i], HEX);
result.toUpperCase();
return result;
}
String RDM6300::HexIDCompleto()
{
String result;
for (int i = 0; i < 5; i++) {
if (_Payload[i] < 0x10) result += "0";
result += String(_Payload[i], HEX);
}
result.toUpperCase();
return result;
}
bool RDM6300::isNewTagReaded()
{
if (!_pRFID.isListening()) _pRFID.listen();
uint8_t input = _pRFID.read();
delay(20);
switch (input)
{
case 255:
return false;
case 2:
_cnt = 0;
_checksum = 0;
_seq = 1;
_temp = 0;
_new = false;
break;
default:
switch (_seq)
{
case 1:
_temp = input - 48;
if (_temp > 9) _temp -= 7;
_seq = 2;
break;
case 2:
input -= 48;
if (input > 9) input -= 7;
_temp = (_temp << 4) | input;
if (_Payload[_cnt] != _temp) _new = true;
_TempPayload[_cnt++] = _temp;
if (_cnt > 5) _seq = 3;
else
{
_seq = 1;
_checksum ^= _temp;
}
break;
default:
if (input == 0x03) _seq = 4;
else _seq = 0;
break;
}
break;
}
if (_seq == 4) // all data in buffer
{
if (_checksum == _TempPayload[5])
{
_new = _new && true;
if (!_new) if ((millis() - _LastMillis > _IgnoreSameTime) || (_LastMillis == 0)) _new = true;
if (_new)
{
_LastMillis = millis();
beep(1, 50);
}
}
if (_new)
{
for (_cnt = 0; _cnt <= 5; _cnt++) _Payload[_cnt] = _TempPayload[_cnt];
}
_seq = 0;
_cnt = 0;
}
return _new & _cnt == 0;
}
RDM6300.h
/*
RFID RDM6300 data decoder library
(c) Stephane Driussi 20150623
Modded Trystan4861@gmail.com
*/
#ifndef RDM6300_H
#define RDM6300_H
//#include <RDM6300.h>
#include "SoftwareSerial.h"
class RDM6300 {
public:
bool isNewTagReaded();
RDM6300(int RXPin, int waitTime, int PinBuzzer = 0);
~RDM6300();
void begin();
void end();
void beep(int numPitidos, int duracion);
String DecimalID();
String HexID();
String HexIDCompleto();
private:
SoftwareSerial _pRFID;
bool _ignoreCRC;
int *_IgnoreSameTime;
int _RXPin;
int _seq, _cnt;
bool _new;
uint8_t _Payload[6], _TempPayload[6], _temp, _checksum;
long _LastMillis;
int _PinBuzzer;
};
#endif