ویژگیهای ماژول RFID مدل RDM6300 دارای فرکانس 125 کیلوهرتز
اگر شما اندکی با الکترونیک آشنا باشید، قطعا نام RFID (radio-frequency-identification) را شنیدهاید. یکی از ماژولهای RFID مدل RDM6300 با فرکانس 125 کیلوهرتز میباشد. این ماژول برای خواندن کد از تگها و خواندن و نوشتن بر روی کارتهای 125 کیلوهرتز مناسب میباشد.
از جمله ویژگیهای این ماژول:
- پشتیبانی از آنتن خارجی
- بیشترین فاصله موثر: تا 50 میلیمتر
- ارتباط Uart
- طراحی ماژول با ابعاد کوچک
معرفی پایههای (Pinout) ماژول RFID مدل RDM6300
این ماژول دارای 9 پایه به شرح زیر میباشد:
- VCC: تغذیه ماژول –5 ولت
- GND: زمین
- RX: پین دریافت دیتا
- TX: پین ارسال دیتا
- ANT1: پایه اتصال آنتن
- ANT2: پایه اتصال آنتن
- LED: پایه LED – زمانی که هیچ تگی نزدیک ماژول نباشد، این پایه HIGH میباشد. وقتی یک تگ خوانده شود، این مقدار برای لحظاتی از HIGH به LOW تغییر وضعیت میدهد.
پین اوت (Pinout) این ماژول را میتوانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
راه اندازی ماژول RFID مدل RDM6300 با آردوینو
گام اول: سیم بندی
مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
گام دوم: کد
ابتدا کد زیر را روی آردوینوی خود آپلود کنید.
/*
RDM6300-125KHz-RFID
modified on 20 Jan 2020
by Amir Mohammad Shojaee @ Electropeak
Home
based on www.mschoeffler.de Arduino Examples
*/
#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);
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];
// print message that was sent from RDM630/RDM6300
Serial.println("--------");
Serial.print("Message-Head: ");
Serial.println(msg_head);
Serial.println("Message-Data (HEX): ");
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("Message-Checksum (HEX): ");
for (int i = 0; i < CHECKSUM_SIZE; ++i) {
Serial.print(char(msg_checksum[i]));
}
Serial.println("");
Serial.print("Message-Tail: ");
Serial.println(msg_tail);
Serial.println("--");
long tag = hexstr_to_value(msg_data_tag, DATA_TAG_SIZE);
Serial.print("Extracted Tag: ");
Serial.println(tag);
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;
}
Serial.print("Extracted Checksum (HEX): ");
Serial.print(checksum, HEX);
if (checksum == hexstr_to_value(msg_checksum, CHECKSUM_SIZE)) { // compare calculated checksum to retrieved checksum
Serial.print(" (OK)"); // calculated checksum corresponds to transmitted checksum!
} else {
Serial.print(" (NOT OK)"); // checksums do not match
}
Serial.println("");
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;
}
در این برنامه به علت نیاز به دسترسی به 2 پایه سریال دیگر، از SoftwareSerial استفاده شدهاست. زمانی که تگ را به RFID نزدیک میکنیم، در خروجی سریال مانیتور، تگ خوانده میشود و آیدی مخصوص آن نمایش داده میشود.
دو تگ متفاوت را به ترتیب به ماژول نزدیک کرده و سپس برمیداریم. مشاهده میشود که ابتدا هر تگ شناسایی شده و سپس اطلاعات آن در سریال مانیتور نمایش داده میشود.