جلسه بیست و هفتم : راه اندازی RFID با آردوینو

سلام
این جلسه قصد دارم در مورد راه اندازی ماژول های RFID باهاتون صحبت کنم . این که تکنولوژی RFID چیه و چجوری کار می کنه و اینا رو طبق معمول یه عده از دوستان زحمت کشیدن نوشتن (بهتر و کامل تر از چیزی که من قراره بگم ) اما خب جهت آشنایی با RFID و وسواس های انتخاب در قطعات و تگ ها یه مقدار صحبت می کنیم با هم .

برای توضیح RFID با یه کاربرد رایجش شروع می کنیم. قدیما وقتی می رفتیم پارکینگ بهمون یه تیکه کاغذ میدادن که ساعت ورودمون به پارکینگ رو روش زده بود و موقع برگشت هم کاغذ رو پس میدادیم به مسئولش . اونم دستی حساب می کرد و رقم نهایی رو اعلام میکرد .
الان وقتی میریم پارکینگ موقع ورود بهمون یه کارت میدن . موقع برگشت وقتی کارت رو تحویل میدیم مسئولش کارت رو میگیره مقابل یه دستگاهی و بعد از گذشت چند ثانیه رقم نهایی رو اعلام می کنه .
کارتی که باهاش این کار انجام میشه کارت RFID هست.

به طور کلی RFID از Radio Frequency Identification میاد و معنی فارسی اش میشه شناسایی فرکانس رادیویی. شناساییش خب معلومه ، کلا هدف از این سیستم ها اینه که اطلاعات یه جا ذخیره بشه و موقع نیاز از اون اطلاعات استفاده بشه و عمل شناسایی اون داده انجام بشه. اما فرکانس رادیویی یعنی چی ؟ اگه به همون مثال پارکینگ برگردیم ، تو مدل های کارتی پارکینگ ها موقع خروج ، مسئول پارکینگ کارت رو میگیره جلوی یه دستگاه . نه سیم و کابل و رابطی وجود داره و نه حتی نیازی وجود داره که کارت رو بچسبونه به اون دستگاه . با یه فاصله کارت رو از دستگاه نگه میداره و هزینه پارکینگ رو اعلام می کنه. همین موضوع یعنی این ارتباط به صورت بی سیم داره برقرار میشه و به همین خاطر هم اسم رادیویی رو میزارن روش. اما چرا فرکانسی ! همونطور که وقتی میخوایم از یه مبدا برسیم به یه مقصد ، توی یه خیابون به طور متوسط دو تا لاین وجود داره ، هموطنور هم وقتی قراره یه داده به صورت بی سیم ارسال بشه داده میتونه روی فرکانس های مختلف ( به عنوان لاین ) ارسال بشه مثلا 2.4G یا 5.8G .
در مورد ماهیت تکنولوژی RFID میتونید از این لینک اطلاعات کامل تری رو به دست بیارید

*******************************************************

تو سیستمهای RFID به طور کلی دو بخش سخت افزاری وجود داره :
یه ریدر ( Reader ) و یه تگ یا کارت .
اول در مورد تگ صحبت می کنیم.تگ یا کارت های RFID یه تراشه توی خودشون دارن که روی اون تراشه یه سری دیتا ذخیره شده ( همون دیتاهایی که ما لازم داریم روی این تگ ها ذخیره کنیم ) . علاوه بر تراشه ، روی تگ یا کارت های RFID آنتن هم وجود داره .
rfid-card

rfid-chip-and-antenna-3
این دو تا عکس رو ببیند . توی یکیش یه تگ رو نشون داده و توی یکیش یه کارت رو نشون داده . میتونید چیپ و آنتن رو توی این عکس ها ببینید.
مدل های مختلف این تگ / کارت ها رو میتونید اینجا ببینید.

به ظاهر تگ ها نگاه کنید .بعضی هاشون دایره ای شکل هستن . بعضی هاشون مستطیلی . بعضی ها شفاف هستن . بعضی ها سکه ای . بعضی ها چسبی هستن . بعضی ها کارتی و بعضی ها هم مدل سر کلیدی .
میبیند که شکل های مختلفی دارن . بر حسب این که برای چه کاربردی از این تگ ها بخواد استفاده بشه شکلشون فرق می کنه . روی بعضی از دستگاه های الکترونیکی که میخریم مدل چسبیش رو زدن ، توی استخرا مدل دستبندیش رو گذاشتن و ….

به طور کلی تگ ها رو به دو شکل میشه تقسیم بندی کرد.
1. روش تغذیه تگ ها
2. فرکانس تگ ها

در مورد فرکانس تگ ها صحبت خواهیم کرد اما در مورد روش تغذیه یه توضیح کوتاه میدیم . قائدتا این چیپی ( تراشه ) که روی تگ های RFID گذاشتن باید بهش پاور داده بشه تا فعال بشه و بتونه کار کنه ( مثل تمام چیپ های دیگه) . بر حسب این که پاور چطوری تامین بشه دو نوع تگ داریم :
1. تگ اکتیو (Active)
2. تگ پسیو (Passive)
تگ های پسیو برای تامین پاورشون از هیچ باتری ای استفاده نمی کنن. روش کار این تگ ها به این صورته که هر وقت آنتن روی کارت سیگنالی دریافت کنه ( که این سیگنال در واقع از سمت ریدر ارسال شده ) انرژی اون سیگنال ، چیپ روی تگ رو فعال می کنه و چیپ میتونه اطلاعات ذخیره شده روی خودش رو برای ریدر بفرسته (از طریق آنتن ) . چون قراره پاور چیپ از انرژی سیگنال دریافتی تامین بشه نباید فاصله بین ریدر و تگ خیلی زیاد باشه . عملا این تگ ها ساختار ساده دارن و قیمت هاشون هم بالا نیست.
اما تگ های اکتیو این طوری نیستن . تگ های اکتیو روی خودشون یه باتری کوچیک دارن که ولتاژ مصرفی چیپ از اون تامین میشه. بر حسب این که طول عمر باتری ای که روی تگ هست چقدره قیمت تگ های اکتیو فرق میکنه اما در کل قیمت تگ های اکتیو از تگ های پسیو خیلی بیشتره . یه مشکلی که تگ های اکتیو دارن اینه که وقتی طول عمر باتری تموم شه عملا چیپ روی تگ خاموش میشه . بعضی از تگ ها طوری ساخته میشن که دسترسی به باتریشون راحته و میشه وقتی باتری تموم شد تعویضش کنن اما بعضی تگ ها به هیچ عنوان نمیشه به باتریشون دسترسی داشت . در این موارد باید تگ رو انداخت سطل آشغال !!!

اما در مورد فرکانس تگ های RFID . یه نگاهی به اسم تگ هایی که تو آفتاب لینک دادم بندازید. تو اسم بعضی ها نوشته 13.56MHz ، تو بعضی ها نوشته 125khz و تو بعضی ها هم نوشته UHF . چیزی که واضحه اینه که این عددا مربوط به فرکانس هستن ( چون واحدها به ترتیب مگاهرتز و کیلوهرتز هستن و اینا واحد فرکانس هستن ). حالا داستان چیه ؟ چرا تگ ها فرکانساشون فرق می کنه ؟
جواب اینه که کلا سه تا باند فرکانسی برای RFID داریم .
1. باند LF یا همون Low Frequency : بین 125 تا 134 کيلوهرتز (در عمل همون 125khz رو در نظر میگیریم.)
2. باند HF یا همون High Frequency :محدوده 13.56 مگاهرتز
3. باند UHF یا همون Ultra High Frequency : محدوده 860 تا 960 مگاهرتز
هر چقدر فرکانس کاری RFID بالاتر باشه فاصله ای که تگ میتونه از ریدر داشته باشه هم بیتشر میشه . به عنوان مثال سیستم های RFID ای که از باند UHF استفاده می کنن فاصله تگ و ریدرشون تا چند متر هم میرسه اما سیستم هایی که با باند LF کار می کنن فاصله تگ و ریدر فقط چند سانتی متره .
یه سوال بوجود میاد این وسط . آیا میشه هر تگی رو روی هر وسیله ای چسبوند ؟ جواب منفیه . همونطور که میدونید این یه قانونه که هر چی فرکانس بره بالاتر طول موجش کوتاه تر میشه . و همین اختلاف طول موج عاملی میشه تا هر فرکانس RFID برای یه هدف خاص مورد استفاده قرار بگیره . اینجا یه سری اطلاعات گذاشته که چه باند فرکانسی ای برای چه کاربردی مناسبه .

