تگ RFID چیست و چگونه کار می کند؟ | معرفی و پیاده سازی عملی — به زبان ساده
حفاظت از داراییها و اموال همواره یکی از دغدغههای انسان بوده است که برای آن راهکارهای مختلفی ارائه شده است. یکی از این راهکارها استفاده از تگ RFID است که در موارد گوناگون کاربرد دارد. در این آموزش، با سامانه RFID و اجزای آن، تگ RFID و بازخوان RFID، آشنا میشویم و روش پیادهسازی یک پروژه عملی را برای قفل کردن در با تگ RFID بررسی خواهیم کرد.
RFID چیست؟
«سامانه بازشناسی با امواج رادیویی» (Radio-frequency Identification) یا به اختصار RFID، روشی برای استفاده بدون تماس از امواج فرکانس رادیویی برای انتقال داده است که به کاربران این امکان را میدهد موجودی و داراییها را به طور خودکار و منحصر به فرد شناسایی و ردیابی کنند.
RFID از اولین کاربرد خود در شناسایی هواپیماهای خودی و دشمن تا کاربردهایی که امروزه پیدا کرده است، نه تنها سال به سال به پیشرفت خود ادامه داده، بلکه هزینه پیادهسازی و استفاده از سیستمهای مرتبط به آن نیز همواره رو به کاهش بوده است این امر باعث شده RFID مقرون به صرفه و کارآمدتر شود.
RFID چگونه کار میکند؟
یک سیستم RFID شامل دو قسمت اصلی است؛ یک فرستنده یا «تگ» (Tag) که روی جسمی قرار داده شده که میخواهیم شناسایی شود و یک ترنسیوِر (فرستنده-گیرنده) یا یک بازخوان.
«بازخوان» (Reader) از یک ماژول فرکانس رادیویی، یک واحد کنترل و یک آنتن تشکیل شده که یک میدان الکترومغناطیسی فرکانس بالا را تولید میکند. به دلیل القا، ولتاژی در سیمپیچ آنتن تولید میشود و این ولتاژ توان ریز تراشه را تأمین میکند.
اکنون که تگ دارای توان است، میتواند سیگنال فرستاده شده از بازخوان را دریافت و برای فرستادن سیگنال به آن، از تکنیکی استفاده کند که «دستکاری بار» (Load Manipulation) نام دارد. قطع و وصل بار در آنتن تگ، بر مصرف توان آنتن بازخوان تأثیر گذاشته و میتوان آن را به صورت افت ولتاژ اندازه گرفت. این تغییر ولتاژ که به عنوان صفر و یک در نظر گرفته میشود، راهی است که با آن داده از تگ به بازخوان انتقال مییابد.
همچنین، یک راه دیگر نیز وجود دارد تا دادهها را بین بازخوان و تگ انتقال داد که «کوپلینگ پراکنشی» (Backscattered Coupling) نامیده میشود. در این روش، تگ از بخشی از توان دریافتی برای تولید یک میدان الکترومغناطیسی دیگر استفاده میکند که با آنتن بازخوان دریافت میشود.
انواع RFID
در طیف الکترومغناطیسی، سه دامنه فرکانس اصلی برای انتقال RFID وجود دارد: فرکانس پایین، فرکانس بالا و فرکانس فرابالا.
مشخصات RFID فرکانس پایین به شرح زیر است:
- محدوده فرکانس عمومی: ۳۰ تا ۳۰۰ کیلوهرتز
- محدوده فرکانسی اولیه: ۱۳۵ تا ۱۳۴ کیلوهرتز
- کاربردها: از قبیل ردیابی حیوانات، کنترل دسترسی، قفل خودرو، کاربردهایی با حجم بالای مایع و فلز
- مزایا: در مجاورت مایعات و فلزات به خوبی کار میکنند، استانداردهای جهانی دارند.
- معایب: محدودت قرائت بسیار کند، حافظه کم، نرخ انتقال داده کم، هزینه تولید بالا
مشخصات RFID فرکانس بالا به شرح زیر است:
- محدوده فرکانس اولیه: ۱۳٫۵۶ مگاهرتز
- محدوده بازخوانی: تماس نزدیک (۳۰ سانتیمتر)
- کاربردها: کتابخانهها، کارتهای شناسایی شخصی، تراشههای بازی، کاربردهای NFC
- مزایا: پروتکلهای جهانی NFC، انتخابهای حافظه بزرگتر، استانداردهای جهانی
- معایب: محدوده بازخواندن کوتاه، نرخ انتقال داده پایین
مشخصات RFID فرکانس فرابالا به شرح زیر است:
- محدوده فرکانس عمومی: ۳۰۰ تا ۳۰۰۰ مگاهرتز
- محدودههای فرکانس اولیه: ۴۳۳ مگاهرتز، ۸۶۰ تا ۹۶۰ مگاهرتز
RFID اکتیو
سیستمهای RFID اکتیو شامل تگهایی هستند که برای افزایش محدوده، منبع تغذیه داخلی خود را دارند. تگهای اکتیو یک باتری و معمولاً اجزای SMD بزرگتری دارند. پس از پیشتنظیم زمان، تگ یک «چهچهه» فرکانس رادیویی ساطع میکند. یک بازخوان در مجاورت میتواند این چهچهه را بشنود. از آنجا که تگ اکتیو است، آنها میتوانند در فواصل بسیار بزرگتر از تگهای پسیو بازخوانی شوند. برخی از ویژگیهای RFID اکتیو به صورت زیر است:
- محدوده فرکانس اولیه: ۴۳۳ مگاهرتز
- محدوده بازخوانی: ۳۰ تا ۱۰۰ متر
- کاربردها: ردیابی وسایل نقلیه، کارخانههای خودکار، معدنکاری، ساخت و ساز، ردیابی کالا
- مزایا: محدوده بازخوانی بسیار طولانی، هزینه زیرساخت پایینتر (نسبت به RFID پسیو)، ظرفیت حافظه زیاد، نرخ انتقال داده بالا
- معایب: هزینه بالا به ازای هر تگ، محدودیتهای حمل و نقل (به دلیل باتریها)، نرمافزار پیچیده، تداخل بالا در فلز و مایعات، استانداردهای جهانی کم
RFID پسیو
در سیستم RFID پسیو، تگها از باتری استفاده نمیکنند. در عوض، انرژی خود را از بازخوان دریافت میکنند. بازخوان یک میدان انرژی یک تا چند متری ساطع میکند و انرژی لازم را برای هر تگ در مجاورت خود فراهم میکند. تگ انرژی الکترومغناطیسی را از کارتخوان دریافت میکند، توان میگیرد و به اطلاعات شناسایی پاسخ میدهد. تگهای پسیو این مزیت را دارند که میتوانند با سرعت بالایی (10 بار یا بیشتر از آن در ثانیه) خوانده شوند. این نوع RFIDها بسیار نازک (میتوان آنها را بین لایههای کاغذ قرار داد) و بسیار ارزان هستند.
برخی از ویژگیهای RFID پسیو به صورت زیر هستند:
- محدودههای فرکانس اولیه: ۸۶۰ تا ۹۶۰ مگاهرتز
- محدوده قرائت: نزدیکی تماس (۲۵ متر)
- کاربردها: ردیابی زنجیره تأمین، ساخت، داروسازی، عوارض الکترونیکی، ردیابی موجودی، زمانبندی مسابقه، ردیابی دارایی
- مزایا: محدوده قرائت طویل، هزینه پایین به ازای هر تگ، تنوع اندازهها و شکلهای تگها، استانداردهای جهانی، نرخ انتقال داده بالا
- معایب: هزینه بالای تجهیزات، ظرفیت حافظه متوسط، تداخل زیاد فلز و مایعات
کاربردهای RFID چیست؟
کاربردهای متنوعی وجود دارد که در آنها از RFID استفاده میشود. این کاربردها در حوزههای مختلفی از ردیابی موجودی کالا تا مدیریت زنجیره تأمین هستند و بسته به شرکت یا صنعت میتوانند تخصصیتر شوند. نوع کاربردهای RFID میتواند از ردیابی دارایی IT گرفته تا ردیابی منسوجات و حتی موارد خاص مانند ردیابی اقلام اجارهای را شامل شود.
آنچه یک کاربرد بالقوه RFID را از کاربردهای دیگر جدا میکند، نیاز به شناسایی منحصر به فرد با سرعت و کارایی بیشتر در مواردی است که سیستمهای سنتی در آن ناتوان هستند. چند کاربرد که از فناوری RFID استفاده میکنند به این شرح هستند: زمانبندی مسابقه، مدیریت زنجیره تأمین، ردیابی دارویی، ردیابی موجودی، ردیابی دارایی IT، ردیابی لباس و پارچه، پیگیری پرونده، ردیابی مورد حمل و نقل برگشتپذیر (RTI)، پیگیری رویداد و شرکتکننده، کنترل دسترسی، ردیابی خودرو، عوارض، ردیابی نوزادان بیمارستان، ردیابی حیوانات، ردیابی ابزار، ردیابی جواهرات، ردیابی موجودی خردهفروشی، ردیابی لوله و قرقره، ردیابی لجستیک (مدیریت مواد)، کیوسکهای DVD، پیگیری کتابهای کتابخانه، کمپینهای بازاریابی و سیستمهای مکانیابی زمانواقعی.
تگ RFID
یک تگ RFID یا RFID Tag در سادهترین شکل خود، از دو قسمت تشکیل شده است: یک آنتن برای ارسال و دریافت سیگنالها و یک تراشه یا آیسی RFID که شناسه تگ و سایر اطلاعات را ذخیره میکند.
تگ RFID اطلاعات مربوط به شیء را از طریق امواج رادیویی به ترکیب آنتن/بازخوان منتقل میکند. تگهای RFID معمولاً باتری ندارند (مگر اینکه به عنوان تگهای اکتیو یا BAP مشخص شده باشند). در عوض، آنها انرژی را از امواج رادیویی تولید شده توسط بازخوان دریافت میکنند. هنگامی که تگ سیگنال را از بازخوان/آنتن دریافت میکند، انرژی از طریق آنتن داخلی به تراشه تگ منتقل میشود. این انرژی تراشه را فعال و با اطلاعات مورد نظر مدوله میکند و سپس سیگنال را به سمت آنتن/بازخوان منتقل میکند.
در هر تراشه، چهار بانک حافظه وجود دارد: کد محصول الکترونیکی (EPC)، حافظه شناسایی تگ (TID)، یوزر و رزرو. هر یک از این بانکهای حافظه حاوی اطلاعاتی در مورد چیزی است که برچسبگذاری یا تگ شده یا خود تگ بسته به بانک و موارد مشخص شده دارد. صدها تگ RFID مختلف در اشکال و اندازههای مختلف با ویژگیها و مشخصات خاص برای محیطها، مواد سطحی و کاربردهای مختلف در دسترس است.
از آنجا که کاربردهای RFID بسیار متنوع است، تگهای RFID و روشهای دستهبندی آنها نیز بسیار متنوع است. یک روش معمول برای تقسیم تگها، دستهبندیشان به دو نوع قابل انعطاف و سخت است. نوع قابل انعطاف ارزانتر است. در طرف مقابل، تگهای سخت معمولاً مقاومتر هستند. تگها بر اساس موارد زیر دستهبندی میشوند:
- فرم فاکتور: قابل انعطاف، لیبل (برچسب)، کارت، نشان و سخت
- نوع فرکانس: فرکانس پایین (LF)، ارتباطات میداننزدیک (NFC)، فرکانس بالا (HF) و فرکانس بسبالا (UHF) پسیو، پسیو به کمک باتری (BAP) و اکتیو
- عوامل محیطی: مقاوم در برابر آب، سخت، مقاوم در برابر دما، مقاوم در برابر مواد شیمیایی
- قابلیت تنظیم: شکل، اندازه، متن، رمزگذاری
- ویژگیها/کاربردهای خاص: تگهای لباسشویی، تگهای سنسور، تگهای قابل جاسازی، تگهای قابل انعطاف، تگهای خودرو، تگهای حافظه بالا
- مواد مخصوص سطح: تگهای نصب فلزی، تگهای نصب شیشه، تگها برای موارد پر از مایع
برای انتخاب تگ RFID باید به پرسشهای زیر پاسخ دهیم:
- تگ RFID را میخواهیم روی چه سطحی قرار دهیم؟
- محدوده بازخوانی مطلوب چقدر است؟
- محدودیتهای اندازه تگ چه هستند؟
- شرایط محیطی از قبیل گرما، رطوبت، در معرض ضربه بودن و... چگونهاند؟
- روش چسباندن تگ چگونه است؟ (چسب، اپوکسی، پرچ، پیچ و...)
نکته کلیدی برای انتخاب تگ، تست انواع مختلفی از تگها در محیط روی اجسام واقعی است که میخواهیم با آنها کار کنیم. پکهای نمونه تگ RFID را میتوان برای کاربردهای مورد نظر سفارشیسازی کرد و به انتخاب مناسب رسید.
بازخوان RFID
بازخوان RFID یا RFID Reader مغز سیستم RFID است و برای هر سیستمی که بر این اساس کار میکند، ضروری است. بازخوانها، قطعاتی هستند که موجهای رادیویی را ارسال و دریافت میکنند تا با تگ RFID ارتباط برقرار کنند. بازخوانهای RFID معمولاً به دو نوع بازخوان RFID ثابت و بازخوان RFID سیار تقسیم میشوند.
بازخوانهای ثابت در یک مکان ثابت قرار دارند و معمولاً روی دیوارها، میزها، ورودیها یا سایر مکانهای ثابت نصب میشوند. زیرمجموعه مشترک بازخوانهای ثابت، بازخوانهای یکپارچه هستند. یک بازخوان RFID یکپارچه بازخوانی با یک آنتن داخلی است که معمولاً شامل یک پورت آنتن اضافه برای اتصال یک آنتن خارجی اختیاری نیز هست. بازخوانهای یکپارچه معمولاً ظاهر زیبایی دارند و برای استفاده در کاربردهای داخلی بدون ترافیک زیاد طراحی شدهاند.
بازخوانهای سیار قطعاتی هستند که امکان انعطافپذیری بیشتری را فراهم میکنند و در هنگام بازخوانی تگ RFID میتوانند با یک کامپیوتر میزبان یا دستگاه هوشمند ارتباط برقرار کنند. بازخوانهای RFID سیار دو دسته اصلی دارند: بازخوانهایی با کامپیوتر آنبرد به نام دستگاه محاسبات سیار، و بازخوانهایی که از اتصال بلوتوث یا کمکی به دستگاه یا تبلت هوشمند موسوم به «سورتمه» (Sleds) استفاده میکنند.
بازخوانهای RFID ثابت معمولاً دارای پورتهای آنتن خارجی هستند که میتوانند از یک آنتن اضافه تا هشت آنتن مختلف را در هر نقطه متصل کنند. با افزودن مالتی پلکسر، برخی از بازخوانها میتوانند تا حداکثر به 32 آنتن RFID متصل شوند. تعداد آنتنهای متصل به یک بازخوان به ناحیه مورد نیاز برای RFID بستگی دارد. در برخی از موارد، مانند بررسی پروندههای داخل و خارج، یک ناحیه کوچک برای پوشش کافی است، بنابراین یک آنتن به خوبی کار میکند. سایر کاربردها با ناحیه پوشش بیشتر، مانند خط پایان در زمانبندی مسابقه، معمولاً به آنتنهای متعددی برای ایجاد منطقه پوشش مناسب نیاز دارند.
متداولترین روش برای دستهبندی بازخوانها دستهبندی آنها به دو نوع ثابت و سیار است. موارد دیگری که میتوان بر اساس آنها بازخوانهای RFID را دستهبندی کرد، اتصال، ویژگیها، قابلیت پردازش، روشهای تأمین توان، پورتهای آنتن و... است. محدوده فرکانس بازخوانها در آمریکا ۹۰۲ تا ۹۲۸ مگاهرتز و برای اروپا ۸۶۵ تا ۸۶۸ مگاهرتز است. بازخوانها را میتوان به وایفای، بلوتوث، LAN، رابط سریال، USB و پورت کمکی متصل کرد. این بخش از سیستم RFID، قابلیت پردازش آنبرد و پردازش غیر آنبرد را دارد. برای تأمین توان بازخوانها میتوان از آداپتور برق، PoE، باتری، یو اس بی و... استفاده کرد. بازخوانها در انواع بدون پورت خارجی، یک پورت، دو پورت، ۴ پورت، ۸ پورت و ۱۶ پورت موجود هستند.
برای انتخاب بازخوان باید به پرسشهای زیر پاسخ دهیم:
- محدوده بازخوانی مورد نیاز چقدر است؟
- شرایط محیطی، از قبیل گرما، رطوبت و... چگونه است؟
- آیا میخواهیم بازخوان را به یک شبکه اضافه کنیم؟
- بازخوان در چه مکانی قرار میگیرد؟
- آیا نیاز است بازخوان سیار باشد؟
- چه تعداد ناحیه یا نقطه برای بازخوانی نیاز است؟
- چه تعداد تگ در یک لحظه لازم است؟
- تگها باید چقدر سریع باشند؟ (یک تسمه نقاله کند یا یک مسابقه سریع تفاوت دارد)
آنتن RFID
آنتن RFID عنصر اساسی در یک سیستم RFID است، زیرا سیگنال بازخوان را به امواج فرکانس رادیویی تبدیل میکند که توسط تگ RFID قابل شناسایی است. بدون آنتن RFID، چه تجمیع شده و چه مستقل، بازخوان RFID نمیتواند به خوبی سیگنالها را برای تگ RFID ارسال کند.
برخلاف بازخوانهای RFID، آنتنهای RFID تجهیزات غیرهوشمندی هستند که توان خود را مستقیماً از بازخوان دریافت میکنند. وقتی انرژی بازخوان به آنتن منتقل میشود، آنتن یک میدان فرکانس رادیویی تولید میکند. در نتیجه، یک سیگنال فرکانس رادیویی به تگهای مجاور فرستاده میشود. بازده آنتن در تولید امواج در یک جهت خاص، به عنوان بهره آنتن شناخته میشود. به زبان ساده، هرچه بهره بالاتر باشد، آنتن قویتر بوده و آنتن میدان فرکانس رادیویی گستردهتری تولید خواهد کرد.
آنتن RFID امواج RFID را در طول یک صفحه افقی یا عمودی میگستراند که به عنوان پلاریته آنتن شناخته میشود. اگر میدان فرکانس رادیویی یک صفحه افقی باشد، به صورت خطی افقی تعریف میشود و قاعده مشابهی برای آنتن RFID که یک صفحه عمودی را ایجاد میکند، برقرار است.
پلاریته آنتن میتواند اثر قابل توجهی روی محدوده بازخوانی سیستم داشته باشد. کلید اصلی بیشینه کردن محدوده بازخوانی، اطمینان از همسانی پلاریته آنتن با پلاریته تگ RFID است. اگر اینها با هم مطابقت نداشته باشند، به عنوان مثال، آنتن پلاریزه خطی عمودی و تگ با آنتن پلاریزه خطی افقی، دامنه بازخوانی به شدت کاهش مییابد.
آنتن قطبیده دایرهای امواجی را که به طور مداوم بین صفحههای افقی و عمودی میچرخند، ارسال میکند تا با اجازه دادن بازخوانی تگهای RFID در جهتهای مختلف، انعطافپذیری بیشتری ارائه دهد. با این حال، از آنجا که انرژی بین دو صفحه تقسیم میشود، محدوده بازخوانی آنتن با قطبش دایرهای در مقایسه با آنتن خطی با بهره مشابه، کوتاهتر است.
آنتنهای RFID را مانند سایر تجهیزات RFID میتوان به روشهای مختلفی دستهبندی کرد. متداولترین معیارهایی که میتوان آنتنهای RFID را بر اساس آنها طبقهبندی کرد، قطبش (دایرهای و خطی) و محل نصب (داخلی و خارجی) است. محدوده فرکانسی آنتنهای RFID معمولاً در یکی از بازههای ۹۰۲ تا ۹۲۸ مگاهرتز، ۸۶۵ تا ۸۶۸ مگاهرتز، ۸۶۰ تا ۹۶۰ مگاهرتز است و قطبش آنها میتواند دایرهای یا خطی باشد. آنتنها میتوانند طبق استاندارد IP داخلی یا IP خارجی باشند. همچنین، محدوده بازخوانی میتواند میداننزدیک یا میداندور باشد. آنتنها را میتوان به شکل قفسهای، زمینی، صفحهای و آنتن دروازهای تهیه کرد.
برای انتخاب آنتن RFID باید به پرسشهای زیر پاسخ دهیم:
- محدوده بازخوانی مورد نیاز چقدر است؟
- شرایط محیطی، از قبیل گرما، رطوبت و... چگونه است؟
- آنتن در محوطه داخلی نصب میشود یا محوطه بیرونی؟
- محدودیتهای اندازه آنتن چیست؟
پروژه تگ RFID قفل در با آردوینو
اکنون که روش کار تگ RFID را میدانیم، میتوانیم یک پروژه ساده تگ RFID را برای قفل در انجام دهیم.
در این پروژه، از تگهای مبتنی بر پروتکل MIFARE و بازخوان MFRC522 استفاده میکنیم که هزینه کمی دارند.
این تگها دارای ۱ کیلوبایت حافظه هستند و یک ریزتراشه دارند که عملیات حسابی را انجام میدهد. فرکانس کاری ۱۳٫۵۶ مگاهرتز و فاصله عملکردی، بسته به هندسه آنتن، تا ۱۰ سانتیمتر است. اگر یکی از تگها را در مقابل یک منبع نور مثل چراغ قرار دهیم، میتوانیم آنتن و ریزتراشه را که قبلاً درباره آنها بحث کردیم، مشاهده کنیم.
در ماژول بازخوان RFID، از پروتکل SPI برای ارتباط با برد آردوینو استفاده میشود. باید VCC را به ماژول برای 3٫3 ولت متصل کنیم و برای سایر پینها نگرانی نداریم، زیرا ۵ ولت را تحمل میکنند.
بعد از آنکه ماژول را وصل کردیم، باید کتابخانه MFRC522 را از این لینک دانلود کنیم. کتابخانه چندین مثال خوب دارد که با استفاده از آنها میتوانیم یاد بگیریم چگونه از ماژول استفاده کنیم. ابتدا میتوانیم مثال "DumpInfo" را آپلود کرده و تست کنیم تا ببینیم سیستممان به خوبی کار میکند. اکنون، اگر «مانیتور سریال» (Serial Monitor) را اجرا کرده و تگ را به ماژول نزدیک کنیم، بازخوان شروع به بازخوانی تگ خواهد کرد و همه اطلاعات از تگ روی مانیتور سریال نمایش داده خواهد شد.
در اینجا میتوانیم عدد UID تگ و حافظه ۱ کیلوبایت را که دقیقاً به ۱۶ بخش تقسیم شده است، ببینیم. هر بخش به ۴ بلوک تقسیم شده و هر بلوک را میتوان با ۲ بایت داده ذخیره کرد. در اینجا ما از حافظه تگ استفاده نمیکنیم، بلکه از عدد UID تگ استفاده میکنیم.
قبل از آنکه کد قفل در با تگ RFID را بررسی کنیم، اجزای مدار و شماتیک آن را ارائه میکنیم.
علاوه بر ماژول RFID، از یک سنسور مجاورتی برای بررسی بسته یا باز بودن در استفاده میکنیم. همچنین از یک سروو موتور برای مکانیزم قفل کردن و نیز یک نمایشگر کاراکتر استفاده میکنیم.
فهرست عناصری که استفاده میکنیم، به شرح زیر است:
- ماژول MFRC522
- سروو موتور AZDelivery 5 x SG90
- نمایشگر AZDelivery HD44780 1602
- برد آردوینو [Arduino Mega 2560 [A000067
- برد بورد AZDelivery MB 102 Breadboard Kit - 830
- سنسور مجاورتی Oulensy SEMICONDUCTOR CNY70
روش کار پروژه بدین صورت است: ابتدا باید یک تگ مستر را تنظیم کنیم و سپس سیستم به حالت نرمال میرود. اگر یک تگ ناشناس را اسکن کنیم، با دسترسی مخالفت خواهد شد، اما اگر تگ مستر را اسکن کنیم، از جایی که میتوانیم تگ ناشناس را اضافه و مجاز کنیم به «حالت برنامه» (Program Mode) وارد خواهیم شد. بنابراین، اکنون اگر یک بار دیگر تگ را اسکن کنیم، دسترسی برقرار خواهد شد و میتوانیم در را باز کنیم.
بعد از آنکه در را ببندیم، به طور خودکار قفل خواهد شد. اگر بخواهیم یک تگ را از سیستم حذف کنیم، باید مجدداً وارد مد برنامه شویم و تگی که شناسایی شده را اسکن کنیم تا از سیستم حذف شود.
برای نوشتن کدها، ابتدا لازم است کتابخانهها را برای ماژول RFID، نمایشگر و سروو موتور فراخوانی کرده و متغیرها را تعریف کنیم.
1#include <SPI.h>
2#include <MFRC522.h>
3#include <LiquidCrystal.h>
4#include <Servo.h>
5
6#define RST_PIN 9
7#define SS_PIN 10
8
9byte readCard[4];
10char* myTags[100] = {};
11int tagsCount = 0;
12String tagID = "";
13boolean successRead = false;
14boolean correctTag = false;
15int proximitySensor;
16boolean doorOpened = false;
17
18// Create instances
19MFRC522 mfrc522(SS_PIN, RST_PIN);
20LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
21Servo myServo; // Servo motor
در بخش setup، ابتدا ماژولها را مقداردهی اولیه میکنیم، و مقدار اولیه سروو موتور را در وضعیت قفل قرار میدهیم. سپس پیام اولیه را برای نمایش چاپ میکنیم و با حلقه "while" صبر میکنیم تا یک تگ مستر اسکن شود. تابع ()getID تابعی است که UID تگ را میگیرد و آن را در مکان اول آرایه [myTags[0 قرار میدهیم.
1void setup() {
2 // Initiating
3 SPI.begin(); // SPI bus
4 mfrc522.PCD_Init(); // MFRC522
5 lcd.begin(16, 2); // LCD screen
6 myServo.attach(8); // Servo motor
7 myServo.write(10); // Initial lock position of the servo motor
8 // Prints the initial message
9 lcd.print("-No Master Tag!-");
10 lcd.setCursor(0, 1);
11 lcd.print(" SCAN NOW");
12 // Waits until a master card is scanned
13 while (!successRead) {
14 successRead = getID();
15 if ( successRead == true) {
16 myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
17 lcd.clear();
18 lcd.setCursor(0, 0);
19 lcd.print("Master Tag Set!");
20 tagsCount++;
21 }
22 }
23 successRead = false;
24 printNormalModeMessage();
25}
اکنون میخواهیم تابع ()getID را بررسی کنیم. این تابع، ابتدا این موضوع را بررسی میکند که یک تگ جدید در نزدیکی بازخوان قرار دارد یا خیر و اگر چنین است، وارد حلقه "for" میشود که UID تگ را بگیرد. تگهایی که در اینجا از آنها استفاده کردهایم، یک عدد UID چهار بایتی دارند. به همین دلیل باید ۴ تکرار را با این حلقه انجام دهیم و با استفاده از تابع ()concat چهار بایت را در یک متغیر رشتهای تکی قرار دهیم. همچنین، همه کاراکترهای رشته را در کیسهای بالایی قرار میدهیم و در پایان بازخوانی را متوقف میکنیم.
1uint8_t getID() {
2 // Getting ready for Reading PICCs
3 if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
4 return 0;
5 }
6 if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
7 return 0;
8 }
9 tagID = "";
10 for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
11 readCard[i] = mfrc522.uid.uidByte[i];
12 tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
13 }
14 tagID.toUpperCase();
15 mfrc522.PICC_HaltA(); // Stop reading
16 return 1;
17}
پیش از اینکه وارد حلقه اصلی شویم، در پایان بخش setup، تابع ()printNormalModeMessage را فراخوانی میکنیم که پیام "Access Control" را روی نمایشگر چاپ میکند.
1void printNormalModeMessage() {
2 delay(1500);
3 lcd.clear();
4 lcd.print("-Access Control-");
5 lcd.setCursor(0, 1);
6 lcd.print(" Scan Your Tag!");
7}
در حلقه اصلی، با خواندن مقدار سنسور مجاورتی شروع میکنیم که به ما میگوید در بسته است یا خیر.
1int proximitySensor = analogRead(A0);
بنابراین، اگر در بسته باشد، با استفاده از خطوط مشابهی که در تابع ()getID توصیف کردیم، UID تگ جدید را اسکن میکنیم و میگیریم. ذکر این نکته در اینجا ضروری است که به دلیل "return" در گزارههای "if"، تا زمانی که یک تگ را اسکن نکنیم، کد پیش نمیرود.
به محض آنکه تگ را اسکن کنیم، بررسی میکنیم که آیا آن تگ، تگ مستری است که قبلاً ثبت کردهایم یا خیر و اگر جواب مثبت باشد، وارد مد برنامه میشویم. در این مد، اگر تگی را که از قبل مجاز است اسکن کنیم، از سیستم حذف میشود، یا اگر تگ ناشناس باشد، به عنوان تگ مجاز به سیستم اضافه خواهد شد.
1// Checks whether the scanned tag is the master tag
2 if (tagID == myTags[0]) {
3 lcd.clear();
4 lcd.print("Program mode:");
5 lcd.setCursor(0, 1);
6 lcd.print("Add/Remove Tag");
7 while (!successRead) {
8 successRead = getID();
9 if ( successRead == true) {
10 for (int i = 0; i < 100; i++) {
11 if (tagID == myTags[i]) {
12 myTags[i] = "";
13 lcd.clear();
14 lcd.setCursor(0, 0);
15 lcd.print(" Tag Removed!");
16 printNormalModeMessage();
17 return;
18 }
19 }
20 myTags[tagsCount] = strdup(tagID.c_str());
21 lcd.clear();
22 lcd.setCursor(0, 0);
23 lcd.print(" Tag Added!");
24 printNormalModeMessage();
25 tagsCount++;
26 return;
27 }
28 }
29 }
بیرون از مد برنامه، با حلقه "for" بعدی بررسی میکنیم که آیا تگ اسکن شده برابر با تگهای ثبت شده است و باید در را باز کنیم یا اینکه از دسترسی به آن جلوگیری کنیم. در پایان، در گزاره "else" منتظر میمانیم تا زمانی که در بسته شود، آنگاه در را قفل میکنیم و پیام مد نرمال را مجدداً چاپ میکنیم.
1// Checks whether the scanned tag is authorized
2 for (int i = 0; i < 100; i++) {
3 if (tagID == myTags[i]) {
4 lcd.clear();
5 lcd.setCursor(0, 0);
6 lcd.print(" Access Granted!");
7 myServo.write(170); // Unlocks the door
8 printNormalModeMessage();
9 correctTag = true;
10 }
11 }
12 if (correctTag == false) {
13 lcd.clear();
14 lcd.setCursor(0, 0);
15 lcd.print(" Access Denied!");
16 printNormalModeMessage();
17 }
18 }
19 // If door is open...
20 else {
21 lcd.clear();
22 lcd.setCursor(0, 0);
23 lcd.print(" Door Opened!");
24 while (!doorOpened) {
25 proximitySensor = analogRead(A0);
26 if (proximitySensor > 200) {
27 doorOpened = true;
28 }
29 }
30 doorOpened = false;
31 delay(500);
32 myServo.write(10); // Locks the door
33 printNormalModeMessage();
34 }
اکنون کد زیر را برای تکمیل پروژه مینویسیم:
1/*
2* Arduino Door Lock Access Control Project
3*
4* by Dejan Nedelkovski, www.HowToMechatronics.com
5*
6* Library: MFRC522, https://github.com/miguelbalboa/rfid
7*/
8
9#include <SPI.h>
10#include <MFRC522.h>
11#include <LiquidCrystal.h>
12#include <Servo.h>
13
14#define RST_PIN 9
15#define SS_PIN 10
16
17byte readCard[4];
18char* myTags[100] = {};
19int tagsCount = 0;
20String tagID = "";
21boolean successRead = false;
22boolean correctTag = false;
23int proximitySensor;
24boolean doorOpened = false;
25
26// Create instances
27MFRC522 mfrc522(SS_PIN, RST_PIN);
28LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
29Servo myServo; // Servo motor
30
31void setup() {
32 // Initiating
33 SPI.begin(); // SPI bus
34 mfrc522.PCD_Init(); // MFRC522
35 lcd.begin(16, 2); // LCD screen
36 myServo.attach(8); // Servo motor
37
38 myServo.write(10); // Initial lock position of the servo motor
39 // Prints the initial message
40 lcd.print("-No Master Tag!-");
41 lcd.setCursor(0, 1);
42 lcd.print(" SCAN NOW");
43 // Waits until a master card is scanned
44 while (!successRead) {
45 successRead = getID();
46 if ( successRead == true) {
47 myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
48 lcd.clear();
49 lcd.setCursor(0, 0);
50 lcd.print("Master Tag Set!");
51 tagsCount++;
52 }
53 }
54 successRead = false;
55 printNormalModeMessage();
56}
57
58void loop() {
59 int proximitySensor = analogRead(A0);
60 // If door is closed...
61 if (proximitySensor > 200) {
62 if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
63 return;
64 }
65 if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
66 return;
67 }
68 tagID = "";
69 // The MIFARE PICCs that we use have 4 byte UID
70 for ( uint8_t i = 0; i < 4; i++) { //
71 readCard[i] = mfrc522.uid.uidByte[i];
72 tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
73 }
74 tagID.toUpperCase();
75 mfrc522.PICC_HaltA(); // Stop reading
76
77 correctTag = false;
78 // Checks whether the scanned tag is the master tag
79 if (tagID == myTags[0]) {
80 lcd.clear();
81 lcd.print("Program mode:");
82 lcd.setCursor(0, 1);
83 lcd.print("Add/Remove Tag");
84 while (!successRead) {
85 successRead = getID();
86 if ( successRead == true) {
87 for (int i = 0; i < 100; i++) {
88 if (tagID == myTags[i]) {
89 myTags[i] = "";
90 lcd.clear();
91 lcd.setCursor(0, 0);
92 lcd.print(" Tag Removed!");
93 printNormalModeMessage();
94 return;
95 }
96 }
97 myTags[tagsCount] = strdup(tagID.c_str());
98 lcd.clear();
99 lcd.setCursor(0, 0);
100 lcd.print(" Tag Added!");
101 printNormalModeMessage();
102 tagsCount++;
103 return;
104 }
105 }
106 }
107 successRead = false;
108 // Checks whether the scanned tag is authorized
109 for (int i = 0; i < 100; i++) {
110 if (tagID == myTags[i]) {
111 lcd.clear();
112 lcd.setCursor(0, 0);
113 lcd.print(" Access Granted!");
114 myServo.write(170); // Unlocks the door
115 printNormalModeMessage();
116 correctTag = true;
117 }
118 }
119 if (correctTag == false) {
120 lcd.clear();
121 lcd.setCursor(0, 0);
122 lcd.print(" Access Denied!");
123 printNormalModeMessage();
124 }
125 }
126 // If door is open...
127 else {
128 lcd.clear();
129 lcd.setCursor(0, 0);
130 lcd.print(" Door Opened!");
131 while (!doorOpened) {
132 proximitySensor = analogRead(A0);
133 if (proximitySensor > 200) {
134 doorOpened = true;
135 }
136 }
137 doorOpened = false;
138 delay(500);
139 myServo.write(10); // Locks the door
140 printNormalModeMessage();
141 }
142}
143
144uint8_t getID() {
145 // Getting ready for Reading PICCs
146 if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
147 return 0;
148 }
149 if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
150 return 0;
151 }
152 tagID = "";
153 for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
154 readCard[i] = mfrc522.uid.uidByte[i];
155 tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
156 }
157 tagID.toUpperCase();
158 mfrc522.PICC_HaltA(); // Stop reading
159 return 1;
160}
161
162void printNormalModeMessage() {
163 delay(1500);
164 lcd.clear();
165 lcd.print("-Access Control-");
166 lcd.setCursor(0, 1);
167 lcd.print(" Scan Your Tag!");
168}
معرفی فیلم آموزش برد آردوینو (Arduino) با انجام پروژه های عملی
برای آشنایی بیشتر با آردوینو پیشنهاد میکنیم به فیلم آموزش برد آردوینو (Arduino) با انجام پروژه های عملی «فرادرس» مراجعه کنید که مدت زمان آن ۱۹ ساعت و ۱۰ دقیقه است.
در درس اول این آموزش که در ۹ درس تدوین شده، معرفی اجمالی با برد آردوینو (Arduino) بیان شده است. در درس دوم، واحد ارتباط سریال در آردوینو مورد بحث قرار گرفته است. موضوع درس سوم واحد PWM و ADC در آردوینو است.
واحد وقفه و SPI در آردوینو نیز در درسهای چهارم و پنجم معرفی شدهاند. به واحد TWI و I2C در آردوینو نیز در درس ششم پرداخته شده است. حافظه EEPROM نیز موضوع درس هفتم است. آرایهها و رشتهها در آردوینو از مباحث مهمی هستند که در درس هشتم گنجانده شدهاند و در نایت، برنامهنویسی پیشرفته برد آردوینو در درس نهم آموزش داده شده است.
- برای مشاهده فیلم آموزش برد آردوینو (Arduino) با انجام پروژه های عملی + اینجا کلیک کنید.
با سلام ما یک دستگاه کنترل تردد داریم که مجبوریم پشت یک شیشه قرار دهیم ،ولی متاسفانه موجب میشود که انتن دستگاه و تگ به سختی با هم ارتباط برقرار کنند و بعضی از تگ ها رو هم نخواند ،
لطفاً بفرمایید امکان دارد برد آنتن را تقویت کنیم ؟
یا برد انتن را افزایش دهیم؟