در این نوشته و نوشتهی بعد مرور سریعی خواهیم داشت بر روی اینکه RFID چیه و کجاها کاربرد داره و بعد یاد میگیریم چطور ماژول RC522 رو در آردوینو راه اندازی کنیم و به وسیلهی اون اطلاعات کارتهای Mifare رو بخونیم.
در این پست آموزشی:
- مقدمهای بر روی ماژول RC522 و تگهای RFID خواهیم داشت و یاد میگیرم که چطور کتابخانههای لازم برای کار با ماژول RC522 رو نصب کنیم.
- یاد میگیرم که UID چیه و چطور اون رو بخونیم.
- و در انتها یک گیت عبور و مرو خیلی خیلی ساده با استفاده از RFID میسازیم.
و در پست آموزشی بعد:
- مروری خواهیم داشت بر روی بلوکهای ذخیره اطلاعات در تگهای Mifare.
- یاد میگیریم چطور اطلاعاتمون رو بر روی تگهای Mifare ذخیره و بازیابی کنیم.
به چه قطعههایی احتیاج داریم؟
- ماژول RC522
- حداقل دو تگ RFID (که معمولا همراه ماژول یک کارت و یک تگ سوئیچی هست.)
- آردوینو UNO
RFID چیه؟
کارتهای شهروندی [مترو/اتوبوس]، کارت دانشجوییها، دستبندهایی که جدیدا در استخرها استفاده میشود و به وسیلهی اون میتوانیم در کمد رختکن رو باز و بسته کنیم و یا تگهای دزدگیری که در مغازهها به لباسها متصل میکنن همه و همه RFID هستن.
مدلهای مختلفی از تگ RFID داریم [که من به اونها اشاره نمیکنم ویکی پدیا برای این کارهاست نه اینجا :)] فقط این رو باید بدونیم که تگهایی که در بالا بهشون اشاره کردم [احتمالابجز دزدگیرها] همه تگهای غیر فعال از نوع Mifare هستن.
چه کارهایی می تونیم با RFID انجام بدیم؟
دم دستیترین و اصلیترین کاربرد تگهای RFID برای جاهایی هست که میخواهیم یک کارت شناسایی به افراد اختصاص بدهیم و احتمالا اون کارت شناسایی قراره یک سری اطلاعات رو در خودش ذخیره کنه.
با چی اطلاعات کارت های RFID رو بخونیم؟
ماژول RC522 همون چیزیه که برای خواندن و نوشتن اطلاعات تگهای RFID ازش استفاده خواهیم کرد.
من چندسال پیش دیتاشیت این ماژول رو خوندم و سعی کردم اون رو با AT91SAM7x راه اندازی کنم اما موفق نشدم، چند روز پیش برای یک پروژهی دیگه نیاز به RFID داشتم و در جست و جوهایی که انجام دادم کتابخانههای کاملی برای کار با ماژول RC522 در آردوینو و رزبریپای دیدم.
این کتابخانهها انقدر خوب و کامل هستن که کار با ماژول RC522 رو به یک پروژهی فوق العاده شیرین تبدیل میکنن.
اما چرا از ماژول RC522 استفاده میکنیم؟ چه ویژگیهایی داره؟
قیمت ارزان، قیمت ارزان و باز هم قیمت ارزان! قیمت روز این ماژول حدود ۱۲ هزاتومانه و ماژولهای دیگه از ۵۰ هزارتومان به بالا قیمت دارن.
ما میخواهیم اطلاعات کارتهای RFID رو بخوانیم و احتمالا دادههایی رو روی کارت ذخیره کنیم، برای انجام این کارها هیچ نیازی به سختافزارهای آنچنانی و گران قیمت نداریم.
تفاوت اصلی ماژول RC522 با سایر ماژولهای دیگه در اینه که این ماژول به شکل کامل باید توسط برنامه نویس راهاندازی بشه (دیتاشیت رو بخونید تا بفهمید از چه اژدهای دوسری دارم حرف میزنم!) اما ماژولهای دیگه عموما کارهای راه اندازی اولیه رو انجام دادهاند و اطلاعات رو به شکل USART در اختیار کاربر قرار میدهند.
بعضی از ماژولها هم مقداری حافظه دائم در اختیار ما قرار میدهند که با یک EEPROM میشه اون ویژگی رو هم به RC522 اضافه کرد.
نظر شخصی؟ وقتیکه کتابخونههای کاملی برای راه اندازی RC522 داریم استفاده از ماژولهای دیگه پول دور ریختن خواهد بود!
دوتا نکته رو باید در مورد RC522 بدونیم:
- این ماژول امکان ارتباط با میکروکنترلر رو از طریق پروتکلهای SPI و I2C و سریال داره. (که ما با SPI کار میکنیم).
- ولتاژ تغذیه ماژول 3.3 ولت هست.
نصب کتابخانهی مورد نیاز برای کار با ماژول RC522 در Arduino ide:
کتابخانهی Arduino RFID Library for MFRC522 رو از +این آدرس دانلود کنید.
مطابق تصویر زیر از منو Sketch –> Include Library گزینه Add .ZIP Library رو انتخاب کنید:
به محل دانلود کتابخانه رفته و اون رو انتخاب کنید.
اگر همهچیز به درسی پیش رفته باشه از آدرس Sketch –> Include Library اضافه شدن کتابخانه MRC522 رو میتوانید ببینید.
همچنین اگر به منو File –> Exampels بروید مثالهای آمادهای رو برای کار با RC522 خواهید دید.
پایههای RC522 و نحوهی اتصال ماژول به آردیونو.
ترتیب پایههای RC522 به شکل زیر است:
بسته به نوع میکروکنترلر مرود استفاده شمارهی پیینهایی که باید ماژول رو به اونها وصل کنیم متفاوت خواهد بود، جدول کامل در آدرس زیر موجود است:
ما از آدروینو UNO اسفتاده میکنیم پس باید پایههای ماژول رو به شکل زیر به برد متصل کنیم:
Wiring to Arduino Uno | Pin |
Digital 10 | SDA |
Digital 13 | SCK |
Digital 11 | MOSI |
Digital 12 | MISO |
بدون اتصال | IRQ |
GND | GND |
Digital 9 | RST |
3.3V | 3.3V |
خواندن تمام اطلاعات یک کارت Mifare:
برای اینکه مطعئن بشویم اتصالات رو به درستی سیمکشی کردهایم و کتابخانه به درستی نصب شده از مثال DumpInfo همراه خود کتابخانه استفاده میکنیم.
این مثال تمامی اطلاعات کارت رو خوانده و آنها رو در پورت سریال نمایش میدهد.
[اگر نمیدونید چطور با پورت سریال کار کنید به +این لینک سر بزنید :)]
از منو File -> Exampels -> RC522 گزینهی DumpInfo رو انتخاب میکنیم.
برنامه را کامپایل و پروگرم کنید و یک ترمینال سریال باز کنید، با نزدیککردن یک کارت RFID به بخش آنتن ماژول RC522 تمامی اطلاعات داخل کارت نمایش داده خواهد شد.
[اگر نمی دونید چطور کدتون رو کامپایل و پروگرم کنید در بخشی از +این نوشته مراحل کار رو توضیح دادهام.]
ایجاد یک گیت عبور و مرور ساده:
هر کارت Mifare یک شمارهی شناسایی دارد که با اسم UID شناخته میشود، ما میخواهیم این شماره رو بخوانیم و بر اساس اینکه UID در حافظهی برنامه ذخیره شده یا نه اجازهی عبو ررا صادر کنیم
(خیلی میشد این برنامه رو کامل کرد و فکر کنم یکی از مثالهای این کتابخونه در همین زمینه است، به شکلی که یک کارت مستر تعریف شده و با استفاده از اون کارت میشود کاربر جدید تعریف کرد. اما ما به همین برنامهی ساده اکتفا میکنیم.)
یک LED را به پایهی شمارهی A0 آدریونو متصل کنید.
اول کد برنامه رو ببنیم بعد بخشهای مهم اون رو توضیح خواهم داد:
/* ------------------------------------------------------------------------ Example sketch/program showing how to read UID from a RC522 to serial. If UID is in our dataset we turn on access status LED. ------------------------------------------------------------------------ +-----------------------+ | | Arduino | | Signal | Uno Pin | +-----------------------+ | RST/Reset | 9 | +-----------------------+ | SPI SS | 10 | +-----------------------+ | SPI MOSI | 11 | +-----------------------+ | SPI MISO | 12 | +-----------------------+ | SPI SCK | 13 | +-----------------------+ */ #include <SPI.h> #include <MFRC522.h> #define LED_PIN A0 //defie rc552 pins: #define SS_PIN 10 #define RST_PIN 9 MFRC522 rc552(SS_PIN, RST_PIN); // Instance of the class //change here the UID of the card/cards that you want to give access byte storedUID[] = {0xB2, 0x91, 0x73, 0x65}; void setup() { Serial.begin(115200); pinMode(LED_PIN, OUTPUT); // initialize LED_PIN as an output. SPI.begin(); // Init SPI bus rc552.PCD_Init(); // Init MFRC522 Serial.println("Approximate your card to the reader..."); } void loop() { // Look for new cards if ( ! rc552.PICC_IsNewCardPresent()) return; // Verify if the UID has been readed if ( ! rc552.PICC_ReadCardSerial()) return; Serial.println(F("The UID tag is:")); Serial.print(F("In hex: ")); printHex(rc552.uid.uidByte, rc552.uid.size); Serial.println(); Serial.print(F("In dec: ")); printDec(rc552.uid.uidByte, rc552.uid.size); Serial.println(); if (rc552.uid.uidByte[0] == storedUID[0] || rc552.uid.uidByte[1] == storedUID[1] || rc552.uid.uidByte[2] == storedUID[2] || rc552.uid.uidByte[3] == storedUID[3] ) { Serial.println(F("Welcome!")); digitalWrite(LED_PIN, HIGH); } else { Serial.println("Access denied"); digitalWrite(LED_PIN, LOW); } // Halt PICC rc552.PICC_HaltA(); // Stop encryption on PCD rc552.PCD_StopCrypto1(); } /** Helper routine to dump a byte array as hex values to Serial. */ void printHex(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } } /** Helper routine to dump a byte array as dec values to Serial. */ void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], DEC); } }
در خط ۲۵ پایهای که LED به آن متصل است را مشخص کردهایم.
خطهای ۲۷ تا ۳۱ شماره پایههای آردوینوای که ریست و SS ماژول به آنها متصل شده است را مشخص میکنیم.
در خط ۴۲ فرمان شروع SPI را صادر میکنیم و در خط ۴۳ راهاندازی اولیهی RC522 را فرا میخوانیم.
در خط ۳۷اوم شماهی UID یکی از کارتهایی که داریم و میخواهیم به آن اجازه عیور بدهیم را ذخیره کردهایم.
کار خطهای ۵۲ تا ۵۸ این است که برنامه را تا زمانی که یک کارت جدید به ماژول نزدیک شود منتظر نگه میدارد.
خطهای ۵۹ تا ۶۵ اطلاعات UID خوانده شده را در پورت سریال پرینت میکند.
منابع:
https://github.com/miguelbalboa/rfid
نویسنده: محمد حسین سالاری.