در مورد کارت های ( یا تگ ها ) یه نکته مهم دیگه هم وجود داره و اون هم دیتایی هست که توی کارت ذخیره میشه . ما به این دیتا میگیم آیدی (ID) . این دیتا میتونه شماره پلاک ماشین باشه ، میتونه شماره پرسنلی کارمند باشه ، میتونه شماره کمد تو استخر باشه . فرقی نمی کنه این دیتا مربوط به چیه . مهم اینه تمام این دیتاها میشن یه سری عدد و توی این کارت ها ذخیره میشن .
حجم داده ای که توی این کارتها ذخیره میشه متفاوته و یکی از فاکتور های مهم در خرید کارت / تگ اینه که حافظه این کارت برای کار مورد نطر کافی هست یا نه .

*******************************************************

قسمت دوم یه سیستم RFID ، ریدر بود. ریدر ماژول یا دستگاهی هست که اطلاعات رو از تگ RFID دریافت می کنه و بعد از اون میتونه هر بلایی سرش بیاره . میتونه وصل بشه یه میکروکنترلر مثل آردوینو و داده رو بفرسته برای آردوینو تا مورد پردازش قرار بگیره . میتونه داده رو مستقیم بفرسته برای کامپیوتر تا توی کامپیوتر مورد استفاده قرار بگیره . بسته به این که پروتکل ارتباطی چی باشه نوع انتقال داده اش هم فرق می کنه.
مثلا این دستگاه ریدر رو در نظر بگیرید :
rfid_jt400_3-500x500
این ریدر با یه کابل USB وصل میشه به کامپیوتر و تنها کاری که برای راه اندازیش لازمه انجام بشه اینه که یه notepad باز کنید و کارت رو مقابل ریدر قرار بدید . دیتا از کارت فرستاده میشه برای ریدر و ریدر اون دیتا رو از طریق کابل USB میفرسته برای کامپیوتر . کامپیوتر هم اون دیتا رو روی notepad نشون میده .

اما به این ماژول نگاه کنید :
rc522_rfid_reader-500x500
این ماژول پروتکل ارتباطیش SPI هست. مراحل استفاده از این ماژول به این صورته که کارت رو مقابل آنتن این ریدر قرار میدیم. ریدر دیتا رو دریافت می کنه . اما چون پروتکا ارتباطیش SPI هست باید حتما به یه میکروکنترلر وصل بشه و دیتا رو برای اون ارسال کنه . کاری هم که ماقصد داریم توی این جلسه انجام بدیم دقیقا همینه . قصد داریم دیتای یه کارت RFID رو به وسیله این ماژول بخونیم و توی کنسول آردوینو نمایش بدیم .
مجموعه کاملی از ریدرهای RFID رو میتونید اینجا ببینید.

دقیقا مثل تگ ها ، ریدر ها هم همون سه تا باند فرکانس LF و HF و UHF رو دارن .

اما یه سوال پیش میاد و اون هم اینه که آیا مثلا یه ریدر 13.56مگاهرتز میتونه یه تگ 125کیلوهرتزی رو بخونه ؟ جواب اکیدا منفیه. هر ریدری فقط میتونه تگ فرکانس خودش رو بخونه . ریدر 13.56 فقط میتونه تگ 13.56 رو بخونه . هیچ کدوم از تگ های دو باند دیگه روی این ریدر کار نمی کنن.

*******************************************************

تا این جای آموزش فقط داشتیم می گفتیم RFID چیه ، هر سیستم RFID چه اجزائی داره و اجزائش رو که همون تگ ها و ریدرها بودن معرفی کردیم .
حالا میریم سراغ راه اندازی ماژول RC522 با اردوینو .
این ماژول که از اینجا میتونید بخریدش فرکانس کاری اش 13.56 مگاهرتز هست و پروتکل ارتباطیش هم SPI .
مثل جلسه های پیش اول سیم بندیش رو برای اتصال با آردوینو قرار میدیم:
rfid-522-diagram-pinout-wire-arduino

اگه سیم بندی این ماژول رو با سیم بندی NRF که تو جلسه قبل بود مقایسه می بینید که پینهای SCK ، MISO و MOSI دقیقا مثل سیم بندی NRF به آردوینو وصل شده و این یعنی این سه تا پین فیکس هستن . میمونه دو تا پین. پین RST و پین SDA . پین SDA که همون پین چهارم پروتکل SPI هست ( همون CS خودمونه ) که اینجا اسمش شده SDA . بنابراین این پین میتونه به هر پین دیجیتال دلخواهی متصل بشه .پین RST هم پین ریست خود ماژول RC522 هست . این پین هم میتونه به هر پین دیجیتال دلخواهی متصل بشه .

**** باز هم به این موضوع دقت کنید که ولتاژ مصرفی این ماژول 3.3 هست 5 ولت نیست . بزنید به 5 ولت احتمال سوختنش مساوی است با 100% .
*******************************************************
و اما کد :
2016-10-31_12-44-52

قسمت 1 : معرفی کتابخونه هایی هست که داریم استفاده می کنیم. کتابخونه های استفاده شده در این کد کتابخونه های SPI و MFRC522 هستن . کتابخونه SPI کتابخونه پیش فرض آردوینو هست و هیچ نیازی به نصبش وجود نداره. اما کتابخونه MFRC522 باید به لیست کتابخونه های آردوینو اضافه بشه . فایل نصبش هم تو لینک انجمن قرار داده شده.

قسمت 2 : یک شیء به نام mfrc522 از آبجکت MFRC522 بوجود اومده . شیء ای که ساخته شده دو تا آرگومان داره . آرگومان اولش شماره پین SDA استفاده شده هست که تو پروژه ما میشه پین شماره 10 . آرگومان دوم هم شمار پین RST استفاده شده هست که ما از پین شماره 9 استفاده کردیم. همونطور که قبلا اشاره کردم این دو تا پین میتونن هر دو تا پین دیجیتال دلخواهی باشن به شرط این که توی این خط کد هم اون تغییر لحاظ بشه.

قسمت 3 : این قسمت تنظیمات تابع setup هست. تنظیماتی که تو این برنامه انجام شده تنظیم بادریت ارتباط سریال آردوینو و کامپیوتر ، فعال کردن ارتباط SPI بین آردوینو و ماژول RC522 و فعال کردن و تنظیم کردن خود ماژول RC522 هست. منظورمون از تنظیم کردن RC522 این هست که توی کتابخونه ای که برای RC522 نوشتن ( همون کتابخونه MFRC522 که بالا صداش کردیم ) میاد تمام تنظیمات و متغیرهای RC522 رو تنظیم و مقدار دهی میکنه و به اصلاح خودمون RC522 رو برای شروع کار کانفیگ می کنه . این تنظیمات رو کتابخونه انجام داده تا دردسر ما برای راه اندازی این ماژول به حداقل برسونه.

و اما تابع Loop:
2016-10-31_12-56-18

قسمت 1 : این قسمت یه if نوشته شده که به شرط این که ریدر کارت RFID ای رو در نزدیکی خودش پیدا کنه از این if رد بشه . در غیر ای صورت انقدر صبر می کنه تا یه کارت در نزدیکی ریدر دیده بشه.

