نمایش/عدم نمایش سایدبار
رفتن به بالای صفحه
محرم
مهدی دمیرچیلو

پروژه و آموزش آردوینو کار با ماژول rc522

انجمن های تخصصی برق و الکترونیک ECA

به نام خدا : تو این مطلب پروژه و آموزش آردوینو کار با ماژول rc522 رو میخوام قرار بدم، فقط چون مطلب یکم طولانی هستش زیاد حرف نمیزنم، بریم سراغ مطلبمون :

پروژه و آموزش آردوینو کار با ماژول rc522

پروژه و آموزش آردوینو کار با ماژول rc522


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

شماتیک پروژه RC522 با آردوینو

کد زیر رو هم ببینید که ترتیب پایه ها برا میکروهای مختلف توش ذکر شده ( روی دکمه زیر کیک کنید تا اتصالات نمایش داده شود ) :

توضیحات کوچولویی درباره کارت های MIFARE

اولا طبق دیتاشیت ماژول RC522 به کارتهای زیر اصطلاح MIFARE اطلاق میشه.

MIFARE Mini
MIFARE 1K
MIFARE 4K
MIFARE Ultralight
MIFARE DESFire EV1
MIFARE Plus RF

کارتهای مایفر هم کارت هایی حافظه دار هستن.
که مثلا مورد 2 و 3 بالا رو ببینید، میبینید! که کارت اولی حافظش 1کیلو هستش و بعدی 4کیلو!، که من تو پروژه های این مطلب از کارت 1کیلو استفاده کردم(MIFARE Classic 1k)، در زیر جدول تقسیم بندی حافظه این کارت(مایفر 1 کیلو) رو مشاهده میکنید(برای مشاهده شکل مربوط به کارت 4 کیلو که شبیه عکس زیر هستش به دیتاشیتی که ته همین عنوان قرار دادم مراجعه کنید) :
پروژه ماژول RC522 با آردوینو
چند تا نکته کوچولو : 

  1. همون طور که میبینید(عکس بالا رو) 16 تا Sector داریم و تو هر Sector هم 4 تا Block داریم و هر Block هم 16 بایت هستش. (16تا سکتور * 4 تا بلوک * 16بایت = 1024 بایت = اندازه حافظه کارت های مایفر 1k)
  2. در مکان Sector0 و Block0 از حافظه(عکس بالا!) کد کارخانه کارتمون ( UID = کد اختصاصی هر کارت ) قرار داره و این مکان از حافظه رزرو شده هتسش.
  3. هر Sector هم به وسیله دو کد با نام های keyA و keyB(که هر کدومشون 6 رقمی هستن!) محافظت میشه و این کد در 4 امین Block از هر Sector قرار داره ( و به این بلوک میگن sector trailer )
  4. هر کدوم از این کلید های امنیتی داخل هر سکتور میتونن کنترل کنن عملیات خوندن و نوشتن داخل اون سکتور رو.
  5. قبل انجام هر کاری بر روی کارت ابتدا باید کارت انتخاب بشه و بعد اعتبار سازی بشه!
  6. همون طور که میبیند(عکس بالا رو میگم ^_^) هر بلوک کد دسترسی داره!(اول کد رو وارد میکنی و بعد اطلاعات رو بخونی/مینویسی)
  7. پسورد پیشفرض تمام Sectorهای کارتها به صورت پیشفرض برابر 0xff هستش.
  8. تو مطلب نیازتون میشه که آدرس یه بلوک رو به یه تابعی بدید!، حالا داستان آدرس بلوک چیه؟ از سکتور 0 بگیرید تا سکتور 15، حدود 16*4 تا بلوک دارم یعنی 64 تا بلوک، شمارش بوک ها از 0 شروع میشه تا 63، به بلوک 0 سکتور0 آدرس 0 میدن و همین طوری میریم بالا و در آخر به بلوک 3 سکتور 15 آدرسش میشه 63 (تو شکل بالا میبینید که تو هر سکتور شماره بلوک ها از 0 هستش تا 3 !!! )

خب یه سری توضیحات هم هستش برا بحث Access Bits که دیگه دیدم اگه بخوام ادامه بدم توضیحاتش رو اوضاع قاراشمیش میشه لذا گفتم فیلم ضبط کنم، در ضمن در یادگیری موضوع فیلم زیر لینک زیر کمک کرد بهم که طبق حرفم تو فیلم لینکش رو میزارم براتون : تغییر رمز کارت های مایفر

76MB پروژه و آموزش آردوینو کار با ماژول rc522
0%
00:00  /  23:29
UID و Uid و uid
توجه : برای فهم این قسمت باید حتما مطلب "آموزش کامل typedef و struct" رو بخونید.
خب اگه دیتاشیت کارتهای MIFARE رو بخونید میبینید که یه کلمه هستش با نام UID که در مکان BLOCK0 و Sector0 حافظه کارت قرار داره و یه شماره اختصاصی هستش.(حالا این که کارتی وجود داره که بشه این شمارش رو تغییر داد من اطلاع ندارم که هستش یا نه و شاید هم همه این کارت های MIFARE رو میشه این شماره اختصاصیش رو تغییر داد و من اطلاع ندارم)
یه ساختاری(struct) داخل کتابخونه تعریف شده که اسم این نوع متغییر Uid هستش و داخل خود کتابخونه این ماژول هم یه متغییر از این نوع با نام uid ساخته که ما تو پروژه هامون از این متغییر استفاده میکنیم.
تعریف این ساختار و متغییر ساخته شده ازش به صورت زیر هستش و بعدش متغییر هایی که داخل ساختار Uid قرار داره و ما به کمک متغییر uid بهشون دسترسی پیدا میکنیم رو توضیح میدم :
size : تعداد بایت های داخل آرایه uidByte رو به ما میگه.
uidByte : کد اختصاصی کارتمون ( UID ) در این آرایه ذخیره میشه.
sak : چیزی که من فهمیدم و تست کردم و جواب گرفتم اینه که به کمک این متغییر میتونیم مدل کارت رو بفهمیم.(که انواع مدل کارت رو در عنوانی قبلی قرار دادم)، در عناوین بعدی میبینید که از این متغییر برای پیدا کردن مدل کارت استفاده میکنیم.
تو توابع بعدی زیاد با این ساختار و متغییر uid کار داریم. laugh الان فقط یه معرفی کردم تا باهاش آشنا بشید. sarcastic

