راه اندازی ماژول RC522 در آردوینو − قسمت اول: ایجاد یک گیت عبور و مرور ساده با RFID

در این نوشته و نوشته‌ی بعد مرور سریعی خواهیم داشت بر روی اینکه 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 به شکل زیر است:

بسته به نوع میکروکنترلر مرود استفاده شماره‌ی پیین‌هایی که باید ماژول رو به اون‌ها وصل کنیم متفاوت خواهد بود، جدول کامل در آدرس زیر موجود است:

miguelbalboa/rfid

ما از آدروینو 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

 


نویسنده: محمد حسین سالاری.

موارد مشابه

۹ دیدگاه

  1. سلام
    برای پیدا کردن آیدی کارت یا تگی که همراه ماژول بود من کارایی که نوشتید رو انجام دادم و مثال dumplnfo رو اجرا کردم ولی در سریال مانیتور پیام
    MFRC522 Software Version: 0xFF (unknown)
    WARNING: Communication failure, is the MFRC522 properly connected?
    Scan PICC to see UID, type, and data blocks…
    رو نشون میده
    اتصالات اردوینو به ماژول رو هم چند بار چک کردم
    میشه راهنمایی کنید لطفا

  2. سلام نرم افزار اردوینو که استفاده می کنید چیست لطفا لینک دانلود این نرم افزار را که تم مشکی داره ارسال کنید مرسی

    1. نرم افزار همون IDE استانداد آردیونو هست با با اتفاوت که در اوبونتو نصب شده.
      اگر علاقه به تم مشکی دارید پیشنهاد می‌کنم از platform.io استفاده کنید، من در مورد کانفیگ اون برای برنامه‌نویسی esp8266 اینجا نوشتم:
      https://mh-salari.me/esp8266-ides/

    1. به محل نصب ide آردیونو بروید، اونجا یک پوشه به اسم libraries می‌بینید، پوشه‌ی کتابخانه‌ی مورد نظرتون رو اونجا پیدا کنید و پاک کنید‌.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *