در این آموزش، قصد داریم سیستمی طراحی کنیم که بتوانیم با استفاده از آن کارتهای RFID را به کمک RFID reader و میکروی STM32 بخوانیم.
RFID مخفف عبارت Radio Frequency Identification است. همان طور که از نام آن میتوان حدس زد، در این کارتها اطلاعات با استفاده از امواج فرکانس رادیویی خوانده میشوند. از این کارتها در بسیاری از سیستمهای احراز هویت مثلا در پارکینگهای طبقاتی، پرداخت عوارض، حفظ اطلاعات پروندهی بیماران در بیمارستانها و … استفاده میشود.
در این پروژه ما از ماژول EM-18 RFID به عنوان reader استفاده میکنیم و ID منحصر به فرد یک RFID tag را با کمک میکروکنترلر STM32F103C8 میخوانیم.
آنچه که در ادامه نیاز خواهیم داشت:
- STM32F103C8
- ماژول EM-18 RFID Reader
- تعدادی RFID
- ماژول LCD 16×2
- برد بورد
- سیم رابط
اما قبل از اینکه وارد چگونگی نحوهی اتصال RFID با STM32 شویم، خوب است که قدری بیشتر دربارهی RFID tagها و RFID readerها صحبت کنیم.
RFID tag
این تگها از یک میکروچیپ و یک آنتن کویل (سیمپیچ) تشکیل شدهاند و میتوانند با نزدیکترین reader (کارتخوان) که در مجاورتشان قرار گیرد، تبادل داده داشته باشند. انواع مختلفی از RFIDها با سایزهای متنوع و مختلف در بازار موجود میباشند و معمولا عملکرد اغلب آنها مشابه هم است. به جز برخی که به منظور برآوردن مقاصد بخصوص طراحی میشوند و فرکانس ارتباطی آنها با بقیه متفاوت است. ما در اینجا از 125Khz Passive RFID استفاده میکنیم که قادر است یک ID منحصر به فرد را در خود نگه داشته و مبادله کند.
اگر این کارتها را در مقابل نور بگیرید، میتوانید میکروچیپ و کویلی که در داخل آنها تعبیه شده است را ببینید.
این نکته را هم خوب است بدانید که به طور کلی دو نوع RFID tag داریم، فعال (active) و غیرفعال (passive).
نوع پسیو، پاور مورد نیاز خود را از میدان مغناطیسیای دریافت میکند که reader (مثلا EM-18) تولید میکند. سپس از این پاور استفاده میکند تا میکروچیپ درون خود را فعال کند. میکروچیپ هم پس از فعال شدن دادهی خود را برای reader ارسال میکند.
اما نوع اکتیو RFIDها خود منبع پاور جداگانهای نیاز دارند و میتوانند تا ظرفیت 1MB داده را برای خواندن یا نوشتن مبادله کنند.
EM-18 RFID Reader
هر RFID یک شناسه (ID) منحصر به فرد دارد که در درون میکروچیپ آن تعبیه میشود و با استفاده از RFID reader قابل دسترسی است. EM-18 یکی از ماژولهای مشهور کارتخوان است که آنتن تعبیه شده درون آن در فرکانس 125KHz کار کرده و منبع تغذیهی مورد نیاز آن یک منبع ۵ ولت است که هم دارای پورت خروجی سریال و هم دارای پورت خروجی weigand است. ابعاد آن بین ۸ تا ۱۲ سانتیمتر است. پارامترهای ارتباط سریال آن به این ترتیب هستند؛ 9600bps ،8data bits و 1stop bit.
از این ماژول در سیستمهای بسیاری مانند موارد زیر استفاده میشود.
- سیستم حضور و غیاب مبتنی بر RFID
- سیستمهای امنیتی
- ماشینهای رایگیری
- باجههای پرداخت عوارض در خیابانها
خروجی این ماژول دارای فرمت 12digit ASCII است. ۱۰ رقم اول شمارهی آن کارت و ۲ رقم آخر حاصل XOR بیتهای ID هستند. کاربرد این دو رقم آخر در بررسی و کشف خطا است.
به عنوان مثال فرض کنید شمارهی خوانده شده از روی کارتی 0200107D0D62 باشد. آنگاه داریم؛
«۰۲» پیش شمارهی کد است.
«00107D0D» اگر تبدیل به دسیمال شود برابر است با ۱۰۸۰۵۸۹.
و ۶۲ حاصل این عبارت است : 02XOR 00 XOR 10 XOR 7D XOR 0D
بنابراین ID این کارت به این ترتیب خواهد بود. ۰۰۰۱۰۸۰۵۸۹
پایههای EM-18
این ماژول دارای ۹ پایه است. از این ۹ پین، ۲ پین معمولا متصل نمیشوند بنابراین در عمل ما ۷ پایه داریم که باید آنها را به میکرو متصل کنیم. این پایهها و توضیحات هر کدام را در جدول زیر میتوانید ببینید.
ویژگیهای ماژول EM-18
- حداکثر بورد خواندن اطلاعات: ۱۰ سانتیمتر
- دمای کاری: از ۰ تا ۸۰ درجه سانتیگراد
- پارامتر ارتباط سریال: ۹۶۰۰ بیت بر ثانیه
- جریان مصرفی: کمتر از ۵۰ میلیآمپر
- فرکانس کاری: ۱۲۵ کیلوهرتز
- ولتاژ کاری: ۵ ولت
نمودار مدار و اتصالات
اتصال STM32F103C8 و LCD
اتصال STM32F103C8 و EM-18
نوشتن برنامهی میکرو برای خواندن اطلاعات RFID
در آموزشهای قبلی، نحوهی پروگرم کردن STM32 به وسیلهی USB را با هم آموختهایم. بنابراین برای این پروژه به پروگرمر FTDI نیاز نداریم. کافیست از طریق پورت USB میکرو را با PC متصل کرده و با استفاده از ARDUINO IDE آن را پروگرم کنیم. در ادامه خواهید دید که این کار بسیار ساده است.
- ابتدا کتابخانههای مربوط به نمایشگر LCD را به کد اضافه کرده و پینهای متصل به آن را نیز مشخص میکنیم.
#include <LiquidCrystal.h> const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
- سپس وارد بخش ()void setup میشویم.
مود نمایشگر LCD را روی ۲*۱۶ و بادریت ارتباط سریال را روی ۹۶۰۰ و پین A10 تنظیم میکنیم. (این پورت اولین پورت ارتباط سریال میکرو (RX1) است که به ماژول EM-18 متصل میشود)
lcd.begin(16, 2); Serial1.begin(9600); pinMode(PA10,INPUT);
- پیام welcome را برای نمایش شروع به کار LCD تعیین میکنیم و تنظیم میکنیم که پس از چند لحظهی کوتاه پاک شود.
lcd.print("CIRCUIT DIGEST"); //Prints at LCD display lcd.setCursor(0, 1); //Set courser to second line lcd.print("RFID WITH STM32"); //Prints at LCD display delay(5000); //Delay for 5 Seconds lcd.clear(); //Clears LCD display lcd.setCursor(0,0); //Sets cursor at First Line lcd.print("RFID TAG NO:"); //Prints at LCD display lcd.setCursor(0,1); //Sets cursor at Second line
- در بخش ()void loop، زمانی که دادهها توسط کارتخوان از کارت خوانده شدند و روی پین ارتباط سریال میکرو قرار گرفتند، بیت به بیت ذخیره شده و بر روی LCD نمایش داده میشوند.
{ while(Serial1.available() && count < 12) { RFID[count] = Serial1.read(); count++; lcd.print(RFID[count]); if (count==12) { lcd.print(" "); count = 0; lcd.setCursor(0, 1); } } }
تنها کاری که حالا باید انجام دهید این است که کد کامل را بر روی میکروی خود بارگذاری کرده و سیستم را راهاندازی کنید. حال اگر هر کارت RFID را به ماژول کارتخوان نزدیک کنید، خواهید دید که ID آن بر روی LCD نمایش داده میشود.
کد کامل این پروژه و ویدئویی از انجام مراحل بالا را هم برای شما قرار دادهایم که میتوانید در صورت علاقهمندی ببنید.
کد
//Interfacing EM-18 RFID READER MODULE with STM32F103C8 //Circuit Digest #include <LiquidCrystal.h> //Library for using LCD display functions const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to STM32F103C8 LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD display int count = 0; char RFID[12]; //Arrary for storing 12 characters of ID void setup() { lcd.begin(16, 2); // setting LCD as 16x2 type Serial1.begin(9600); //begins serial communication at 9600 baud rate pinMode(PA10,INPUT); //Set PA10 as input pin from EM-18 lcd.print("CIRCUIT DIGEST"); //Prints at LCD display lcd.setCursor(0, 1); //Set courser to second line lcd.print("RFID WITH STM32"); //Prints at LCD display delay(5000); //Delay for 5 Seconds lcd.clear(); //Clears LCD display lcd.setCursor(0,0); //Sets cursor at First Line lcd.print("RFID TAG NO:"); //Prints at LCD display lcd.setCursor(0,1); //Sets cursor at Second line } void loop() { while(Serial1.available() && count < 12) // While loop to read 12 characters and store them in input array { RFID[count] = Serial1.read(); //storing 12 characters one by one count++; lcd.print(RFID[count]); //showing 12 characters on LCD one by one if (count==12) { lcd.print(" "); count = 0; // once 12 characters are read get to start and wait for second ID lcd.setCursor(0, 1); //move courser to start. } } }
ویدئو
- منبع: ترجمه از سایت circuitdigest.com
امیدواریم آموزش «اتصال RFID به میکروکنترلر STM32» برای شما مفید واقع شده باشد. در ادامه پیشنهاد میکنیم دیگر آموزشهای STM32 را نیز مطالعه کنید.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.