فراخونی کتابخونه و ساخت اشیای جدید و...

خب فراخونی کتابخونه و ساخت اشیای جدید و... که باید در اول پروژه تون قرار بدید.
خط 1و2 : فراخونی کتابخونه های مورد نیاز!
خط 3 : ساخت یه شی با نام mfrc522 از کلاس MFRC522 (این کلاس در داخل فایلی که در خط 2 فراخونی کردیم قرار داره)، پارامتر اول شی برا تعیین پایه SS (یا SCK) ماژول هستش که برای انتخاب ماژول برای ارسال و دریافت به کار میره، مربوط میشه به بحث SPI، که برای این که میکرو بتونه از طریق SPI با چندین قطعه ارتباط برقرار کنه یه پایه گزاشت با این نام برای این که میکرو اون قطعه رو به کمک این پایه انتخاب کنه و باهاش تبادل دیتا داشته باشه، خواستین میتونید مطلب زیر رو بخونید :
آموزش جامع آردوینو جلسه ۱۴ SPI AND Virtual SPI
پارامتر دوم این شی هم برا تعیین پایه Reset (یا RST) ماژول هستش.
خط 4و5 : بعد از خوندن مطلب زیر متوجه میشید این دو خط چی هستن، در مورد کارشون هم اینو فقط میگم که خط 4 یه نوع متغییر برای ذخیره کردن کد امنیتی 6 رقمی و خط 5 یه نوع متغییر برای ذخیره کردن خروجی توابع(که به کمکش میفهمیم تابع کارش رو درست انجام داده یا غلط و اگه انجام نداده علتش چی بوده): آموزش کامل typedef و struct

راه اندازی کتابخونه

خب برای هر کتابخونه ای یه همچین توابعی هستش که با فراخونیشون اون کتابخونه راه اندازی میشه، کلا کار این تابع ها مقدار دهی اولیه یه سری مقادیر ظرروی اون کتابخونه هستش.(خط 1 برای کتابخونهه SPI و خط 2 برای کتابخونه MFRC522 هستش.)

PICC_IsNewCardPresent ( تشخیص نزدیک شدن کارت به ماژول )

اگه کارتی( tag ) به ماژول ( RFID -RC522 ) نزدیک بشه این تابع مقدار 1 رو بر میگردونه در غیر این صورت مقدار 0 رو برمیگردونه.

PICC_ReadCardSerial ( خوندن دیتای داخل کارت )

این تابع کارش خوندن دیتای داخل کارت هستش - اگه نتونه بخونه مقدار 0 و در صورت موفق بودن کار عدد 1 رو برمیگردونه.
توجه 0 (مهم) : همون طور که تو نکته 5 از عنوان "توضیحات کوچولویی درباره کارت های MIFARE" خدمتتون عرض کردم، اول باید کارت انتخاب بشه، حالا اگه کدهای داخل این تابع رو نگاه کرده باشید میبینید که درش از تابع PICC_Select استفاده شده، یعنی این تابع کارش هم خوندن اطلاعات کارت هستش و هم انتخاب کارت، ما با تابع PICC_Select کاری نداریم اصلا، و از همین تابعی که این جا میبینید استفاده میکنیم، اینم گفتم تا یه وقت نگید داش شما گفتی کارت باس انتخاب بشه و از این جور حرفا، پس کجاس تابعش و ما باید چطور کارت رو انتخاب کنیم و ...، پس این تابع هم اطلاعات کارت رو میخونه و هم کارت رو انتخاب میکنه(البته این تابع هم چیز خاصی نداره  و همش 2-3 خط هستش.)
توجه 1 : بعد از این که به کمک تابع PICC_IsNewCardPresent فهمیدیم کارتی به ماژول نزدیک شده، از این تابع برای خودندن اطلاعات کارت استفاده میکنیم.
توجه 2 : این تابعی اطلاعی نشون نمیده و چیزی به ما نمیده، در ادامه میبینید که چطور به اطلاعات دریافت شده توسط این تابع دسترسی پیدا میکنیم.(در قسمت مربوط به عنوان uid توضیح میدم)

PCD_DumpVersionToSerial ( نمایش نسخه Firmware ماژول )

نمایش نسخه Firmware ماژول (همون نمایش نسخه ماژول ^_^) در پنجره سریال
توجه : اینو همینجا میگم دیگه برای توابع مثل این دیگه نمیگم، این توابعی که اطلاعاتشون رو تو پنجره سریال(پورت سریال یا هر چی اسمش رو میزارید) باید برای استفاده از این توابع، قبلش تابع Serial.begin رو در تابع Setup قرار داده باشین تا پورت سریال فعال بشه، اگه در این باره چیزی نمیدونید مطالب زیر رو بخونید :
آموزش جامع آردوینو جلسه 4
آموزش جامع آردوینو جلسه 5
آموزش جامع آردوینو جلسه 6
این تابع جوابی به فرم زیر تو پنجره سریال نمایش میده ( که بسته به نسخه ماژولتون داره ) :

Firmware Version: 0x92 = v2.0

PICC_GetType و PICC_GetTypeName ( پیدا کردن مدل کارتمون )
به کمک تابع PICC_GetType میتونیم متوجه مدل کارتمون ( همون Tag ) بشیم و به کمک تابع PICC_GetTypeName مدل کارتون به بر حسب رشته دریافت کنیم!، کد زیر رو ببینید فک کنم متوجه بشید :
این تابع جوابی به فرم زیر تو پنجره سریال نمایش میده ( البته بسته به نوع کارتتون جواب میتونه متفاوت باشه ) :

PICC type: MIFARE 1KB

PICC_DumpToSerial ( نمایش کل دل و روده کارت تو پنجره سریال ^_^ )
این تابع کارش اینه که تمام اطلاعات کارت رو تو پنجره سریال نمایش میده ( نمایش مدل کارت + کد اختصاصی کارت + تمام دیتاهای داخل کارت )
سوال1 : مگه نگفتی این کارت ها رمز دارن و باید رمز رو وارد کنی تا بتونی اطلاعات رو بخونی و بنویسی و ... پس چی شد؟ این تابع که اومد کل دل روده کارت رو نمایش داد که؟؟؟؟
جواب1 : سوال خوبی بود ولی چرا میزنی حالا laugh در زیر یه توضیحکی! میدم :
خب ببیند تو این تابع فرض بر این هستش که رمز تمام سکتور ها برابر مقدار پیشفرض یعنی 0xff هستش ولی اگه رمز رو تغییر بدید دیگه این تابع به کارتون نمیخوره(البته اون موقع بازم میشه ازش استفاده کرد اونم تو نقش جرز لای در laugh )
سوال2 : خب حالا ما اومدیم و رمز رو تغییر دادم، حالا تابعی وجود داره که بشه رمز جدید رو بهش داد و به کمکش کل اطلاع کارت رو تو پنجره سریال نمایش داد؟
جواب2 : آراه داش هستش، تو عنوان بعدی قرارش میدم.
خب حالا از این تابع به صورت زیر استفاده میکنیم :
سوال1 : mfrc522 از کجا اومد؟
جواب1 : خب اگه شما عنوان "فراخونی کتابخونه و ساخت اشیای جدید و..." که در اوایل این مطلب من گزاشتم رو بری ببینی و خط 3 کدهای اون قسمت رو ببینی، میبینی! که من یه شی با نام mfrc522 از کلاس MFRC522 ساختم و برای دسترسی به توابع و متغییر های public یه کلاس، و برا این کار نام شی یی که ساختم رو مینویسم و بعدی نقطه میزارم و بعدش تابع یا متغییر مد نظرم رو فرا می خونم.
سوال2 : حالا mfrc522.uid& از کجا اومد؟؟؟
جواب2 : خب گفتم دیگه، mfrc522 یه شی از کلاس MFRC522 هستش و uid یه متغییر هستش که داخل کلاس فوق قرار داره و ما به کمک شی ساخته شده بهش دسترسی پیدا میکنیم(توابع جلوی اسمشون پرانتز دارن ولی متغییر ها نه ^_^) و کاراکتر & هم که میدونید برا بحث آدرس به کار میره، الان تو کد بالا من اومدم و آدرس متغییر mfrc522.uid رو به تابع PICC_DumpToSerial دادم.
سوال3 : حالا متغییر uid چیه اصلا؟
جواب3 : برو عناوین بالا رو بخون، اول مطلب کامل توضیح دادم این متغییر رو *_*
PICC_DumpMifareClassicToSerial ( مثل تابع بالا )
خب این تابع هم مثل تابع بالا ( PICC_DumpToSerial ) هستش، با این تفاوت که میشه پسورد کارت رو هم به این تابع داد، تابع قبلی پسورد رو میزاشت رو مقدار پیشفرض(0xff) و نوع کارت رو هم پیدا میکرد و بعد این تابع رو فراخونی میکرد.

سوال : خب بازم این تابع مشکل داره که  bad، مگه شما نگفتید که هر Sector یه پسورد 6 رقمی اصلی داره(KeyA)، (حالا KeyB یه چیز اختیاری هستش و ما کاری بهش ندارم)، خب هر سکتور یه پسورد 6 رقمی مجزا داره، یعنی ما 16 تا پسورد 6 رقمی داریم، الان ما اومدیم به تابعی که میخواد اطلاعات کل سکتورها رو نشون بده، اومدیم فقط یه پسورد 6 رقمی دادیم که!!!
جواب : تو هم گیر دادی هاااا laugh ، بله درسته حق با شوماس!، این تابع برای کارت هایی که پسورد تمام سکتور ها یکسان هستش مفید هستش، و تابع قبلی هم برای کارت هایی که پسورد تمام سکتورها رو حالت پیشفرض قرار داره مناسب هستش، حالا بازم تابع بهتر از این هم هستش که این تابع(PICC_DumpMifareClassicToSerial) در داخل خودش هم ازش استفاده کرده و ما تو عنوان بعد بهش میپردازیم و این مشکلی که گفتید رو هم حل میکنیم. laugh فک کردید چی، خودم حواسم هست به اینا داش، البته بازم من ممکنه بعضی مشکلات رو متوجه نشدم، مثلا مشکلاتی که کتابخونه داره، شاید از تمام امکانات ماژول استفاده نکرده توش، شاید ....، به نظرم کسی بشینه و خودش دیتاشیت رو بخونه و همین کتابخونه رو بررسی کنه از همه نظرها بهتر هستش البته برا کسایی که میخوان کار صنعتی بکنن. buba
PICC_DumpMifareClassicSectorToSerial ( نمایش اطلاعات سکتور مد نظر )
خب به کمک این تابع میتونیم اطلاعات سکتور مد نظرمون رو تو پنجره سریال نمایش بدیم.
uid : اطلاعات کارت سنس شده.
key : کد دسترسی به این سکتور.
sector : سکتور مد نظرتون.
این تابع رو میتونید به صورت زیر استفاده کنید(کد زیر قسمتی از پروژه ای هستش که تو عنوان بعدی یا بعدیش یا بعدیهاش ^_^ قرار میدم)
حالا شاید سوال بشه براتون که اون کدهای خط 5و6 برا چی هستن، باس بگم که دقیقا خودم هم نمیدونم ولی چون تو کتابخونه این ماژول به این صورت بود منم فعلا همین کارو کردم تا بعدا علت رو پیدا کنم. pardon
پروژه 1 - تست توابعی که تا اینجا توضیح دادم
خب تو پروژه زیر شما کارت رو که به ماژول نزدیک کنید اطلاعات کارت نمایش داده میشه، کلا از توابعی که در بالا توضیح دادم استفاده کردم، وان تابع توی خط 58 هم برا اینه که عدد Desimal بهش میدیم و به فرمت Hex تبدیلش میکنه و تو پنجره سریال نمایش میده اون عدد رو(برای زیبایی کار هستش وگرنه اجباری نیست که ازش استفاده کنید.)
پروژه 2 - یه پروژه ساده و کاربردی - شناسایی کارت ها

پروژه ماژول RC522 با آردوینو

تو این پروژه شماره اختصاصی هر کارت(UID) رو میخونم و اگه در میکرو وجود داشت تو پنجره سریال مینویسم کارت وجود داره در غیر این صورت مینویسم وجود نداره، یه پروژه ساده.

اینم از جواب پروژه که من با 10 تا کارت تست کردم، 6 تا از کارت ها رو تو میکرو کدشون رو ذخیره کردم و 4 تا رو نه و نتیجه رو در زیر میبینید که پروژه درست کار کرده.