قسمت 2 : این if میاد چک می کنه آیا کارتی که در نزدیکی ماژول ریدر قرار گرفته میشه باهاش ارتباط برقرار کرد و دیتاش رو خوند یا نه . اگر بتونه با کارت ارتباط برقرار کنه که از if رد میشه در غیر اینصورت پروسه خوندن آیدی کارت متوقف میشه .

قسمت 3 : وقتی وارد این قسمت میشه یعنی یه کارت RFID نزدیک ریدر تشخیص داده شده و ریدر تونسته با کارت ارتباط برقرار کنه حالا مرحله خوندن اطلاعات روی کارت رسیده . اول یه Serial.print می کنه . این قسمت فقط برای اینکه که تو کنسول داده ای که چاپ میشه قابل فهم تر باشه و اگر این خط کد برداشته هم بشه هیچ اتفاقی نمی افته . بعد از اون یه حلقه for داریم . ساختار کد نویسی حلقه for اینجا کامل توضیح داده شده. حلقه for ای که مانوشتیم یه قسمت خیلی مهم داره و اون هم حد نهاییشه ، یعنی mfrc522.uid.size . این دستور میاد حجم حافظه کارت رو در میاره . یعنی ممکنه توی یه کارت 10 بایت اطلاعات ذخیره شده باشه. خروجی این دستور میشه عدد 10 بنابراین این حلقه 10بار تکرار میشه .  توی حلقه چه اتفاقی می افته ؟ یه سریال پرینت انجام میشه . چی پرینت میشه ؟ [mfrc522.uid.uidByte[i . توی هر بار تکرار شدن حلقه for یک بایت از اطلاعات کارت پرینت میشه . با تغییر مقدار i در هر بار تکرار شدن حلقه for یک بایت جدید از کارت خونده میشه . یعنی وقتی برای اولین بار وارد حلقه میشیم [mfrc522.uid.uidByte[0 پرینت میشه . دور بعد [mfrc522.uid.uidByte[1 ، دور بعد [mfrc522.uid.uidByte[2 و الی آخر. یه کار متفاوت که توی این کد انجام داده اینه که به جای اینکه خروجی دستورmfrc522.uid.uidByte رو بریزه تو یه متغیر بعد اون متغیر رو چاپ کنه ، مستقیم اومده خروجی دستور رو چاپ کرده . با این کار تو خطوط کد نویسیش صرفه جویی کرده . در مورد دستور پرینت دو تا نکته وجود داره :
1.این که Serial.print نوشته شده نه Serial.println . اگر println نوشته میشد هر بایت توی یه خط چاپ می شد اما الان با print تمام بایت ها پشت سر هم چاپ میشن.
2.توی آرگومان دوم این دستور نوشته شده HEX . این آرگومان باعث میشه کد هگز آیدی کارت تو کنسول نمایش داده باشه . اگه میخواید خود آیدی رو ببینید کافیه HEX , رو بردارید تا دستور فقط یک آرگومان داشته باشه .
2016-10-31_13-34-31
قسمت 4 : اومده یه println خالی نوشته تا برای کارت های بعدی آیدی توخط بعد چاپ بشه . دستور mfrc522.PICC_HaltA باعث میشه اگر یک کارت رو مدت طولانی روی ریدر قرار بدی فقط یک بار آیدی اون کارت چاپ بشه . بهترین راه برای درک عملکرد این دوتا تصویر زیره :
2016-10-31_13-34-31

برای تست پروژه کافیه سیم بندی رو انجام بدید. کنسول آردوینو رو باز کنید و یه تگ یا کارت با فرکانس 13.56 مگاهرتز رو در نزدیکی آنتن ماژول قرار بدید . نیازی نیست که کارت بچسبه . میتونید تا فاصله حدود 15 سانتی متری نگهش دارید. آیدی کارت تو کنسول آردوینو نمایش داده میشه.
کد و کتابخونه مربوط به این جلسه اینجا گذاشته شده .
پایان جلسه .