فناوری RFID
RFID مخفف عبارت Radio Frequency Identification می باشد. فناوری RFID از امواج الکترومغناطیسی برای گرفتن و خواندن داده های ارسالی استفاده می کند. اطلاعات به صورت الکترونیکی بر روی یک تگ متصل به یک کارت یا شی ذخیره می شود و تراشه آن تگ زمانی که در نزدیکی ریدر قرار می گیرد فعال می شود و به آن امکان می دهد اطلاعات دسترسی خود را به اشتراک بگذارد. RFID می تواند اکتیو باشد، یعنی خود منبع تغذیه دارد و برد بالایی هم دارد، یا غیرفعال، یعنی توسط یک ریدر تغذیه می شود و در فواصل کوتاهتر کار می کند. این تگ ها را میتوان از فاصله چند ده سانتی متر توسط گیرنده شناسایی کرد و در کنترل دسترسی ساختمانهایی با تعداد زیادی دارنده کارت مفید است.
فناوری RFID به طور رایج در سیستم های کنترل دسترسی به کار می رود تا فقط به پرسنل تایید شده و مجاز اجازه ورود به فضاهای امن را بدهد. فناوری RFID برای چندین کاربرد به غیر از مدیریت اداری، مانند موجودی زنجیره تامین، کنترل دروازه پارکینگ، خطوط پرداخت خرده فروشی، و حتی زمان بندی مسابقه، انتخاب مطلوبی است.
سخت افزار مورد نیاز برای پروژه کنترل دسترسی RFID
برای انجام این پروژه از ماژول RDM6300 و میکروکنترلر STM32f051C8 استفاده شده است. پردازش و ذخیره و مدیریت کارت های RFID با میکروکنترلر آرم شرکت ST انجام می دهیم و با ماژول RDM6300 اطلاعات کارت ها را دریافت می کنیم این دو از طریق ارتباط سریال با هم در ارتباط خواهند بود.
ماژول RDM6300
ماژول مدل RDM6300 یکی از انواع ماژول های RFID با فرکانس 125 کیلوهرتز است. این ماژول برای خواندن کد از تگ های فقط خواندنی سازگار با فرکانس 125 کیلوهرتز (ID) و کارت های خواندن/نوشتن 125 کیلوهرتز طراحی شده است.
ویژگی های ماژول RDM6300:
پشتیبانی از آنتن خارجی
حداکثر فاصله موثر: تا 50 میلی متر
رابط Uart
این ماژول دارای 9 پین است:
VCC: منبع تغذیه ماژول - 5 ولت
GND: زمین
RX: پین دریافت داده
TX: پین انتقال داده
ANT1: پین اتصال آنتن
ANT2: پین اتصال آنتن
LED: این پین زمانی که هیچ تگی در نزدیکی ماژول نباشد، HIGH خواهد بود. هنگامی که یک تگ نزدیک ماژول است، برای مدت کوتاهی از HIGH به LOW تغییر می کند.
می توانید پین اوت این ماژول را در شکل زیر ببینید
لینک دانلود دیتاشیت ماژول RDM6300
ایجاد پروژه کنترل دسترسی RFID در STM32CubeIDE
یک پروژه با میکروکنترلر STM32f051C8 در STM32CubeIDE ایجاد کرده و برای تولید کد تنظیمات اولیه در برنامه خود مانند موارد زیر انجام می دهیم:
1- فعال کردن UART1 (با نرخ تبادل 9600) به همراه وقفه
2- یک پین را به خرجی تنظیم می کنیم، با لیبل RELAY
3- I2C شماره 2 را فعال می کنیم برای ارتباط با حافظه EEPROM (با سرعت فرکانس 100 کیلوهرتز)
4- همچنین کلاک سرعت بالا را روی کریستال تنظیم می کنیم و در بخش Clock Configuration سرعت کلاک در بخش های مختلف مانند شکل زیر باشد
5- تایمر شماره 15 را روی Internal Clock به همراه وقفه فعال می کنیم
حالا پروژه را Code Genarated کنید تا تنظیمات اعمال شده یا همان کدهای کانفیگ برنامه ایجاد شود سپس به فولدر src رفته و فایل main.c را باز کنید.
توضیحات کد
ماژول از طریق UART به میکروکنترلر ارتباط دارد و هر بار که کارتی نزدیک ماژول شود اطلاعات کارت را از طریق آن به میکرو منتقل می کند فرمت اطلاعات ماژول مانند شکل زیر است که :
بایت اول 02 می باشد بعد از آن ده بایت دیتای کارت و به دنبال آن چکسام و بایت آخر 03 می باشد.
برای دریافت اطلاعات کارت در کد میکروکنترلر باید موارد بالا در نظر گرفته شود برای صحت اطلاعات دریافتی از ماژول، چکسام به دنبال دیتای کارت ارسال میشود.
چکسام همان XOR ده بایت دیتای کارت می باشد. بنابراین هنگام دریافت این ده بایت عملیات XOR را روی آن انجام می دهیم و نتیجه را با چکسام مقایسه می کنیم در صورتی که برابر بودند اطلاعات دریافتی از ماژول صحیح است.
هر بایت ارسالی از ماژول، یک وقفه در میکرو ایجاد می کند. آنجا ما تابع RFID_getCode(uint8_t code) را فراخوانی میکنیم و عملیات پردازش را انجام می دهیم.
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart -> Instance == USART2){
}
if(huart ->Instance ==USART1){
RFID_getCode(get_rfid);
HAL_UART_Receive_IT(&huart1,&get_rfid,1);
}
UNUSED(huart);
}
اطلاعات در متغیر RxBuffer ذخیره می شود و در صورتی که اطلاعات دریافتی صحیح باشد Detect_card برابر با 1 خواهد شد که برای اطلاع از تشخیص کارت در برنامه استفاده میشود.
void RFID_getCode(uint8_t code){
RFID_CNT=RFID_TIMEOUT;
if(flag == 0){
if(code == RFID_RDM_630_HEADER){//02
uart_counter = 0;
receive = 0;
_checksum = 0;
rcv_checksum = 0;
val = 0;
RFID_CNT = RFID_TIMEOUT;
//Detect_card = 0;
}
else if(code == RFID_RDM_630_TAIL){//03
receive =1;
flag=1;
/*RFID_CNT=RFID_TIMEOUT;*/
}
if(uart_counter >= RFID_MAX_Card_BUFFER_SIZE ){//get data
uart_counter = 0;
}
RxBuffer[uart_counter++] = code;
حالا من یک کتابخانه به نام RFID برای مدیریت کارت ها ایجاد کردم. از مهمترین توابع این کتابخانه شامل:
uint8_t New_Card(void)
bool Card_Authentication(uint8_t *USERnn)
void Delete_AllCard(void)
bool Delete_Card(uint8_t *USERnn)
bool IS_Admin_Card(void)
void Set_Admin_Card(void)
استفاده از توابع RFID در برنامه
while (1)
{
HAL_Delay(100);
/*********************************RFID MANAGE**************************/
if(!lock_flag){
if(mode == Login && Detect_card){
/* Login */
Detect_card=0;
card_Manage(mode);
}
if(mode == NewCard && Detect_card){
/* NewCard */
Detect_card=0;
card_Manage(mode);
mode = Login;
}
if(mode == DeleteCard && Detect_card){
/* DeleteCard */
Detect_card=0;
card_Manage(DeleteCard);
mode = Login;
}
if(mode == DeleteAllCard && Detect_card){
/* DeleteAllCard */
Detect_card=0;
card_Manage(DeleteAllCard);
mode = Login;
}
سورس کد کامل پروژه در گیت هاب:
https://github.com/mehdi-adham/RFID-Access-Control-With-STM32