The NUID tag = 6B 68 0F 2B ---> Card 1
The NUID tag = 46 1B EB 48 ---> Card 2
The NUID tag = B7 A1 3A D5 ---> Card 6
The NUID tag = 17 DE 3A D5 ---> Card 5
The NUID tag = 57 54 3A D5 ---> Card 4
The NUID tag = 6D 83 3A D5 ---> Card 3
The NUID tag = D6 88 DA 5D ---> Card Vejod Nadarad Dar Hafeze.
The NUID tag = 46 50 4F 5E ---> Card Vejod Nadarad Dar Hafeze.
The NUID tag = 16 66 2F 5E ---> Card Vejod Nadarad Dar Hafeze.
The NUID tag = 76 89 48 5E ---> Card Vejod Nadarad Dar Hafeze.

فعلا همین دو تا پروژه کافیه تا اینجای مطلب، بقیه پروژه ها بمونه برا بعد، فعلا چند تا دیگه تابع توضیح بدم و بعد برا اون توابع هم مثال قرار میدم.

PCD_AntennaOn و PCD_AntennaOff ( فعال و غیر فعال کردن قابلیت سنس کارت )

Reset کردن ماژول

از اسمش معلومه کارش چیه ولی فک نکنم بکارتون بیاد  laugh

PCD_PerformSelfTest ( بررسی سالم بودن ماژول )

بررسی این که ماژول سالمه یا نه - اگه سالم بود عدد 1 وگرنه 0 رو برمیگردونه.
اگه دیتاشیت ماژول قسمت 16.1.1 رو بخونید، میبینید که ماژول یه ویژگی داره به نام Self test که یه سری مراحل داره ولی چون ما از کتابخونه آماده استفاده میکینم دیگه لازم نیست اون مراجل رو انجام بدیم ولی اگه دوست داشتین میتونید به کتابخونه این ماژول مراجعه کنید و ببنید کدهاش رو و ساختار این تابع رو ببینید.

GetStatusCodeName ( تبدیل StatusCode به رشته )

خب تو این مطلب بعضی توابع خروجیشون به صورت StatusCode هستش، که شما اون متغییر (از نوع ساختار) status که تو قسمت "فراخونی کتابخونه و ساخت اشیای جدید و..." دیدید که من بعد از فراخونی کتابخونه ها این کد رو تو پروژه اضافه کردم، خب میگفتم اون توابعی که خروجیشون به صورت StatusCode هستش رو مقدار اون تابع رو میدیم به متغییر status و حالا برای این که status رو ببینم پیغامش چیه، از این تابعی که میبینید استفاده میکنیم، و این تابع معنای مقدار ذخیره شده داخل status رو به صورت یه رشته به ما میده.(چقدر پیچوندم، لپ کلوم : status به این تابع میدی و معنای اون مقدار ذخیره شده تو status  رو به صورت رشته دریافت میکنی، وسلام!)

پروژه 3 - تست چند تا تابع بالا
جدا توقع دارید برای این تابع ها من پروژه قرار بدم bad  که اومدید و این عنوان رو دارید میخونید نه جدا توقع دارید mosking - عحب زمونه ای شده ها - ملت خیلی تنبل شدن بابا laugh جدا خیلی بیکاری که نشستی داری این متن های منو میخونی ها diablo - بچه به جای بازی گوشی برو ادامه مطلب رو بخون laugh
یه نکته جالب درباره هک کردن این ماژول + یه نکته اخلاقی ^_^
خب ماژول RC522 و کارت های 1کیلو، دارای 16 سکتور و هر سکتور شامل 2 تا پسورد 6 رقمی و حالا فرض ما اینه که تو هر سکتور از یه پسورد 6 رقمی استفاده میکنیم، که هر رقم این پسورد میتونه بین 0 تا 255 باشه.
حالا تعداد حالاتی که بایت تست کنیم تا پسورد یه سکتور رو به دست بیاریم میشه :

6 ^ 256 = 281474976710656

حالا فرض کنیم تست هر 10 تا پسورد 1 ثانیه طول میکشه، برای به دست ابردن پسورد یه سکتور باید زمان زیر رو صرف کرد :

281474976710656 / 10 = 28147497671065.6 Sec

28147497671065.6 / 60 = 469124961184.4 Min

469124961184.4 / 60 = 7818749353.0 Hour

7818749353.0  / 24 = 325781223.0 Day

325781223.0 / 365 = 21421231.1 Year

تازه این برای یک سکتور از 16 سکتور هستش، یعنی عملا هک کردن ماژول فایده ای نداره.
هر چی فک میکنم محاسبات بالا درست هستش، اگه اشتباهی رخ داده بگید. laugh
من الان از تابع هک کردن استفاده کردم برای پیدا کردن پسورد سکتور 2 یکی از کارت هام، حدود 37120 قدر پسورد رو تو مدت 45 دقیقه میکرو تست کرده و هنوز پسورد رو پیدا نکرده focus
نکته اخلاقی : خب حتما فک کردین میخوام الان بگم که نرین سراغ هک کردن این کارت ها و از این جور حرفا، نه اینو نمیخوام بگم چون میدونم نمیتونید(البته کار نشد نداره laugh ) میخوام بگم که بالام جان حواست باشه پسورد رو عوض میکنی، فراموشش نکنی اون پسورد رو که عین من بدبخت میشی، الان منم زدم پسورد یکی از سکتورها رو تغییر دادم و هر چی تلاش میکنم پیدا نمیکنم پسوردش رو، یعنی عملا دیگه اون کارته بدرد نمیخوره.

PCD_Authenticate ( اعتبار سنجی کارت )

خب همون طور که تو نکته 5 عنوان " توضیحات کوچولویی درباره کارت های MIFARE " گفتم(و عمرا یادتون باشه laugh ) : قبل از خوندن باید عملیات اعتار سازی رو انجام بدید و بعد هر بلایی که دوس داشتین سر کارت بیارین(خواستین اطلاعاتش رو بخونید یا روش بنویسید) و در آخر هم باید عملیات رو پایان بدید که این پایان دادن به وسیله دو تا تابع انجام میشه که در عنوان بعدی توضیحشون میدم و بعدش میرم سراغ خوندن و نوشتن و بعدش یه چند تا پروژه مشتی blush
خب حالا چون که من میدونم شما خیلی ذهتون کنجکاو هستش و اهل سوال پرسیدن هستید(که عمرا نیستید ^_^) میخوام دو تا پارامتر اول تابع بالا رو توضیح بدم، بقیه پارامترهاش رو هم تا الان صد بار دیدم این جور پارامتر ها رو :
command : خب تو این جا میگیم که عملیات اعتبار سازی به وسیله KeyA انجام بشه یا KeyB، برای این کار دو تا متغییر(از نوع enum) داریم به صورت زیر که از اسمشون معلومه که کدوم برا KeyA و کدوم برا KeyB هستش.

PICC_CMD_MF_AUTH_KEY_A

PICC_CMD_MF_AUTH_KEY_B

blockAddr : خب تو هر سکتوری یه 4 تا بوک هستش و یکی از این بلوک ها محل ذخیره سازی پسوردها هستش(آخرین بلوک هر سکتور) و ما آدرس این بلوک رو به تابع میدیم.(نام این بلوک هم trailer Block یا sector trailer هستش!!! کلا مهم اینه که تو اسمش trailer داره laugh )

PICC_HaltA و PCD_StopCrypto1 ( پایان دادن به برقراری ارتباط با کارت )

بعد از این که اعتار سنجی کردیم و کارتمون رو خوندیم/نوشتیم حالا باید به ارتباط پایان بدیم(بهترین جمله ای که پیدا کردم همین بود!) و برای این کار باید بعد از اتمام کارمون با کارت، این دو تابع رو فراخونی کنیم.

MIFARE_Read ( خوندن اطلاعات کارت )

به کمک این تابع میتونیم اطلاعات یه بلوک از حافظه کارتمون رو بخونیم.
blockAddr : خب همون طور که تو نکته8 عنوان "توضیحات کوچولویی درباره کارت های MIFARE" گفتم، آدرس بلوک ها از 0 شروع میشه تا 63 (برای کارتهای 1کیلو کلاسیک)، آدرس بلوکی که میخوای بخونیش رو اینجا قرار میدی.
buffer : یه آرایه با حداقل اندازه 18 به این تابع میدی تا اطلاعات خونده شده توسط تابع داخل این تابع ذخیره بشه و بعد ما این تابع رو میخونیم.
bufferSize : خب از اسمش معلومه، اندازه آرایه buffer هستش.
توضیحات بیشتر و مثال بمونه برا پروژه ای که در ادامه میزارم.

MIFARE_Write ( نوشتن اطلاعات توی کارت )

خب اینم که از اسمش معلومه برا نوشتن اطلاعات یه بلوک به کار میره، که به کمک blockAddr میایم و آدرس بلوکی که میخوایم توش دیتا بنویسیم رو به تابع میدیم، به کمک buffer اطلاعاتی که میخوایم تو اون بلوک نوشته بشه رو تعیین میکنیم، bufferSize هم که بیانگر اندازه buffer هستش.
توضیحات بیشتر و مثال در عنوان بعدِ بعدی!

یه سری توضیحات در باره خروجی بعضی توابع که به صورت StatusCode هستن
خب همون طور که تو کد زیر میبینید، همین کد داخل کتابخونه ماژول rc522 وجود داره، و تو این عنوان یکمکی میخوام توضیح بدم(البته توضیح دادن نداره و معلومه کارش چیه pardon )

خب همون طور که تا حالا دیدید خروجی بعضی توابع به صورت StatusCode هستش که اون تابع یه مقداری از مقادیر بالا رو برای ما ارسال میکنه، در ادامه مطلب و پروژه ها ما بیشتر کارمون با STATUS_OK هستش و میخوایم بررسی کنیم که تابع مد نظر کارش رو درست انجام داده یا نه، برا این کار میایم میبینیم که مقداری که اون تابع به ما داده اگه برابر با STATUS_OK بود که یعنی تابع کارش رو درست انجام داده، در غیر این صورت میفهمیم که تابع کارش رو درست انجام نداده و لذا دیگه بقیه عملیات رو متوقف میکنیم، در زیر یه مثال میزنم :
در پروژه ای که در عنوان بعدی میخوام بزارم، اول میام اعتبار سازی میکنم و بعد میام اطلاعات رو میخونم، خب بعد از اعتبار سازی میام بررسی میکنم که آیا این عملیات اعتبار سازی موفقیت آمیز بوده یا نه، اگه بود که میرم سراغ تابع خوندن و اگه نبود که از تابع خوندن هم دیگه خبری نیست smile و کدهاش اجرا نمیشه.
خب الان شما فقط باس بررسی کنید که که تابع مقدار STATUS_OK رو بر میگردونه یا نه، فقط همین، با بقیه مقادیر ساختار بالا هم کاری نداشته باشید که چی هستن و کارشون چیه و ...

پروژه 4 - خوندن و نوشتن اطلاعات با پسورد پیشفرض

پروژه آردوینو RC522 خواندن و نوشتن اطلاعات کارت

توضیح کلی پروژه : خب تو این پروژه ما اطلاع بلوک به آدرس 2 رو میخونیم و بعد تو اون بلوک اطلاعاتمون رو مینویسیم و بعد دوباره مقدار اون بلوک رو میخونیم تا نشون بدیم به شما که اطلاعات اون بلوک (به درستی) ویرایش شدن؛ این پروژه هم جزو پروژه های نمونه خود این کتابخونه RC522 هستش فقط من یکمکی 😀 تغییرش دادم.
توضیح بیشتر پروژه : 
خط 1تا5 : خب این خط ها رو اگه تا اینجای مطلب متوجه نشدید کارشون چیه، دیگه ادامه مطلبو اصلا نخونید.  dash
خط 9تا13 : داخل کدها توضیح خط به خط دادم!
خط 21 : خب تو این جا فرض اینه که شما یه کارت جدید دارین و پسورد و سطح دسترسیش رو تغییر ندادید.(فعلا این پروژه ساده رو ببینید، تو پروژه های بعدی میریم سراغ کارت هایی که پسورد و سطح دسترسیشون رو تغییر دادیم)، الان تو این سطح دسترسی و پسوردی که این کارت های تازه دارن، میتونیم پسورد 0XFFFFFFFFFFFF رو به هر کلید امنیتی(A یا B) بدیم و اطلاعات بلوک ها رو بخونیم یا تغییر بدیم.(الان این پسوردی که تو این خط تعیین کردم برا هر دو کلید A و B هستش ولی همیشه این طور نیست، ممکنه بعضا کلید A با B فرق داشته باشه و کلید هر سکتور هم با سکتور های دیگه برابر نباشه و سطح دسترسی بوک ها هم با هم فرق داشته باشه، لذا همیشه به این سادگی نیست که اول پروژه یه کلید تعریف کنید و دیگه تموم! فعلا چون اول کار هستش پروژه ساده گزاشتیم، تو پروژه های بعدی انشاالله تمام حالت ها رو در حد توان با هم میبینیم و بررسی میکنیم ---> گامس گاماس laugh )

خطوط 32تا57 : تو این خطوط با استفاده از کلید A اول میام عملیات "اعتبار سنجی" رو انجام میدم و در صورت موفق بودن بعدش میرم سراغ خوندن بلوک مد نظرم.
خطوط 65تا101 : تو این خطوط هم با کلید B بعد اعتبار سنجی و موفق بودنش میام تو بلوک مد نظرم اطلاعات مد نظرم pardon رو مینویسم و بعد میام همون بلوک رو میخونم.
دیدید پروژه چقدر آسون بود و چیزی نداشت smile

MIFARE_SetAccessBits ( تنظیم سطح دسترسی )

همون طور که تو فیلم اول مطلب توضیح دادم، با تجوه به 2-3 تا جدول توی دیتاشیت، میتونیم سطح دسترسی رو تعیین کنیم، به این تابع یه سری دیتا میدیم و این تابع 3بایت موردنیاز برای دادن به بیت های Access Bits رو به ما میده!(عمرا کسی فهمیده باشه!)
accessBitBuffer : آرایه ای که به تابع میدیم و تابع 3 بیت مورد نیاز ما رو داخل این تابع ذخیره میکنه و ما هم این 3 بیت رو در بلوک مد نظرمون در قسمت اکسس بیت مینویسیم!
g0,g1,g2,g3 : خب این 4 تا متغییر از نوع byte هر کدوم برا یه بلوک هستن، مثلا g0 برا بلوک 0 و به همین ترتیب g3 برای بلوک3، حالا این متغییر ها چی هستن و ما باید چی چی به جای این متغییر ها قرار بدیم و از این جور حرفا، که در زیر توضیح میدم :
همون طور که در عکس زیر میبینید، برای بلوک های دیتا و Trailer جدول هایی داریم که میتونیم سطح دسترسی مد نظرمون رو به کمکشون انتخاب کنیم، حالا مثلا ما مقادیر C1تاC3 رو برای 4 بلوکمون به صورت زیر برا بر نیازمون انتخاب کردیم :

Block0 : C1=0, C2=0, C3=0 ----> g0=?
Block1 : C1=1, C2=1, C3=0 ----> g1=?
Block2 : C1=1, C2=0, C3=1 ----> g2=?
Block3 : C1=0, C2=0, C3=1 ----> g3=?

حالا شما C3 رو بیت0، C2 رو بیت1 و C1 رو بیت2 در نظر بگیرید لذا مقادیر gها به صورت زیر میشه.

g0=0, g1=6, g2=5, g3=1

حالا این gها رو ما به تابع بالا میدیم و یه آرایه به اندازه 3 خونه به تابع میدیم و کدهای مورد نیاز رو تابع بالا داخل آرایه میریزه و ما ازش استفاده میکنیم.
 ماژول RFID RC522

سوال : حالا این آرایه 3 تایی به چه دردی میخوره؟(کجا باید ازش استفاده کنیم؟)
جواب : خب همون طور که شکل زیر رو میبینید مربوطه به بلوک Trailer که 6تا بایت اول پسA و 4تا وسطی مربوط به Access Bit و 6تای آخر هم مربوط به پسB هستش، بیت 4ام اکسس بیت که سرکاری هستش و مقدارش مهم نیست، الان ما 3بیت اصلی Access Bit که بیت های 6و7و8 هستش رو داریم، میمونه KeyA و KeyB که این دو مورد رو هم باس داشته باشیم!
و بعد یه آرایه 16 تایی ایجاد میکنیم و پسAوB و اکسس بیت ها رو میریزیم داخلش و بعد این آرایه رو داخل این بلوک مینویسیم، این طوری سطح دسرسی بلوک های 0تا3 رو تعیین کردیم و پسورد هم امکان داره تغییر کنه(بستگی به این داره که در چه مدی هستید و آیا میتونید پس رو تغییر بدید یا نه و این که پسورد جدید وارد کردید یا نه، اگه همون پسورد قبلی رو وارد کرده باشید که پسورد هم تغییر نمیکنه و فقط سطح دسترسی ها رو تغییر دادید.)
 ماژول RFID با قابلیت خواندن و نوشتن
MIFARE_GetValue و MIFARE_SetValue
برای استفاده از این دو تابع باید دسترسی بلوک های دیتا بر روی گزینه Value Block قرار بگیرد.
پروژه کارت خوان rfid

قبل از این که این تابع رو فراخونی بکنید باید بلوک اعتبار سازی بشه(که تابعش رو دربالا براتون گزاشتم قبلا!)
حالا این دو تابع کارشون چیه؟ البته از اسمشون معلومه ولی خب در زیر بازم توضیح میدم :
MIFARE_GetValue : خوندن مقدار بلوک blockAddr و ذخیره مقدارش در متغییر value
MIFARE_SetValue : نوشتن متغییر value در بلوک blockAddr

سوال : این دو تا تابع چه فرقی دارن با توابع MIFARE_Read و MIFARE_Write ؟؟؟
جواب : خب سوال خوبی هستش، ببینید تو دو تابعی که گفتی ما مقدار Hex تک تک خونه ها رو مینویسیم و میخونیم، ولی تو این دو تا تابعی که الان معرفی کردم مقادیر رو به صورت یه متغییر عددی میخونید و مینویسید، مثلا فک کنید کارت های مترو، یه قسمت این کارت ها مقدار هزینه کارت رو ذخیره میکنه، خب حالا این آقا رفته تو مترو و کارتش رو زده به دستگاه، حالا باید یه پولی از اون کارت کم بشه دیگه، برای این کم کردن میتونیم مقدار پول اون کارت رو به کمک MIFARE_GetValue بخونیم و بعد یه چیزی ازش کنم کنیم و مقدار جدید رو به کمک MIFARE_SetValue بنوسیم تو اون بلوک از حافظه کارت، حالا شاید بازم براتون سوال بشه که خب این کارا رو هم با اون دو تا تابعی که قبلا باهاش آشنا شدیم هم میشه کرد، جواب اینه که آره میشه ولی خب این دو مورد یکم کار رو ساده کردن، البته برا بحث این کارت های مترو، دو تا تابع بعدی رو هم بخونید و یه توضیح کامل تری دربارشون میدم.
MIFARE_Decrement و MIFARE_Increment و MIFARE_Transfer و MIFARE_Restore

این دو تابع هم شبیه دو تابع بالا هستا تقریبا، باید قبل از استفاده ازشون عملیات اعتبار سازی رو انجام بدید، باید مد دسترسی بلوک های دیتا(که میخواید برا اون بلوک ها از این دو تابع استفاده کنید) رو رو حالت Value Block بزارید.
MIFARE_Decrement : بلوک به آدرس blockAddr ، مقدارش رو به اندازه delta قدر کاهش میده.
MIFARE_Increment  : بلوک به آدرس blockAddr ، مقدارش رو به اندازه delta قدر افزایش میده.
مثال : مثلا همون کارت های مترو، طرف کارتش رو میزنه به دستگاه و الان باید یه مقدار پولی از کارتش کم بشه، به کمک تابع MIFARE_Decrement میشه این کارو کرد، یا مثلا طرف میره کارتش رو شارژ کنه، به کمک تابع MIFARE_Increment میشه این کارو کرد و برا خوندن مقدار پول کارت میتونیم از تابع MIFARE_GetValue استفاده کنیم.

MIFARE_Transfer : خب حالا بعد از این که از توابع بالا استفاده کردید باید برای اعمال تغییرات این تابع رو  فراخونی بکنید.
MIFARE_Restore  : این تابع رو هم من هر چی تست کردم ازش جواب نگرفتم، کسی اگه جواب گرفته بگه. good

پروژه 5 - تست توابع MIFARE_GetValue و MIFARE_SetValue
تو این پروژه یه متغییری به نام Number هستش که مقدارش رو در بلوک تعیین شده تنظیم میکنم، و بعد مقدار این بلوک رو میخونم و نمایش میدم و بعد مقدار این متغییر رو 1000 واحد زیاد میکنم.
تو خطوط 20تا30 هم اومدم سطح دسترسی رو تعیین کردم، شما فقط یک بار از این تابع برای هر کارت استفاده کنید و در دفعات بعدی این کد رو از پروژه حذف کنید(به حالت توضیحات در بیارید.)

پروژه 6 - تست توابع MIFARE_Increment و MIFARE_Transfer
خب تو این پروژه که مثل پروژه بالا هستش دقیقا، یه مقدار در هر بار چرخش حلقه به کمک تابع اینکریس(رونالدو^_^) به بلوک تعیین شده اضافه میشه و بعد به کمک تابع ترنسفر مقدار شبت میشه و بعد مقدار خونده میشه و بعد نمایش و بعد دیگه هیچی laugh ، در ضمن اگه مقدار اون بلوک از یه حدی بیشتر بشه برنامه یه پیغامی میده و مقدار اون بلوک رو به یه مقدار تعینی شده ای! تنظیم میکنه.

پروژه 7 - تست توابع MIFARE_Decrement و MIFARE_Transfer
اینم مثل پروژه بالا فقط از تابع کاهش استفاده کردم :

آموزش و نکات متفرقه
  1. برای این که پروژتون فقط از کارت های 1کیلو پشتیبانی کنه و در قبال کارت های مایفر دیگه کاری نکنه میتونید از کد زیر استفاده کنید، در زیر من یه پیغام گزاشتم داخل if ها ولی شما میتونید، در صورت درست بودن مدل کارت کدهای پروژتون رو اجرا کنید و کدهای پروژتون رو قرار بدید، و اگه کارت پشتیبانی نشد، مثلا یه پیغام بدید که ببم جان، کارتت پشتیبانی نمیشه یا اصلا پیغامی ندید یا هر طور دوس داشتید!

تا همینجا کافیه، خسته شدم، مطلب هم شدش 7هزار واژه، البته بازم هست بعضی چیزا که میشه گفتم ولی دیگه خداییش خیلی خسته شدمف الان چند روزه پای این مطلبم cry

