Last active
April 24, 2023 20:25
-
-
Save trytone/ea2a5010cab79e4c608e8034f7f87e72 to your computer and use it in GitHub Desktop.
RDM6300 125kHz RFID Arduino Reader
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SoftwareSerial.h> | |
const int BUFFER_SIZE = 14; // RFID DATA FRAME FORMAT: 1byte head (value: 2), 10byte data (2byte version + 8byte tag), 2byte checksum, 1byte tail (value: 3) | |
const int DATA_SIZE = 10; // 10byte data (2byte version + 8byte tag) | |
const int DATA_VERSION_SIZE = 2; // 2byte version (actual meaning of these two bytes may vary) | |
const int DATA_TAG_SIZE = 8; // 8byte tag | |
const int CHECKSUM_SIZE = 2; // 2byte checksum | |
SoftwareSerial ssrfid = SoftwareSerial(6,8); // RX, TX | |
uint8_t buffer[BUFFER_SIZE]; // used to store an incoming data frame | |
int buffer_index = 0; | |
void setup() { | |
Serial.begin(9600); | |
ssrfid.begin(9600); | |
ssrfid.listen(); | |
Serial.println(" INIT DONE"); | |
} | |
void loop() { | |
if (ssrfid.available() > 0){ | |
bool call_extract_tag = false; | |
int ssvalue = ssrfid.read(); // read | |
if (ssvalue == -1) { // no data was read | |
return; | |
} | |
if (ssvalue == 2) { // RDM630/RDM6300 found a tag => tag incoming | |
buffer_index = 0; | |
} else if (ssvalue == 3) { // tag has been fully transmitted | |
call_extract_tag = true; // extract tag at the end of the function call | |
} | |
if (buffer_index >= BUFFER_SIZE) { // checking for a buffer overflow (It's very unlikely that an buffer overflow comes up!) | |
Serial.println("Error: Buffer overflow detected! "); | |
return; | |
} | |
buffer[buffer_index++] = ssvalue; // everything is alright => copy current value to buffer | |
if (call_extract_tag == true) { | |
if (buffer_index == BUFFER_SIZE) { | |
unsigned tag = extract_tag(); | |
} else { // something is wrong... start again looking for preamble (value: 2) | |
buffer_index = 0; | |
return; | |
} | |
} | |
} | |
} | |
unsigned extract_tag() { | |
uint8_t msg_head = buffer[0]; | |
uint8_t *msg_data = buffer + 1; // 10 byte => data contains 2byte version + 8byte tag | |
uint8_t *msg_data_version = msg_data; | |
uint8_t *msg_data_tag = msg_data + 2; | |
uint8_t *msg_checksum = buffer + 11; // 2 byte | |
uint8_t msg_tail = buffer[13]; | |
long tag = hexstr_to_value(msg_data_tag, DATA_TAG_SIZE); | |
long checksum = 0; | |
for (int i = 0; i < DATA_SIZE; i+= CHECKSUM_SIZE) { | |
long val = hexstr_to_value(msg_data + i, CHECKSUM_SIZE); | |
checksum ^= val; | |
} | |
if (checksum == hexstr_to_value(msg_checksum, CHECKSUM_SIZE)) { // compare calculated checksum to retrieved checksum | |
for (int i = 0; i < DATA_VERSION_SIZE; ++i) { | |
Serial.print(char(msg_data_version[i])); | |
} | |
Serial.println(" (version)"); | |
for (int i = 0; i < DATA_TAG_SIZE; ++i) { | |
Serial.print(char(msg_data_tag[i])); | |
} | |
Serial.println(" (tag)"); | |
Serial.print("Extracted Tag (int): "); | |
Serial.println(tag); | |
Serial.println("--------"); | |
} | |
return tag; | |
} | |
long hexstr_to_value(char *str, unsigned int length) { // converts a hexadecimal value (encoded as ASCII string) to a numeric value | |
char* copy = malloc((sizeof(char) * length) + 1); | |
memcpy(copy, str, sizeof(char) * length); | |
copy[length] = '\0'; | |
// the variable "copy" is a copy of the parameter "str". "copy" has an additional '\0' element to make sure that "str" is null-terminated. | |
long value = strtol(copy, NULL, 16); // strtol converts a null-terminated string to a long value | |
free(copy); // clean up | |
return value; | |
} | |
/* | |
ARDUINO UNO R3 | |
+-----+ | |
+----[PWR]-------------------| USB |--+ RDM6300 | |
| +-----+ | | |
| GND/RST2 [ ][ ] | +-----------------+ | |
| MOSI2/SCK2 [ ][ ] A5/SCL[ ] | +=======|[*]TX LED[ ]| | |
| 5V/MISO2 [ ][ ] A4/SDA[ ] | | |[ ]RX +5V[ ]| | |
| AREF[ ] | | |[ ] GND[ ]| | |
| GND[*]=|===========|[*]GND | | |
| [ ]N/C SCK/13[ ] | | +===|[*]+5V | | |
| [ ]IOREF MISO/12[ ] | | | | | | |
| [ ]RST MOSI/11[ ]~| | | | | | |
| [ ]3V3 +---+ 10[ ]~| | | |[ ]C2D | | |
| [ ]5v -| A |- 9[ ]~| | | |[ ]C2CK | | |
| [ ]GND -| R |- 8[ ] | | | |[ ]VDD | | |
| [ ]GND -| D |- | | | |[ ]GND | | |
| [ ]Vin -| U |- 7[ ] | | | | | | |
| -| I |- 6[*]=|===+ | | | | |
| [ ]A0 -| N |- 5[ ]~| | | ANT2[ ]| | |
| [ ]A1 -| O |- 4[ ] | | | ANT1[ ]| | |
| [ ]A2 +---+ INT1/3[ ]~| | +-----------------+ | |
| [ ]A3 INT0/2[ ] | | | |
| [ ]A4/SDA RST SCK MISO TX>1[ ] | | | |
| [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | | |
| [ ] [ ] [*] 5V | | | |
| GND MOSI | ____________/ | | |
\____________________|__/ | | |
| | | |
+=======================+ | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment