ساخت دربازکن RFID با آردوینو
تکنولوژی Radio Frequency Identification یا به اختصار RFID روشی برای شناسایی افراد یا کالاها بدون نیاز به تماس با استفاده از امواج رادیویی است. از این تکنولوژی و سیستم های مشابه مانند بارکد و اثر انگشت در جهت کاهش زمان و نیروی انسانی لازم برای وارد کردن اطلاعات به صورت دستی و افزایش دقت آن ها استفاده می شود. سیستم های ضدسرقت در فروشگاه های بزرگ، سیستم های امنیتی هوشمند، هوشمند سازی منازل، سیستم های خودکار رزرو غذا، دربازکن های خودکار و… نمونه هایی از کاربرد فناوری RFID می باشد.
در این پروژه آردوینو از مبحث آموزش آردوینو می خواهیم شما را با نحوه برنامه نویسی و ساخت یک دربازکن کارتی RFID با برد آردوینو Arduino آشنا کنیم. در طراحی و ساخت این پروژه برای اینکه بتوانیم برد آردوینو را به فناوری RFID مجهز کنیم از ماژول RFID مدل RF01D استفاده کرده ایم.
تجهیزات مورد استفاده RFID
سیستم های مبتنی بر فناوری RFID از 4 بخش عمده تشکیل شده اند که عبارتند از:
1- برچسب (Tag) که در بازار به نام های کارت یا تگ RFID نیز شناخته می شوند.
2- کارت خوان آر.اف.آی.دی (Reader)
3- آنتن و سیستم رادیویی
4- شبکه کامپیوتری
برچسب یا تگ RFID چیست؟
برچسب ها، مهمترین بخش یک سیستم RFID به شمار می روند. هر تگ RFID از یک آنتن و یک تراشه کوچک سیلیکنی تشکیل شده است. تراشه موجود در برچسب ها شامل یک گیرنده، یک مدولاتور رادیویی برای ارسال پاسخ به کارت خوان، مدار کنترلر، مقدار مشخصی حافظه و مدار منبع تغذیه می باشد. گاهی اوقات ممکن است مدار تغذیه، انرژی مورد نیاز تراشه را به طور کامل از سیگنال رادیویی دریافتی از کارت خوان تامین کند که در این صورت برچسب را برچسب غیر فعال (Passive Tag) می گویند. در مقابل اگر مدار منبع تغذیه، انرژی لازم را از یک باتری تامین کند، برچسب را برچسب فعال (Active Tag) می نامیم.
ویژگی برچسب های فعال
مهمترین ویژگی برچسب های فعال، امکان برقراری ارتباط مطمئن در فواصل زیاد است، چراکه در آن ها نیاز به سیگنال رادیویی پیوسته برای تامین انرژی الکتریکی نیست. برای مثال می توان برچسب های فعال را در صورتیکه از یک آنتن مناسب در برچسب و کارت خوان استفاده شود، در فواصل 30 متری و حتی بیشتر به کار برد.
ویژگی برچسب های غیر فعال
برچسب های غیر فعال، به دلیل عدم استفاده از باتری، بسیار کوچکتر و ارزانتر از نوع فعالند. ویژگی دیگر آن ها، داشتن طول عمر بالاست. در مقایسه با برچسب های فعال که طول عمر باتری آن ها، حداکثر چند سال است، برچسب های غیر فعال چند دهه پس از تولید استفاده می شوند.
آنتن و فرکانس کاری RFID
لایه فیزیکی یک سیستم RFID از امواج رادیویی و آنتن تشکیل شده است که در حقیقت ارتباط بین کارت خوان و برچسب را برای انتقال اطلاعات بین آنها امکانپذیر می سازد. تقریبا تمام سیستم های RFID از باند فرکانسی استفاده می کنند که به دریافت مجوز نیاز ندارد. اینگونه باندها را اصطلاحا باندهای بدون مجوز (Unlicensed Spectrums) می نامند. باندهای بدون مجوز عبارتند از: باند فرکانسی LF با محدوده فرکانسی بین 125 تا 134/4 کیلوهرتز، باند HF در فرکانس مرکزی 13/56MHz باند UHF در فرکانس 915MHz و باند ISM در فرکانس مرکزی 2/4GHz است.
ماژول RF01D
همانطور که در ابتدا مطلب اشاره شد، هدف ما در این پروژه ساخت یک سیستم دربازکن خودکار با استفاده از فناوری RFID است. در این سیستم، ابتدا شناسه کارت های RFID در سیستم ذخیره می گردد و پس از آن با قرار دادن کارت در مقابل دستگاه، درب به طور خودکار باز می شود. اینکار با استفاده از ماژول کارت خوان RF01D ساخت شرکت مانگو (MANGO) انجام می گیرد. این ماژول برای شناسایی کارت های غیرفعال طراحی و ساخته شده است.
این ماژول, یک کارت خوان RFID با فرکانس کاری 125KHz برای کارت های غیر فعال 64 بیتی است. نمای ظاهری و ترتیب پایه های ماژول آر اف آی دی RFID مدل RF01D در شکل زیر نشان داده شده است.
همان طور که مشاهده می کنید, این ماژول مجموعا دارای 12 پایه است که پایه های A1 و A2 برای اتصال آنتن در نظر گرفته شده است. آنتن استفاده شده در حقیقت یک سیم پیچ 345uH می باشد که روی ماژول نصب شده است. سایر پایه ها برای تغذیه, ارتباط با ماژول و تنظیم مد کاری در نظر گرفته شده اند. جدول زیر عملکرد هر پایه را نشان می دهد.
نحوه راه اندازی ماژول RF01D در حالت ارتباط RS232
در این حالت ماژول RF01D اطلاعات مربوط به برچسب یا تگ RFID را به شکل یک قاب داده و آسنکرون ارسال می کند. به این ترتیب که با هر بار کشیدن کارت، یک بسته 14 بایتی شامل 10 بایت اطلاعات کارت، یک بایت شروع (همواره 02H) یک بایت پایان (همواره 03H) و دو بایت CR (همواره 0DH) و LF (همواره 0AH) قبل از بایت پایانی ، ارسال می شود.
نقشه شماتیک پروژه ساخت قفل کارتی RFID با ماژول RF01D و آردوینو
لیست قطعات مورد نیاز
برد آردوینو Arduino UNO R3 مدل DIP | 1 عدد |
ماژول RFID ریدر مدل RF01D ID3 | 1 عدد |
تگ RFID طرح جاسوئیچی با فرکانس 125KHz و رنگ آبی | 1 عدد |
کارت RFID فرکانس 125KHZ | 1 عدد |
رگولاتور ولتاژ 5 ولت L7805 | 1 عدد |
ترانزیستور 2N3904 نوع NPN | 1 عدد |
دیود 1N4007 | 1 عدد |
مقاومت 1 کیلو اهم با توان 0.25 وات و تلرانس 5 درصد | 2 عدد |
مقاومت 10 کیلو اهم با توان 0.25 وات و تلرانس 1 درصد | 2 عدد |
مقاومت 330 اهم با توان 0.25 وات و تلرانس 1 درصد | 1 عدد |
تک سوئیچ 2 پایه DIP سایز 6x6x5 میلیمتر | 2 عدد |
آداپتور 12V ولت 2A آمپر مدل بین راهی ساخت ایران | 1 عدد |
خازن الکترولیتی 470uf میکروفاراد 16 ولت | 2 عدد |
لامپ LED قرمز سایز 5mm میلی متر مدل مات | 2 عدد |
بازر 5 ولتی با اسیلاتور داخلی | 1 عدد |
LCD کاراکتری مدل 16×2 با Backlighting آبی | 1 عدد |
رله 12V ولت معمولی تک کنتاکت با جریان 10 آمپر | 1 عدد |
برد بورد (پروجکت برد) مدل GL | 2 عدد |
سیم جامپر برد بوردی مدل دو سر نری (سری 40تایی) | 2 عدد |
شرح عملکرد پروژه
عملکرد این دربازکن دیجیتالی به این صورت است که کاربر جهت وارد شدن باید کارت RFID خود را از نزدیکی ماژول RF01D عبور دهد. در صورتیکه کارت از قبل برای مدار تعریف شده باشد رله تعبیه شده بر روی مدار طی مدت زمانی که در برنامه توسط شما تعریف می شود، فعال خواهد ماند. در غیر اینصورت پیغام خطا بر روی ال سی دی کاراکتری تعبیه شده در مدار به نمایش در خواهد آمد. همچنین در مدار این پروژه دو کلید فشاری تعبیه شده است یک کلید برای افزودن کارت و کلید بعدی جهت حذف کارت مورد نظر، که در ادامه نحوه افزودن و حذف کارت شرح داده شده است.
نحوه افزودن کارت یا تگ RFID
در این پروژه شما می توانید تا حداکثر 10 عدد کارت را به آردوینو معرفی کنید. برای این منظور کافی است ابتدا کلید فشاری ADD را فشار دهید و خانه مورد نظر خود را از بین عدد 1 الی 10 انتخاب کنید، سپس در خانه حافظه مورد نظر کلید فشاری را در همان حالت فشرده شده نگاه دارید، سپس کارتی که می خواهید به دستگاه معرفی کنید را به ماژول RF01D نزدیک کنید، در صورتیکه کارت از قبل ثبت نشده باشد عملیات ثبت کارت در حافظه برد آردوینو به صورت اتوماتیک انجام می شود و پیغام “> Save Complete!” بر روی LCD کاراکتری ظاهر می شود، حال می توانید کلید را رها کنید.
نحوه حذف کارت یا تگ RFID
برای حذف کارت از حافظه برد آردوینو کافی است کلید Delete را فشار دهید و در همان حالت نگاه دارید و سپس کارت یا تگ RFID را به ماژول RF01D نزدیک کنید. در صورت موفق بودن عملیات، پیغام “Delete Complete!” بر روی ال سی دی کاراکتری ظاهر می شود و کارت حذف خواهد شد، حال می توانید کلید را رها کنید.
برنامه پروژه در نرم افزار آردوینو
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
#include <EEPROM.h> #include <LiquidCrystal.h> #include <SoftwareSerial.h> //*********************************************Config Uart_PIN SoftwareSerial RFID_Serial(2, 3); // RX, TX //*********************************************Config PIN_RLY const int PIN_RLY = 13; const int PIN_buzzer = 6; //*********************************************Config Pin_Keypad const int PIN_SW_Add = 4; const int PIN_SW_Delete = 5; //*********************************************Setup LCD const int contrast_display = 80; const int backlight_display = 255; //*********************************************Config Pin_LCD const int LCD_Pin_contrast = 10; const int LCD_Pin_RS = A0; const int LCD_Pin_RW = A1; const int LCD_Pin_E = A2; const int LCD_Pin_D4 = A3; const int LCD_Pin_D5 = A4; const int LCD_Pin_D6 = A5; const int LCD_Pin_D7 = 12; const int LCD_Pin_backlight = 11; LiquidCrystal lcd(LCD_Pin_RS, LCD_Pin_RW, LCD_Pin_E, LCD_Pin_D4, LCD_Pin_D5, LCD_Pin_D6, LCD_Pin_D7); //*********************************************Config Value String card; int id_card = 0; unsigned char i = 0; unsigned char usart_data; const long Delay_RLY = 5000; unsigned long currentMillis = 0; unsigned long previousMillis = 0; boolean start_flag = 0, read_flag = 0, user_ok = 0, key = 0; boolean key_Add, key_Delete; //*********************************************Subprogram setup() void setup() { RFID_Serial.begin(9600); pinMode(PIN_RLY, OUTPUT); pinMode(PIN_buzzer, OUTPUT); pinMode(PIN_SW_Add, INPUT_PULLUP); pinMode(PIN_SW_Delete, INPUT_PULLUP); digitalWrite(PIN_RLY, LOW); analogWrite(LCD_Pin_contrast, contrast_display); analogWrite(LCD_Pin_backlight, backlight_display); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("*electronics 98*"); lcd.setCursor (0, 1); lcd.print(">Arduino Project"); delay(3000); Welcome(); } //*********************************************Subprogram loop() void loop() { key_Add = digitalRead(PIN_SW_Add); key_Delete = digitalRead(PIN_SW_Delete); Check_in(); if (read_flag == 1) { if (key_Add == 0 && key_Delete == 1) { key = 1; Add_card(); } else if (key_Add == 1 && key_Delete == 0) { key = 1; Delete_card(); } else { check_in_Mode(); } } if (key == 0 && key_Add == 0 && key_Delete == 1) { key = 1; id_card++; if (id_card > 10) id_card = 1; lcd.clear(); lcd.setCursor(0, 0); lcd.print ("Valid Card>NO."); lcd.print (id_card); lcd.setCursor (0, 1); lcd.print(">>> Check in <<<"); } if (key == 1 && key_Add == 1 && key_Delete == 1) { key = 0; Welcome(); } } //*********************************************Subprogram Check_in() void Check_in() { if (RFID_Serial.available() && read_flag == 0) { usart_data = RFID_Serial.read(); if (usart_data == 0x02) start_flag = 1; if (start_flag && i < 15) { digitalWrite(PIN_buzzer, HIGH); card = card + String(usart_data); i++; } if (usart_data == 0x03) { start_flag = 0; read_flag = 1; i = 0; delay (200); digitalWrite(PIN_buzzer, LOW); } } } //*********************************************Subprogram Add_card() void Add_card() { if (read_flag == 1) { i = 1; user_ok = 0; while (i <= 10) { if (card == EEP_Read_String(i)) { user_ok = 1; break; } i++; } if (user_ok == 1) { lcd.clear(); lcd.setCursor(0, 0); lcd.print ("Error!!!"); lcd.setCursor(11, 0); lcd.print (".NO"); lcd.print (i); lcd.setCursor (0, 1); lcd.print("> Already Exist!"); delay (2000); } else { if (id_card == 0) id_card = 1; EEP_Write_String(id_card, card); lcd.clear(); lcd.setCursor(0, 0); lcd.print ("****** OK ******"); lcd.setCursor (0, 1); lcd.print("> Save Complete!"); delay (3000); } user_ok = 0; read_flag = 0; i = 0; card = ""; Welcome(); } } //*********************************************Subprogram Delete_card() void Delete_card() { if (read_flag == 1) { i = 1; user_ok = 0; while (i <= 10) { if (card == EEP_Read_String(i)) { user_ok = 1; break; } i++; } if (user_ok == 1) { card = ""; EEP_Write_String(i, card); lcd.clear(); lcd.setCursor(0, 0); lcd.print ("****** OK ******"); lcd.setCursor (0, 1); lcd.print("Delete Complete!"); delay (3000); } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print ("Error!!!"); lcd.setCursor (0, 1); lcd.print(">Not registered!"); delay (2000); } user_ok = 0; read_flag = 0; i = 0; card = ""; Welcome(); } } //*********************************************Subprogram check_in_Mode() void check_in_Mode() { if (read_flag == 1) { i = 1; user_ok = 0; while (i <= 10) { if (card == EEP_Read_String(i)) { user_ok = 1; i = 0; break; } i++; } if (user_ok == 1) { lcd.clear(); lcd.setCursor(0, 0); lcd.print ("****** OK ******"); lcd.setCursor (0, 1); lcd.print("> Valid Card"); digitalWrite(PIN_RLY, HIGH); currentMillis = millis(); previousMillis = currentMillis; while (currentMillis - previousMillis < Delay_RLY) { currentMillis = millis(); } } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print ("Error!!!"); lcd.setCursor (0, 1); lcd.print("> Invalid Card!"); delay(1000); } digitalWrite(PIN_RLY, LOW); user_ok = 0; read_flag = 0; i = 0; card = ""; Welcome(); } } //*********************************************Subprogram Welcome() void Welcome() { lcd.clear(); lcd.setCursor(0, 0); lcd.print ("Welcome:"); lcd.setCursor (0, 1); lcd.print(">>> Check in <<<"); } //*********************************************Subprogram EEP_Write_String() void EEP_Write_String(byte part, String val) { int start_addw = part * 32; int w_len = val.length(); EEPROM.write(start_addw, w_len + 1); int end_w = start_addw + w_len; byte len = 0; for (int i = start_addw + 1; i < end_w + 1; i++) { EEPROM.write(i, int(val[len])); len++; } len = 0; } //*********************************************Subprogram EEP_Read_String() String EEP_Read_String(byte part) { int start_addr = part * 32; String str; int ch; int r_len = EEPROM.read(start_addr); int end_r = start_addr + r_len; for (int i = start_addr + 1; i < end_r; i++) { ch = EEPROM.read(i); str += char(ch); } return str; } |
با سلام و احترام
به احتمال زیاد مشکل از سمت تغذیه مدار و یا اتصال رله به مدار می باشد.
سلام خسته نباشین میشه این مدار رو با دوتا RFID استفاده کرد مثلا یه مدار آردوینو باشه ولی با دوتا Rfid دوتا درب رو بازکنه؟
سلام چرا پین TXD را در شماتیک مشخص نکردید.؟
سلام چرا پین TXD در نقشه شماتیک مشخص نیست.؟