آموزش راه اندازی rfid | تصور کن وارد یک فروشگاه مواد غذایی میشوی، سبد خریدت را با هر چیزی که لازم داری پر میکنی و بعد بدون اینکه جلوی صندوق توقف کنی، مستقیم از در فروشگاه خارج میشوی.
دیگر خبری از ایستادن در صفهای طولانی و اسکن شدن تکتک کالاها توسط صندوقدار نیست!
آموزش راه اندازی rfid
این کار حالا به لطف فناوری RFID امکانپذیر شده است.
فناوری RFID به فروشگاهها اجازه میدهد سیستمهای پرداخت خودکار ایجاد کنند. در این روش، روی هر محصول یک برچسب کوچک RFID نصب میشود. وقتی خریدت تمام شد، کافی است از یک بخش مخصوص عبور کنی؛ در آنجا دستگاههای RFID تمام کالاهای داخل سبدت را تقریباً در یک لحظه شناسایی میکنند.
سیستم بهصورت خودکار میفهمد چه چیزهایی خریدهای و بدون اینکه لازم باشد سبد را خالی کنی یا منتظر اسکن شدن هر کالا بمانی، هزینه را محاسبه و ثبت میکند.
اگر به ساخت یک پروژه RFID علاقهمند هستی (شاید نه در حد یک فروشگاه کامل، بلکه در مقیاس کوچکتر)، ماژول RC522 RFID Reader/Writer انتخاب بسیار مناسبی است.
این ماژول میتواند هم اطلاعات را از تگهای RFID بخواند و هم اطلاعات جدید روی آنها بنویسد. همین قابلیت، امکانات زیادی برای ساخت پروژههای خلاقانه با آردوینو در اختیارت میگذارد.
فقط با چند اتصال ساده به برد آردوینو میتوانی پروژههایی مثل:
- سیستم کنترل دسترسی (مثلاً درب هوشمند)
- سیستم ثبت حضور و غیاب
- سیستم مدیریت موجودی کالا
- یا هر ایده خلاقانه دیگری
را پیادهسازی کنی.
خب، بیایید شروع کنیم! در ادامه با خانه رباتیک ایران همراه باشید.
فناوری RFID چیست و چگونه کار میکند؟
یک سیستم RFID (شناسایی با امواج رادیویی) از دو بخش اصلی تشکیل شده است:
Reader (خواننده)
Tag (تگ یا برچسب)
🔹 RFID Reader (خواننده)
خواننده RFID شامل یک ماژول فرکانس رادیویی و یک آنتن است که اطراف خود یک میدان الکترومغناطیسی با فرکانس بالا ایجاد میکند.
🔹 RFID Tag (تگ)
تگ RFID به شیء یا کالایی که میخواهیم شناسایی یا ردیابی کنیم متصل میشود.
بیشتر تگها پسیو (Passive) هستند؛ یعنی باتری یا منبع تغذیه جداگانه ندارند. آنها تا زمانی که وارد میدان الکترومغناطیسی خواننده نشوند، غیرفعال باقی میمانند.
RFID چگونه کار میکند؟
وقتی یک تگ وارد میدان ایجادشده توسط خواننده میشود، امواج رادیویی خواننده در آنتن تگ یک جریان الکتریکی بسیار کوچک القا میکنند.
این جریان کوچک، انرژی کافی برای روشن شدن میکروچیپ داخل تگ را فراهم میکند.
داخل این میکروچیپ اطلاعات مهمی درباره شیء موردنظر ذخیره شده است. وقتی تگ فعال شد، این اطلاعات را به خواننده ارسال میکند.
این فرآیند «بکاسکتر (Backscatter)» نام دارد.
این روش، تگ خودش سیگنال رادیویی جدید تولید نمیکند؛ بلکه سیگنال ارسالی خواننده را تغییر میدهد (یا بهاصطلاح فنی، آن را مدوله میکند) و همان را بازمیگرداند.
در نهایت، خواننده این سیگنال تغییر یافته را دریافت کرده، اطلاعات را رمزگشایی میکند و آن را برای پردازش بیشتر به یک کامپیوتر یا میکروکنترلر (مثل آردوینو) ارسال میکند.
بیشتر تگهای RFID از نوع پسیو (Passive) هستند، نوع دیگری به نام اکتیو (Active) هم وجود دارد.
تگهای اکتیو دارای منبع تغذیه داخلی (مثل یک باتری کوچک) هستند. به همین دلیل میتوانند در فاصلههای بسیار بیشتری با خواننده ارتباط برقرار کنند، چون برای تأمین انرژی به میدان الکترومغناطیسی خواننده وابسته نیستند.
فرکانسهای مختلف در RFID
سیستمهای RFID در فرکانسهای مختلفی کار میکنند و هر کدام کاربرد و مزایای خاص خودشان را دارند:
فرکانس پایین (LF – Low Frequency)
- برد کوتاهتری دارند.
- بیشتر در ردیابی حیوانات یا کارتهای دسترسی استفاده میشوند.
فرکانس بالا (HF – High Frequency)
- تعادل خوبی بین برد و سرعت انتقال داده دارند.
- مناسب برای کتابخانهها، کارتهای بانکی و پروژههای دانشجویی و آردوینو
فرکانس فوقالعاده بالا (UHF – Ultra High Frequency)
- برد خواندن بیشتری دارند.
- مناسب برای انبارها و خطوط تولید صنعتی که کالاها با سرعت حرکت میکنند.
ماژول RC522
ماژول RFID مدل RC522 در محدوده فرکانس بالا (HF) و به طور خاص در ۱۳.۵۶ مگاهرتز کار میکند.
این ویژگی باعث میشود برای پروژههایی که نیاز به خواندن کارت از فاصله چند سانتیمتری دارند بسیار مناسب باشد، مثل:
- قفل الکترونیکی درب
- سیستم حضور و غیاب
- نمایشگرهای تعاملی
آشنایی با سختافزار (Hardware Overview)
ماژول RC522 که بر پایه چیپ MFRC522 شرکت NXP ساخته شده، یکی از ارزانترین گزینههای RFID موجود در بازار است.
به همین دلیل انتخابی عالی برای پروژههای دانشجویی و آزمایشگاهی محسوب میشود.
🔹 تگهای همراه ماژول
معمولاً این ماژول همراه با دو نوع تگ عرضه میشود:
- یک کارت شبیه کارت بانکی
- یک جاکلیدی (Key Fob)
هر دوی این تگها دارای ۱ کیلوبایت حافظه (۱KB) هستند.
شاید ۱ کیلوبایت کم به نظر برسد، اما برای بسیاری از پروژهها کاملاً کافی است.
نکته جالب اینجاست که RC522 فقط خواننده نیست؛ بلکه میتواند اطلاعات جدید هم روی تگها بنویسد.
یعنی میتوانی:
- پیام دلخواه ذخیره کنی
- کد شناسایی اختصاصی تعریف کنی
- شناسه کاربر بنویسی
- یا هر دادهای که پروژهات نیاز دارد.
استاندارد ارتباطی
ماژول RC522 در فرکانس ۱۳.۵۶MHz کار میکند و با تگهایی سازگار است که از استاندارد ISO 14443A پیروی میکنند.
این استاندارد مجموعه قوانینی است که مشخص میکند دستگاههای RFID چگونه با هم ارتباط برقرار کنند.
روشهای ارتباط با آردوینو
برای اتصال RC522 به میکروکنترلر (مثل آردوینو) چند روش وجود دارد:
- SPI (سریعترین روش)
- I2C
- UART
این انعطافپذیری باعث میشود بتوانی بسته به پروژه و نوع بردت، روش مناسب را انتخاب کنی.
قابلیت مهم: Interrupt
یکی از ویژگیهای جالب RC522 قابلیت ایجاد وقفه (Interrupt) است.
به جای اینکه آردوینو مدام بپرسد:
«آیا کارت نزدیک هست؟ آیا کارت نزدیک هست؟» ماژول خودش وقتی کارت را تشخیص دهد، به آردوینو اطلاع میدهد.
این باعث میشود:
- مصرف انرژی کمتر شود.
- برنامه سریعتر و بهینهتر کار کند.
ولتاژ کاری
ماژول RC522 با ولتاژ ۲.۵ تا ۳.۳ ولت کار میکند.
اما خبر خوب این است که پایههای ارتباطی آن تحمل ۵ ولت (۵V Tolerant) دارند.
یعنی میتوانی آن را مستقیماً به آردوینو ۵ ولتی وصل کنی و معمولاً نیازی به مبدل سطح ولتاژ (Logic Level Converter) نخواهی داشت.
مشخصات فنی (Technical Specifications)
- محدوده فرکانس: ۱۳.۵۶ MHz (باند ISM)
- رابط ارتباطی: SPI / I2C / UART
- ولتاژ کاری: ۲.۵V تا ۳.۳V
- جریان مصرفی در حالت فعال: ۱۳ تا ۲۶ میلیآمپر
- جریان در حالت خاموش (Power Down): حدود ۱۰ میکروآمپر
- ورودیهای منطقی: سازگار با ۵ ولت
- برد خواندن: حدود ۵ سانتیمتر
پایههای ماژول RC522
ماژول RC522 دارای ۸ پایه برای اتصال به آردوینو یا سایر میکروکنترلرهاست.
هر پایه وظیفه مشخصی دارد (که معمولاً شامل VCC، GND، RST، SDA، SCK، MOSI، MISO و IRQ میشود).
توضیح پایههای ماژول RC522
🔹 VCC
این پایه وظیفه تأمین برق ماژول را دارد.
ماژول به ولتاژی بین ۲.۵ تا ۳.۳ ولت نیاز دارد، بنابراین میتوانی آن را به پایه ۳.۳V آردوینو وصل کنی.
⚠️ نکته مهم:
اگر اشتباهی آن را به پایه ۵V وصل کنی، احتمال دارد ماژول برای همیشه آسیب ببیند.
🔹 RST (Reset)
این پایه برای ریست کردن یا قرار دادن ماژول در حالت خاموش (Power-Down) استفاده میشود.
- اگر این پایه به زمین (LOW) وصل شود → ماژول وارد حالت خاموش میشود.
در این حالت:
اسیلاتور متوقف میشود.
پایههای ورودی غیرفعال میشوند.
- وقتی سیگنال از LOW به HIGH تغییر کند → ماژول ریست شده و دوباره فعال میشود.
🔹 GND
پایه زمین است و باید به پایه GND آردوینو وصل شود.
🔹 IRQ
این پایه برای ارسال وقفه (Interrupt) استفاده میشود.
وقتی کارت RFID نزدیک شود، این پایه به آردوینو اطلاع میدهد.
(البته در بسیاری از پروژههای ساده از این پایه استفاده نمیشود.)
پایههای ارتباطی (چندمنظوره)
🔹 MISO / SCL / Tx
این پایه بسته به نوع ارتباط، عملکرد متفاوتی دارد:
- در حالت SPI → پایه MISO (داده از ماژول به آردوینو)
- در حالت I2C → پایه SCL (کلاک سریال)
- در حالت UART → پایه Tx (ارسال داده از ماژول)
🔹 MOSI
در حالت SPI، داده از آردوینو به ماژول از این پایه ارسال میشود.
🔹 SCK (Serial Clock)
در حالت SPI، پالسهای کلاک از آردوینو به ماژول از طریق این پایه ارسال میشود.
🔹 SS / SDA / Rx
این هم یک پایه چندمنظوره است:
- در حالت SPI → پایه SS (Slave Select)
- در حالت I2C → پایه SDA (داده سریال)
- در حالت UART → پایه Rx (دریافت داده)
معمولاً روی برد کنار این پایه یک علامت مربعی وجود دارد که به شناسایی سایر پایهها کمک میکند.
اتصال ماژول RC522 به آردوینو
حالا که با پایهها آشنا شدیم، برویم سراغ سیمکشی.
مرحله ۱: اتصال تغذیه
VCC ماژول → ۳.۳V آردوینو
GND ماژول → GND آردوینو
مرحله ۲: اتصال ریست و وقفه
پایه RST → به یک پایه دیجیتال آردوینو (مثلاً پایه ۹)
پایه IRQ → در این پروژه وصل نمیشود.
(چون کتابخانهای که استفاده میکنیم از وقفه پشتیبانی نمیکند.)
مرحله ۳: اتصال SPI
برای ارتباط سریع، بهتر است از SPI سختافزاری آردوینو استفاده کنیم.
در آردوینو UNO یا Nano V3.0 پایههای SPI به این صورت هستند:
SCK → پایه ۱۳
MISO → پایه ۱۲
MOSI → پایه ۱۱
SS (CS) → پایه ۱۰
اگر از برد دیگری استفاده میکنی، حتماً مستندات رسمی آردوینو را بررسی کن.
جدول خلاصه اتصالات
| RC522 Module | Arduino | |
| VCC | ۳.۳V | |
| GND | GND | |
| RST | ۹ | |
| MISO / SCL / Tx | ۱۲ | |
| MOSI | ۱۱ | |
| SCK | ۱۳ | |
| SS / SDA / Rx | ۱۰ |
بعد از انجام این اتصالات، سختافزار آماده است و میتوانی وارد مرحله برنامهنویسی شوید. 👌
نصب کتابخانه RC522
برقراری ارتباط با RC522 ممکن است در نگاه اول پیچیده به نظر برسد، اما نگران نباشید! کتابخانهای به نام MFRC522 وجود دارد که کار خواندن و نوشتن تگها را بسیار ساده میکند. این کتابخانه به صورت پیشفرض در Arduino IDE نصب نیست و باید آن را اضافه کنیم.
مراحل نصب:
۱. نرمافزار Arduino IDE را باز کن.
۲. روی آیکون Library Manager در سمت چپ کلیک کن.
۳. در قسمت جستجو بنویس:
`mfrc522`
۴. کتابخانهای که توسط Github Community منتشر شده را پیدا کن.
۵. روی دکمه Install کلیک کن.
اکنون کتابخانه آماده استفاده است.
خواندن یک کارت RFID با آردوینو
بعد از نصب کتابخانه:
۱. در Arduino IDE وارد منوی File → Examples شوید.
۲. به بخش MFRC522 بروید.
۳. برنامه نمونه DumpInfo را انتخاب کنید.
این برنامه یک تگ RFID را میخواند و تمام اطلاعات ذخیرهشده روی آن را در Serial Monitor نمایش میدهد.
اجرای برنامه خواندن کارت
حالا برنامه (Sketch) را روی آردوینو آپلود کن و Serial Monitor را باز کن.
وقتی کارت یا جاکلیدی RFID را به ماژول نزدیک کنی، اطلاعاتی روی صفحه نمایش داده میشود، از جمله:
- شناسه یکتای کارت (UID)
- مقدار حافظه کارت
- و حتی محتوای کامل حافظه ۱ کیلوبایتی آن
فقط دقت کن کارت را تا پایان خواندن اطلاعات، ثابت و نزدیک ماژول نگه داری.
ساختار حافظه MIFARE Classic 1K
برای اینکه بتوانی بهدرستی از کارت استفاده کنی، باید بدانی حافظه آن چگونه سازماندهی شده است.
حافظه ۱ کیلوبایتی کارت مثل یک ساختمان آپارتمانی منظم تقسیمبندی شده است:
- کل حافظه به ۱۶ سکتور (Sector) تقسیم شده است.
(شمارهگذاری از ۰ تا ۱۵) - هر سکتور شامل ۴ بلاک (Block) است.
(شمارهگذاری از ۰ تا ۳) - هر بلاک میتواند ۱۶ بایت داده ذخیره کند.
اگر محاسبه کنیم:
۱۶ سکتور × ۴ بلاک × ۱۶ بایت = ۱۰۲۴ بایت = ۱ کیلوبایت
به همین دلیل به آن کارت ۱K میگویند.
نکته مهم درباره بلاکها
در هر سکتور:
بلاکهای ۰، ۱ و ۲ → قابل استفاده برای ذخیره دادههای ما
بلاک شماره ۳ → به نام Sector Trailer
Sector Trailer چیست؟
آخرین بلاک هر سکتور (بلاک ۳) شامل اطلاعات خاصی به نام Access Bits است.
این بخش تعیین میکند:
- کدام بلاکها قابل خواندن هستند.
- کدام بلاکها قابل نوشتن هستند.
- و چه سطح دسترسیای دارند.
به همین دلیل نمیتوانیم از بلاک شماره ۳ برای ذخیره داده دلخواه استفاده کنیم.
در نتیجه: هر سکتور فقط ۳ بلاک قابل نوشتن دارد.
یعنی: ۳ بلاک × ۱۶ بایت = ۴۸ بایت فضای قابل استفاده در هر سکتور
بلاک سازنده (Manufacturer Block)
یک استثنا هم وجود دارد: بلاک شماره ۰ در سکتور ۰
یعنی: Sector 0 – Block 0
این بلاک به نام Manufacturer Block شناخته میشود.
این بلاک شامل:
اطلاعات کارخانه سازنده
شناسه یکتای کارت (UID)
اطلاعات سختافزاری چیپ
⚠️ هشدار بسیار مهم:
هرگز سعی نکن این بلاک را تغییر دهی یا بازنویسی کنی.
اگر این کار را انجام دهی ممکن است:
- کارت برای همیشه قفل شود.
- دیگر قابل استفاده نباشد.
نوشتن اطلاعات روی کارت RFID با آردوینو
حالا که خواندن کارت را یاد گرفتی، بیایید یک مرحله جلوتر برویم:
میخواهیم اطلاعات دلخواه خودمان را روی کارت ذخیره کنیم و بعد دوباره آن را بخوانیم.
در این آزمایش یاد میگیری:
- چطور داده روی کارت بنویسی
- چطور آن را دوباره بخوانی
- و چطور حافظه کارت را مدیریت کنی
قبل از اینکه وارد توضیح خطبهخط شویم، برنامه (Sketch) مربوط به نوشتن روی کارت را روی آردوینو آپلود کن و ببین چگونه کار میکند.
|
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ ۴۳ ۴۴ ۴۵ ۴۶ ۴۷ ۴۸ ۴۹ ۵۰ ۵۱ ۵۲ ۵۳ ۵۴ ۵۵ ۵۶ ۵۷ ۵۸ ۵۹ ۶۰ ۶۱ ۶۲ ۶۳ ۶۴ ۶۵ ۶۶ ۶۷ ۶۸ ۶۹ ۷۰ ۷۱ ۷۲ ۷۳ ۷۴ ۷۵ ۷۶ ۷۷ ۷۸ ۷۹ ۸۰ ۸۱ ۸۲ ۸۳ ۸۴ ۸۵ ۸۶ ۸۷ ۸۸ ۸۹ ۹۰ ۹۱ ۹۲ ۹۳ ۹۴ ۹۵ ۹۶ ۹۷ ۹۸ ۹۹ ۱۰۰ ۱۰۱ ۱۰۲ ۱۰۳ |
#include //include the SPI bus library #include //include the RFID reader library #define SS_PIN 10 //slave select pin #define RST_PIN 9 //reset pin MFRC522 mfrc522(SS_PIN, RST_PIN); // instatiate a MFRC522 reader object. MFRC522::MIFARE_Key key; //create a MIFARE_Key struct named 'key', which will hold the card information //this is the block number we will write into and then read. int block = ۲; byte blockcontent[۱۶] = { "Last-Minute-Engg" }; //an array with 16 bytes to be written into one of the 64 card blocks is defined //byte blockcontent[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //all zeros. This can be used to delete a block. //This array is used for reading out a block. byte readbackblock[۱۸]; void setup() { Serial.begin(۹۶۰۰); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card (in case you wonder what PCD means: proximity coupling device) Serial.println("Scan a MIFARE Classic card"); // Prepare the security key for the read and write functions. for (byte i = ۰; i < ۶; i++) { key.keyByte[i] = 0xFF; //keyByte is defined in the "MIFARE_Key" 'struct' definition in the .h file of the library } } void loop() { // Look for new cards if (!mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if (!mfrc522.PICC_ReadCardSerial()) { return; } Serial.println("card selected"); //the blockcontent array is written into the card block writeBlock(block, blockcontent); //read the block back readBlock(block, readbackblock); //uncomment below line if you want to see the entire 1k memory with the block written into it. //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //print the block contents Serial.print("read block: "); for (int j = ۰; j < ۱۶; j++) { Serial.write(readbackblock[j]); } Serial.println(""); } //Write specific block int writeBlock(int blockNumber, byte arrayAddress[]) { //this makes sure that we only write into data blocks. Every 4th block is a trailer block for the access/security info. int largestModulo4Number = blockNumber / 4 * 4; int trailerBlock = largestModulo4Number + 3; //determine trailer block for the sector if (blockNumber > 2 && (blockNumber + 1) % 4 == 0) { Serial.print(blockNumber); Serial.println(" is a trailer block:"); return ۲; } Serial.print(blockNumber); Serial.println(" is a data block:"); //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("PCD_Authenticate() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۳; //return "3" as error message } //writing the block status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, ۱۶); //status = mfrc522.MIFARE_Write(9, value1Block, 16); if (status != MFRC522::STATUS_OK) { Serial.print("MIFARE_Write() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۴; //return "4" as error message } Serial.println("block was written"); } //Read specific block int readBlock(int blockNumber, byte arrayAddress[]) { int largestModulo4Number = blockNumber / ۴ * ۴; int trailerBlock = largestModulo4Number + ۳; //determine trailer block for the sector //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("PCD_Authenticate() failed (read): "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۳; //return "3" as error message } //reading a block byte buffersize = ۱۸; //we need to define a variable with the read buffer size, since the MIFARE_Read method below needs a pointer to the variable that contains the size... status = mfrc522.MIFARE_Read(blockNumber, arrayAddress, &buffersize); //&buffersize is a pointer to the buffersize variable; MIFARE_Read requires a pointer instead of just a number if (status != MFRC522::STATUS_OK) { Serial.print("MIFARE_read() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۴; //return "4" as error message } Serial.println("block was read"); } |
وقتی کد را اجرا کنید و یک کارت را اسکن کنید، باید خروجی را در مانیتور سریال ببینید.
آموزش راه اندازی rfid
توضیحات کد:
برنامه با وارد کردن دو کتابخانه مهم آغاز میشود: SPI.h، که به آردوینو در ارتباط با ماژول RFID با استفاده از پروتکل SPI کمک میکند، و MFRC522.h، که حاوی توابعی برای کنترل ماژول RFID است.
|
۱ ۲ |
#include //include the SPI bus library #include //include the RFID reader library |
سپس پینهایی که ماژول RFID را به آردوینو وصل میکنند را تعریف میکنیم:
|
۱ ۲ |
#define SS_PIN 10 //slave select pin #define RST_PIN 9 //reset pin |
بعد از آن، یک نمونه (instance) از کلاس MFRC522 ایجاد میکنیم که به ما امکان تعامل با ماژول RFID را میدهد. همچنین کلید امنیتی را تعریف میکنیم تا بتوانیم دادهها را به کارت بخوانیم و بنویسیم.
|
۱ ۲ |
MFRC522 mfrc522(SS_PIN, RST_PIN); // instatiate a MFRC522 reader object. MFRC522::MIFARE_Key key;//create a MIFARE_Key struct named 'key', which will hold the card information |
سپس، ما Sector#0 Block#2 را به عنوان مکان حافظهای که میخواهیم دادههای خود را در آن ذخیره کنیم انتخاب میکنیم. به یاد داشته باشید، کارتهای RFID به بخشهایی تقسیم میشوند و هر بخش شامل چهار بلاک است. بسیار مهم است که هرگز به بلاک #۳ از هیچ بخش.write نکنید چرا که این بلاک، بلاک Sector Trailer است و تنظیمات امنیتی را نگه میدارد. بهطور تصادفی نویشتن روی این بلاک میتواند کل بخش کارت را غیرقابل استفاده کند.
|
۱ ۲ |
//this is the block number we will write into and then read. int block=۲; |
برای ذخیره دادههای ما، یک آرایه از ۱۶ بایت به نام blockcontent تعریف میکنیم و مقدار آن را برابر با “Last-Minute-Engg” قرار میدهیم. اگر هرگز بخواهید محتوای یک بلاک را محو کنید، میتوانید به سادگی آن را با صفرها بازنویسی کنید.
|
۱ ۲ |
byte blockcontent[۱۶] = {"Last-Minute-Engg"}; //an array with 16 bytes to be written into one of the 64 card blocks is defined //byte blockcontent[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //all zeros. This can be used to delete a block. |
برای تأیید اینکه فرایند نوشتن با موفقیت انجام شده است، ما همچنین آرایهای دیگر به نام readbackblock تعریف میکنیم. جالب است که این آرایه طولی برابر با ۱۸ بایت دارد نه ۱۶ بایت. دلیل این امر این است که تابع MIFARE_Read از کتابخانه MFRC522 به یک بافر حداقل ۱۸ بایت نیاز دارد، با وجود اینکه هر بلاک در واقع فقط ۱۶ بایت داده دارد.
|
۱ ۲ |
//This array is used for reading out a block. byte readbackblock[۱۸]; |
در تابع setup() سه مورد را مقداردهی اولیه میکنیم: ارتباط سریال تا بتوانیم پیامها را به Serial Monitor ارسال کنیم، ارتباط SPI تا آردوینو با ماژول RFID صحبت کند، و خود ماژول RFID با استفاده از تابع mfrc522.PCD_Init().
|
۱ ۲ ۳ |
Serial.begin(۹۶۰۰); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card (in case you wonder what PCD means: proximity coupling device) |
یادآوری: پیش از این با استفاده از ساختار MIFARE_Key و با نام key، کلید امنیتی را تعریف کردهایم. این کلید یک آرایه از شش بایت است که برای دسترسی به کارت RFID استفاده میشود. در اینجا آن را با مقداردهی به تمامی شش بایت به 0xFF مقداردهی اولیه میکنیم.
به خاطر داشته باشید که تمام کارتهای جدید RFID به طور پیشفرض کلید امنیتی آنها برابر با 0xFF است. با این حال، اگر کارت قبلاً برنامهنویسی شده باشد، ممکن است کلید متفاوتی داشته باشد. در این صورت باید کلید صحیح را بدانید تا بتوانید به حافظه کارت دسترسی پیدا کنید.
|
۱ ۲ ۳ ۴ |
// Prepare the security key for the read and write functions. for (byte i = ۰; i < ۶; i++) { key.keyByte[i] = 0xFF; //keyByte is defined in the "MIFARE_Key" 'struct' definition in the .h file of the library } |
|
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ |
void loop() { // Look for new cards if (!mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if (!mfrc522.PICC_ReadCardSerial()) { return; } Serial.println("card selected"); //the blockcontent array is written into the card block writeBlock(block, blockcontent); //read the block back readBlock(block, readbackblock); //uncomment below line if you want to see the entire 1k memory with the block written into it. //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //print the block contents Serial.print("read block: "); for (int j = ۰; j < ۱۶; j++) { Serial.write(readbackblock[j]); } Serial.println(""); } |
برای نوشتن دادهها، به سادگی تابع سفارشی به نام writeBlock() را فراخوانی میکنیم که دو ورودی میگیرد: شماره بلاک که میخواهیم دادهها را در آن ذخیره کنیم و خود دادهها (که به صورت آرایهای از ۱۶ بایت ذخیره شدهاند). قبل از نوشتن، برنامه بلاک را با کلید امنیتی احراز اعتبار میکند. اگر احراز هویت شکست بخورد، یک پیام خطا در Serial Monitor ظاهر میشود. اگر موفق باشد، دادهها به برچ RFID نوشته میشوند و پیام تأیید «block was written» نمایش داده میشود.
|
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ |
//Write specific block int writeBlock(int blockNumber, byte arrayAddress[]) { //this makes sure that we only write into data blocks. Every 4th block is a trailer block for the access/security info. int largestModulo4Number = blockNumber / ۴ * ۴; int trailerBlock = largestModulo4Number + ۳; //determine trailer block for the sector if (blockNumber > ۲ && (blockNumber + ۱) % ۴ == ۰) { Serial.print(blockNumber); Serial.println(" is a trailer block:"); return ۲; } Serial.print(blockNumber); Serial.println(" is a data block:"); //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("PCD_Authenticate() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۳; //return "3" as error message } //writing the block status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, ۱۶); //status = mfrc522.MIFARE_Write(9, value1Block, 16); if (status != MFRC522::STATUS_OK) { Serial.print("MIFARE_Write() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۴; //return "4" as error message } Serial.println("block was written"); } |
برای تأیید دادهها، تابع سفارشی دیگری به نام readBlock() را فرا میخوانیم که دو ورودی میگیرد: شماره بلاکی که میخواهیم از آن بخوانیم و آرایهای که دادههای بازیابیشده در آن ذخیره میشود. درست مانند نوشتن، این تابع ابتدا بلاک را احراز هویت میکند. اگر احراز هویت موفق بود، دادهها خوانده شده و در آرایه readbackblock ذخیره میشوند. سپس برنامه این دادهها را روی Serial Monitor چاپ میکند تا تأیید کنیم همه چیز به درستی نوشته شده است.
|
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ |
//Read specific block int readBlock(int blockNumber, byte arrayAddress[]) { int largestModulo4Number = blockNumber / ۴ * ۴; int trailerBlock = largestModulo4Number + ۳; //determine trailer block for the sector //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("PCD_Authenticate() failed (read): "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۳; //return "3" as error message } //reading a block byte buffersize = ۱۸; //we need to define a variable with the read buffer size, since the MIFARE_Read method below needs a pointer to the variable that contains the size... status = mfrc522.MIFARE_Read(blockNumber, arrayAddress, &buffersize); //&buffersize is a pointer to the buffersize variable; MIFARE_Read requires a pointer instead of just a number if (status != MFRC522::STATUS_OK) { Serial.print("MIFARE_read() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return ۴; //return "4" as error message } Serial.println("block was read"); } |
” لطفا سوالات خود را با ذکر عنوان مقاله ارسال کنید. آموزشگاه خانه رباتیک ایران در کنار شماست. “
آماده سازی فرم
لطفا صبر کنید
فرم ساز آسان