خب این مطلب هم تموم شد، دوستان ازم میپرسیدن این مطلبو کی میزاری، چندین نفر منتظر من بودم، همین جا عذرخواهی میکنم بابت دیر شدن، چون نمیخواستم یه چیزی نوشته باشم که نوشته باشم(بر خلاف بعضی ها که همین طوری یه چیزی مینویسن تا سایتشون بیاد بالا)، تا جایی که در توانم و وقتم بود سعی کردم مطلب رو خوب و کامل بنویسم، حالا اگه جایی رو نگفتم و بد گفتم به بزرگی خودتون ببخشید و گوشزد کونید اون موارد رو تا تصحیح کنم.
داستان! : خب برای هر مطلب سایت من چندین روز وقت میزارم و برا بعضی مطالب بعضا شده که 1ماه دنبالش بودم!، از این سایت هم که کسی به ما پولی نمیده و ما هم که از کسی پولی نمیگیریم(چون میدونیم کسی کمک نمیکنه، چرا؟ بله چون وقتی خودم به سایت های مفید کمک نمیکنم چطور توقع باید داشته باشم که دیگران به سایت من کمک کنن)، پروژه دانشجویی هم که مشکل قانونی داره و ما انجام نمیدیم و پروژه های دیگه رو هم به ما نمیدن برا انجام، سالی هم 500 تومن بابت سایت من هزینه میکنم تقریبا، هزینه قطعاتی هم که تا الان خریدم به کنار(که 4-5 کارتون بزرگ الان من دم دستگاه دارم!)، اینا رو نمیگم که منت بزارم در کل اینو میخوام بگم، زورم میاد و ناراحت میشم وقتی کسی رو میبینم که یه چیزی بلد هستش ولی نمیاد یاد بده و به اشتراک بزاره، بارها شده که افرادی رو میشناختم گفتم بیاید مطلب بزار گفتن باشه ولی نیومدن، بعضیها اومدن و چند مطلب گزاشتن و بعد ولش کردن، من خودم پروژه انجام میدم و بعد با ذوق و شوق با پولش میرم قطعه میخرم(جالا بگذریم از وقتایی که این فروشگاه ها به من ظرر زدن، مثلا همین eca به من 130 تومن همین آفتاب رایانه با ارسال یه نمایشگر شکسته_به دست من که رسید شکسته بود_ حدود 45 تومن ظرر زدن و موارد دیگه) و بعد خرید قطعه کار باهاشون رو میرم یاد میگیرم و مطلبش رو میزارم تو سایت تا دیگران مجبور نباشن برا یادگیری کار با اون قطعه دیگه وقت بزارن، و من برنامم اینه که تو این زمینه به دوستان کمک کوچیکی کرده باشم، ولی ناراحت میشم وقتی کسی رو میبینم که فک میکنه اگه چیزی رو که بلده تو اینترنت به اشتراک بزاره …. بگذریم؛ به هر حال یکی از اهداف من تو رایگان گزاشتن مطالب اینه که شاید باشن کسایی که مثل ما جیبشون خالی باشه و پول نداشته باشن بدن آموزش های پولی و این یکی از دلایل و اهداف کار من هستش، و من از این کار بعضیا جدا خیلی ناراحت میشم.(منظورم اونایی نیست که مطلب و آموزش پولی میزارن، یه وقت برداشت اشتباه نکنید از حرفام!)
هزینه مطلب : به بچه های محلتون این چیزایی که بلد هستید رو برید یاد بدید، مثلا همین آردوینو رو برید یاد بدید، یه 10 جلسه 1 ساعته برای رضای خدا برید برای اینا کلاس بزارید، حالا تو مساجد، حسینیه ها میتونید کلاساتون رو برگزار کنید، به فرهنگی یا بسیج مساجد مراجعه کنید و بگید من آمادگیشو رو دارم تا فلان کلاس رو برگزار کنم و آموزش بدم، اونا هم از خداشونه، این طوری اگه تو هر کلاس 10 نفر باشه، هم بچه های محلتون رو یه چیزی یاد دادید و علاقه مندشون کردید به این کارها(من خودم بچگیام یه مدار فلشر دیدم که داشتم ساخته بود و سر همون اومدم رشته الکترونیک و بعد این کارها – اگه همون زمان یکی این چیزا رو یاد میداد بهم به جای این که اون موقع تو جوبا ماهی میگرفتم با آهنگ ربا!، بجاش میرفتم سراغ الکترونیک از همون بچگیم و به این سن که میرسیم یه مخی میشدم برا خودم، خداییش غیر از اینه؟) و میتونن همین بچه ها از طرف مدرسشون برن مسابقات رباتیک و …، هم بچه ها رو از کوچه خیابون ها جمع کردید(خداییش دیگه خودتون باید بدونید که بچه ای که تو کوچه خیابون باشه همش چیزای درستی یاد نمیگیره)….. والا من هرچی فک میکنم ایده خوبی هستش، یه برد آردوینو، یه کامپیوتر یا لبتاب و چند تا قطعه ساده مثل lcd و led و سون سگمنت و موتور dc و از این جور چیزا لازم داره.(خداییش انجام بدید این کار رو، و نتیجه اش رو بهم همینجا بگید)
تا مطلب بعد اگه زنده بودیم یا علی.

تعداد مطالب : 339 تا
مهدی دمیرچیلو جنگ ما فتح قدس را به همراه خواهد داشت. [ امام خمینی (ره) ]
بقیه جلسات : ???
این مطلب هیچ طبقه بندی یی ندارد!
ارسال دیدگاه

1) نظرات غیر فارسی به صورت خودکار حذف میشوند ( حداقل 5 حرف فارسی وارد کنید ).

2) به موارد درخواست پروژه/کد آماده و سوالاتی که بلد نباشم پاسخ داده نمیشه.

3) پسورد فایل های سایت : www.dmf313.ir

4) نظرات حاوی کد برنامه نویسی تایید نمیشوند ( قالب سایت بهم میریزه )

  1. Avatar

    مهمان

    سعید

    به نظرم یه ” خدا خیرت بده ” خستگی رو از تنت در میکنه . کلا من خیلی چیزا ازت یاد گرفتم و متاسفانه نه شمارو دیدم نه میشناسم فقط میدونم خیلی گلی حتی نمیدونم زنی یا مردی در این حد . خوشحال میشم واتساپ بدی گرفتاریهای الکترونیکیمون رو باهات مطرح کنیم . فدای مهربونیات . اگه مردی بوس بوس .. sarcastic

  2. Avatar

    مهمان

    احسان

    سلام، من این ماژول رو با atmega8 a و یک کتابخونه آماده راه اندازی کردم و وقتی کارت رو نزدیک می کنم یه سریال 16 رقمی توی مبنای 16 نمایش میده الان نمی دونم این واقعا سریال هست یا چیز دیگه به نظر شما چکار کنم؟

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      سلام/فرمت اطلاعات رو تو دیتاشیت ماژول ببین/کتابخونه رو هم یه بررسی بکن محاسباتشو.

  3. Avatar

    مهمان

    احمد

    آقا مهدی دمت گرم ما که یه تیکه هاشا نفهمیدیم laugh (البته منظورم بعضی قسمت های تو اون فیلم هست smile ) اما درکل میخوام اینو بگم درباره “هزینه مطلب” والا ما میخوایم یاد بدیم کسی هم باشه سئوال تو تلگرام جواب میدیم اما خدا شاهده این مسجد و حسینیه و اینا و مدرسه و محله رو نمیشه نمیدونم خودت اینکارو کرد یا نه؟
    اما هر شب که میرم مسجد یه هم سنما نمیبینم اگه هم میبینم کارشون شده مسخره ما که جن زده شدیم و تو فضا داریم سیر میکنیم و کلا این کارا آت و آشغالن sad cry بعد کلی وقت یه نفر 2 سال بزرگ تر خودم که درگیر کنکوره گفته بیا یادم بده wacko تو مدرسه هم همینطور شما راضی باش ما منتشر نمیکنیم اما سئوال بود جواب میدیم laugh

    • مهدی دمیرچیلو

      نویسنده این مطلب

      مهدی دمیرچیلو

      laugh good

  4. Avatar

    مهمان

    مهدی

    سلام مهندس عزیز. خدا قوت.مطالبی که در سایت هست مشخصا زحمتی زیادی میبره. از طرف قشر الکترونیک ازت تشکر میکنم.

1 2 3