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

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

به نام خدا : تو این مطلب پروژه و آموزش آردوینو کار با ماژول 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 که دیگه دیدم اگه بخوام ادامه بدم توضیحاتش رو اوضاع قاراشمیش میشه لذا گفتم فیلم ضبط کنم، در ضمن در یادگیری موضوع فیلم زیر لینک زیر کمک کرد بهم که طبق حرفم تو فیلم لینکش رو میزارم براتون : تغییر رمز کارت های مایفر

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 و از این جور چیزا لازم داره.(خداییش انجام بدید این کار رو، و نتیجه اش رو بهم همینجا بگید)
تا مطلب بعد اگه زنده بودیم یا علی.

گروه پرسش و پاسخ الکترونیکی در سروش
مهدی دمیرچیلو گوگل میفرماید : إِنَّ اللّه مَعَ السارِچین ( خداوند با سرچ کنندگان است )
ارسال دیدگاه
208

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

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

3) برای گزاشتن کدهاتون از این سایت استفاده کنید ( طبیعتا لینک کدتون رو باید برای من بفرستید! ) : debian

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

  1. Avatar

    مهمان

    حامد

    سلام اقا مهدی این به چه معناست؟

    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE

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

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

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

      سلام – تا زمانی که تابع USART_GetFlagStatus مقدارش 1 هستش، کدهای داخل WHILE اجرا میشوند.
      این تابع، چیزی که از اسمش معلومه – وضعیت فلگ TXE از پریفرال ( واحل جانبی ) USART1 رو return میکنه.

  2. Avatar

    مهمان

    آرمان

    اموزش این با i2c هست؟

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

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

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

      SPI

      • Avatar

        مهمان

        آرمان

        ن داداش منظورم اینه با i2c لازم دارم.

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

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

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

          آها – نه کتابخونشو ندارم – باید سرچ کنی یا خودت آستین بدی بالا

          • Avatar

            مهمان

            آرمان

            داداش راستی من تونستم کارت های _ _ _ _ را رمزشو در بیارم. حالا اطلاعاتش واقعا خستم کرده و نمیدونم چجوری بفهمم مبلغ کجاس و چجوری تغییرش بدم. اگه اطلاعاتی داری ممنون میشم

  3. Avatar

    مهمان

    ghonzales

    سلام من از خود کد دیفالت write برای این ماژول با اردوینو استفاده می کردم ولی بعد از مدتی دیگه انگار کارت رو تشخیص نمی ده. باید هزار بار خاموش و روشن کنم میکرو رو یا ریستش کنم که کارتو بخونه. جریان چیه؟

  4. Avatar

    مهمان

    ملیکا

    سلام
    چجوری میشه یک تابع بنویسم که با یک شدن پایه مقدار کارت را بخونه و اضافه کنه به کار های مجاز؟

  5. Avatar

    مهمان

    م ص ن

    ممنون عالی بود

  6. Avatar

    مهمان

    امیر

    سلام
    لطفا بنده را در صورت امکان راهنمایی فرمایید
    من میخواهم که یک عکس را در کارت های rfid/nfc ذخیره کنم
    آیا امکان پذیر است؟
    با تشکر

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

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

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

      سلام – حجم عکستون – و حافظه کارت های فوق رو برسی کنید …
      عکس هم یه سری 0 و 1 هستش دیگه.

  7. Avatar

    مهمان

    A.M_BJ

    بله اضافه کردم رنگ کداش تغیر می کنه به نظر شما از ورژن نرم افزار اردوینو نیست ورژن من ۸.۵

  8. Avatar

    مهمان

    A.M_BJ

    داداش این کدMFR522 mfrc522(10,9(
    در کامپیایلر من error میگیره وhas no member named این ارورشه چی کار کنم dash

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

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

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

      کتابخونه رو اضافه کردی به آردوینو؟

  9. Avatar

    مهمان

    A.M_BJ

    MFRC522::MIFARE_Key key; این :: به چه معناست اصلا این خط یه توضیح بدین خیلی ممنون

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

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

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

      از کلاس MFRC522، از typedef با نام MIFARE_Key، اومده یه متغییر از این نوع ساخته.
      typedef struct {
      byte keyByte[MF_KEY_SIZE];
      } MIFARE_Key;

  10. Avatar

    مهمان

    A.M_BJ

    یه چیز دیگه این توابع کتابخانه را چه گونه شما می فهمید برای چیه دیتا شیت داره یا wacko

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

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

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

      معمولا هر کتابخونه ای برای هر تابع توضیحاتی مینویسه ( قبل از تعریف تابع ) یا این که به سایت کسی که این کتابخونه رو نوشته میری و آموزش کتابخونه ای که نوشته رو تو سایتش سرچ میکنی – یا تو نت سرچ میکنی ببینی قبلا کسی با این کتابخونه کار کرده که اومده باشه آموزش کار با این کتابخهونه و توابعش رو گزاشته باشه یا نه.

  11. Avatar

    مهمان

    A.M_BJ

    سلام این پروژه را میشه بدون استفاده از کتابخانه RC522نوشت یعنی فقط با کتابخانه SPIنوشت mail

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

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

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

      سلام – شما با پروتکول spi آشنایی کامل هم داشته باشید باید باید برید دیتاشیت RC522 رو بخونید و از این کتابخونه توی این مطلب، به عنوان نمونه کتابخونه کمک بگیرید.

  12. Avatar

    مهمان

    A.M_BG

    سلام اقا مهدی این library MFRC522 من هرکاری کردم دانلود نشد help لطفا لینک دانلود شا بفرستید تشکر heart

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

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

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

      سلام – رو لینک فوق ( دانلود کتابخانه ماژول MRFC522 برای آردوینو ) که کلیک کردی – در صفحه باز شده به صورت زیر عمل کن :
      Clone or download > Download ZIP

  13. Avatar

    مهمان

    Pedram

    ولی من خودم ۱۴ سال دارم واین برنامه نویسی والکترونیک رو ۲ ساله شروع کردم و از اول علاقه داشتم

  14. Avatar

    مهمان

    mosa

    سلام مهندس این که گفتید داخل تابع رو ببینید رو چجوری میشه انجام داد

  15. Avatar

    مهمان

    mosa

    با عرض سلام خسته نباشید به شما
    ممنون از آموزش های ارزش مندتون و آرزوی موفقیت برای شما
    سوالی داشتم از خدمتتون و اون این که من یه برد آردوینو مینی پرو خریدم و توی پروگرم کردن اون مشکلی داشتم و اون این که نمیشه پین ریستش رو مشخص کرد ینی شماره ای نداره و یه مشکل دیگه این که دیتا ای که از برد ارسال میشود رو مدلم نمیتونه تفسیر کنه به طوری که حتی نوشته هایی که توی برنامه مشخص کردم رو نمیتونه نمایش بده ممنون میشم اگر کمکم کنید خیلی این پروژه وقتم رو گرفته خواهشا کمک کنید و لطفا ایمیل کنید پاسختون رو بازم ممنون

  16. Avatar

    مهمان

    mosa

    سلام آقا مهدی مرسی بابت مطلب عالیتون
    یه سوال داشتم!من از آردوینو مینی پرو استفاده میکنم پین ریستش رو به ریست ماژول وصل کردم اما این پین شماره ای نداره که توی برنامه مشخص کنم در ضمن پروژه یک رو نمیدونم چرا حروف نامفهوم ارسال میکنه لطف میکنید اگر جواب بدید

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

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

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

      سلام
      پروژه – خط 3
      MFRC522 mfrc522(10/*SS_PIN*/, 9/*RST_PIN*/);
      پین ریست ماژول رو اینجا تعیین میکنیم که به کدوم پایه میکرو وصل بشه – برای این که ببینی الزامی هستش که این پایه توسط میکرو کنترل بشه یا نه – میتونید دیتاشیت ماژول فوق و یا کتابخونه شو مطالعه/بررسی کنید.

  17. Avatar

    مهمان

    فرید

    دوست عزیز
    سلام
    سپاس از اموزش کامل تون
    من به دنبال راه اندازی این ماژول برای میکروی pic16f877a هستم. آیا می تونید کمک کنید؟
    برای پرداخت هزینه هم مشکلی نیست.
    سپاس از شما

  18. Avatar

    مهمان

    ananymous

    سلام و احترام …
    یه کارتی هست که کلید امنیتی a و b هر سکتور متفاوته
    چطوری میشه اطلاعاتش رو خوند ؟ا چه کدی؟ (پسوورد ها هم موجود هست )
    آقا مهدی اگه نمونه کد بدی واقعا ممنونت میشم

  19. Avatar

    مهمان

    محمد

    ممنون مهدی جان
    ما میدونیم شما چقدر زحمت میکشی چون خودمون هم وقتی پروژه انجام میدیم زمان و هزینه و … داره
    ولی اگه روی صحبتت “بعضیها اومدن و چند مطلب گزاشتن و بعد ولش کردن” با منه ، که خودتم میدونی علیرغم میل باطنیم واسه چی دیگه باهات همکاری نکردم .
    سایتت زیادی سیاسی شده
    موفق باشی

  20. Avatar

    مهمان

    امین

    سلام و عرض ادب .
    اقای دمرچیلو عزیز ؛ بنده یه کارتی دارم که تمام سکتورهاش رمز داره و در هر سکتوری هم کلید A و B متفاوت هستش. برای اینکه من بخوام هر سکتور رو اعتبار سنجی کنم از کد پایین استفاده کردم ولی نمیدونم چرا فقط برای کلید A اعتبارسنجی انجام میگیره . اگه راهنماییم کنید ممنون میشم
    {
    // Authenticate using key A sec 0
    {
    key.keyByte[0] = 0xa0;
    key.keyByte[1] = 0xa1;
    key.keyByte[2] = 0xa2;
    key.keyByte[3] = 0xa3;
    key.keyByte[4] = 0xa4;
    key.keyByte[5] = 0xa5;
    }
    Serial.println(“Authenticating using key A…”);
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 3, &key, &(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
    Serial.print(F(“PCD_Authenticate() failed: “));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
    }
    Serial.println(“Authenticating using key A Sec 0 is Successful”);
    Serial.print(“\n”);
    }
    {
    // Authenticate using key B sec 0
    {
    key.keyByte[10] = 0xAB;
    key.keyByte[11] = 0x76;
    key.keyByte[12] = 0xF8;
    key.keyByte[13] = 0xBA;
    key.keyByte[14] = 0x93;
    key.keyByte[15] = 0x54;
    }
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, 3, &key, &(mfrc522.uid));
    if (status != MFRC522::STATUS_OK) {
    Serial.print(F(“PCD_Authenticate() failed: “));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
    }
    Serial.println(“Authenticating using key B Sec 0 is Successful”);
    Serial.print(“\n”);
    }

  21. Avatar

    مهمان

    پوریا فعال از قوچان

    من از آردوینو مگا و UNO استفاده می کنم برنامه ام هم مشکلی نداره اما نمی دونم چرا آپلود نمی شه وقتی می خوام کامبایل شه ارور میده ولی نمیگه مشکل از کجاست و باید چی کار کنم. cry به نظر شما من باید چی کار کنم. جالبه که روی دوتا آردوینو هم آپلود نمی شه .خواهش میکنم خواهشا اگه کسی میدونه جواب بده خواهش بازم خواهش cry cry wink dash اگه جواب بدین براتون دعا میکنم . خیلی ممنون(اگه پاسخ بدین) give_rose اگه هم جواب ندین diablo دیگه تو سایتتون نمیام laugh

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

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

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

      موقع کامپایل ارور میده – خطاشو هم نشون نمیده؟ عجب dash
      دسترسی بده بیام تو سیستمت ببینم داستان چیه.
      یه نرما فزار کنترل PC از راه دور پیدا کن – اسم نرمافزار و یوزر آیدی رو برام بفرست.

  22. Avatar

    مهمان

    milazzzzzzzzzzzz

    سلام.چه طور تو پروژه دو تو قسمت شناسایی کارت ها قبلش اطلاعات کارت رو توی حافظه ذخیره کردین؟؟؟

  23. Avatar

    مهمان

    ناشناس

    چرا جواب ما رو نمی دی داداش؟!؟!؟!؟!

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

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

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

      شما با چه نامی و در کدوم مطلب سوالی مطرح کردید؟

  24. Avatar

    مهمان

    The_SAT

    مهدی آقا دمت گرم…
    واقعا دست درد نکنه. ok
    یه سایتی دیدم که Access Bit ها رو خودش محاسبه می کرد. خیلی حال کردم yes لطفا لینکشو تو مطلب بالا هم بزار تا بقیه هم استفاده کنن.
    http://calc.gmss.ru/Mifare1k/
    ارادتمندم.
    سید علی

  25. Avatar

    مهمان

    امین

    سلام . با چه کدی میشه پسورد یه کارت که به صورت پیشفرض هست رو تغییر داد ؟

  26. Avatar

    مهمان

    محمد مهدی

    سلام
    ای کاش می شد به جای اینکه بیایم کلی وقت و هزینه صرف کنیم تا کار با ماژول ها و کتابخونه های آماده رو یاد بگیریم خودمون درستش کنیم با استاندارد های خودمون(مثلا مجبور نیستیم دیگه حتما ارتباط SPI استفاده کنیم!!) سخته اما ارزشش رو داره. از ماژول ها متنفرم!!! diablo

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

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

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

      سلام
      صحیح ولی خب راه بهتر اینه که هر جا ماژولی نیاز داشتیم برا کارمون – از کتابخونه آماده استفاده کنیم و شخصی سازیش کنیم.

  27. Avatar

    مهمان

    سعید

    سلام حاج مهدی
    میخواستم برد این ماژول بیشتر کنم ، با آنتن خارجی مخصوص خودشون میشه؟
    شهید شی انشاءلله

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

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

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

      سلام-آگه آنتنش باشه چرا نشه.ولی خب معمولا آنتنو برا بحث افزایش برد استفاده نمیکنن تو rifd ها – اگه اشتباه نکنم – داستانش چیز دیگه ای هستش فک کنم.

  28. Avatar

    مهمان

    h0x0r

    سلام دست گلت درد نکنه انشالله اجرت با خدا
    بسیار مطالب مفید و مناسبی دارید خیلی ممنون heart ok
    کی گفته نمیشه کارت ها رو رمزشون رو بدست آورد ؟؟؟ hi
    mfcuk
    Mifare Classic DarkSide Key Recovery Tool
    wink

  29. Avatar

    مهمان

    علی

    سلام مهدی جان
    خیلی ممنون از توضیحات کاملتون give_rose
    یه برد با ATMega8 smd طراحی کردم برای کنترل MFRC522 که با کدویژن برنامشو نوشتم و خوب هم کار میکنه
    روش کارش اینه که بعد از دریافت اطلاعات از سریال(مثلا دستور خواندن کارت)، کارت رو میخونه وبعد اطلاعات رو پرینت میکنه
    همه چیز تا اینجا خوبه فقط بعد از چند بار ارسال دستور و دریافت اطلاعات هنگ میکنه و باید دستی ریستش کنم cry
    گفتم شاید مشکل از کتابخونه rc522 برای کد ویژن باشه
    بوت لودر آردوئینو رو روی ATMega8 ریختم و خاستم از کد شما استفاده کنم
    در دستورزیر باید کدوم پایه ها رو معرفی کنم؟
    MFRC522 mfrc522(10, 9);
    10 و 9 یا 10 و 5 یا 10 و 22 تست کردم ولی با دستور زیر خطا میده
    mfrc522.PCD_DumpVersionToSerial();
    Firmware Version: 0x0 = (unknown)
    WARNING: Communication failure, is the MFRC522 properly connected?
    help ممنون میشم در این مورد توضیح بدید
    خیلی ممنون

  30. Avatar

    مهمان

    علی

    سلام
    ممنون از مطالب عالی
    با آردیونو uno تست کردم مشکلی نبود
    ولی کد رو که با آردیونو مگا امتحان میکنم جواب نمیده.
    اتصال ها هم دقیقا مثل قبلی بستم

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

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

      مهدی دمرچیلو

      سلام-پایه های spi تو دو برد فوق فک نکنم یکسان باشه

      • Avatar

        مهمان

        علی

        سلام
        بله درست میفرمائید.
        یه جدول توی دیتاشیت هست که برای بردهای مختلف آردوینو پایه ها متفاوته
        از روی اون بستم جواب گرفتم

  31. Avatar

    مهمان

    SaeedUpdate

    سلام.
    میشه آموزش این رو با avr هم بنویسید؟
    خیلی ممنون!

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

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

      مهدی دمرچیلو

      سلام-امکانش نی فعلا-تو نت کتابخونه ای ازش هستش-تو سایتای چینی فک کنم – دقیقا خاطرم نی

      • Avatar

        مهمان

        SaeedUpdate

        حاجی من واقعا لازمش درم. چیکار کنم بنظرت؟
        چینی سرچ کنم؟!یه کتابخونه پیدا کردم ولی وقتی میخوام ازش استفاده کنم codevisionavr بهش گیر میده. کتابخونشم ناقصه انگار…
        یه راهنمایی بکن خواهشا

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

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

          مهدی دمرچیلو

          خو گفتم دیگه – سرچ کن – انگلیسی سرچ کن تو گوگل پیدا میکنی
          تو گروه تلگرامی سایت هم یکی قبلا یه کتابخونه ای ازش گزاشته بود – نمیدونم الانم هستش یا نه – تو تاریخچش باید بگردی.
          تست شده هم هستش
          اون بنده خدا هم سرچ کرده بود و تو این سایتای چینی فک کنم پیداش کرده بود.

  32. Avatar

    مهمان

    علی

    سلام. خیلی ممنونم از زحماتتون.
    این پروژه ای که نوشتید، اگه کارتی که جلوی ماژول میگیریم در لیست باشه تو سریال مانیتور UID شو چاپ میکنه و اگه در لیست نباشه میگه وجود نداره درسته؟؟ حالا اگه بخوام واسه هر کدوم از کارت هایی که در لیست وجود داره شرط جداگانه بذارم چطوری باید این کارو کنم؟ مثلا بگم اگه کارت خوانده شده این { 107, 104, 15, 43 } بود اسم صاحبشو تعیین کنم بگم این اسم رو چاپ کن. یا اگه این { 87, 84, 58, 213 } بود یه اسم دیگه چاپ کن. یعنی چطوری میتونم به تک تک کارت هام اشاره کنم برای شرط گذاشتن؟؟؟ خواهش میکنم جواب بدین خیلی مهمه.

  33. Avatar

    مهمان

    علیرضا

    سلام
    اقا مهدی شرمنده در صورت امکان لینک دانلود فیلم را قرار بدین دانلود کنیم

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

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

      مهدی دمرچیلو

      سلام
      یه فیلمی داخل منو کشویی “توضیحات کوچولویی درباره کارت های MIFARE” گزاشتم انگار

  34. Avatar

    مهمان

    منصور

    حرررررف نداری برادر good
    دمت گرم… give_rose
    دلم میخواد جای تشکر خفت کنم. rofl . ینننیییی انقد باحالی laugh

  35. Avatar

    مهمان

    tofan

    سلام میدونم که نیازی نداری ولی خیــــــــــــــــــــــــــلی مرد هستی!

  36. Avatar

    مهمان

    مریم نگار

    چه جوری میشه هر کارت و تو هر بار نزدیک کردن به ماژول فقط یه بار خوند ؟ بدون استفاده از delay ؟

  37. Avatar

    مهمان

    Farbod_Fallah

    کارت درسته
    انشالله همیشه موفق باشی wink

  38. Avatar

    مهمان

    esi

    سلام داداش
    میگم تو اون پروژه ۲ چطوری کارت اضافه کرد ؟ سریال این کارتا تو حروفم هست ولی اینی که تو کدا زدی همش عدده چجوریه قضیه اینا ؟ smile

  39. Avatar

    مهمان

    esi

    سلام داداش
    میگم تو اون پروژه ۲ چطوری کارت اضافه کرد ؟ سریال این کارتا تو حروفم هست ولی اینی که تو کدا زدی همش عدده چجوریه قضیه اینا ؟

  40. Avatar

    مهمان

    mehran

    سلام جناب مهندس
    یک سوال داشتم … چطور رمز کارت رو عوض کنیم ممکنه یک مثال ازش بزنید ؟ تابعی داره ؟
    ممنون

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

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

      مهدی دمرچیلو

      سلام
      چیزی خاطرم نی

  41. Avatar

    مهمان

    موسوی

    با سلام و تشکر از جناب مهندس دمرچیلو. تا حالا هرچی تو سایت کامنت گذاشتم جوابی نگرفتم sad امیدوارم این دیگه جواب بگیره!
    مهندس ماژول با ۳٫۳ ولت کار می کنه اما ولتاژ پایه های آردینو مگا و Uno پنج ولت هستش. مشکلی ایجاد نمی کنه؟
    ضمنا دوستی در مورد اجرا با Arduino Due سوال پرسیده بود. اجرا نمیشه من برد رو دارم ولی کتابخانه خطا می گیره ونوع پردازنده رو پشتیبانی نمی کنه.

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

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

      مهدی دمرچیلو

      سلام
      فوقش اگه احساس میکنی در دراز مدت مشکل ایجاد میکنه – یه تقسیم ولتاژ مقاومتی بزن.
      با آردوینو due هم کار نکردم – خب باید ببینی خطاش چیه بری تو کتاب خونه اصلاحش کنی دیگه!

      • Avatar

        مهمان

        موسوی

        ممنون بابت پاسخ. فعلا فرصت اصلاح کتابخونه ندارم! میشه این کتابخونه رو برای اتمل استودیو یا AVR-GCC پورت کرد؟

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

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

          مهدی دمرچیلو

          برای هر کامپایلری و هر میکرویی میشه – خب باید تغییراتی تو کتابخونه بدی – این که از بدیهیات هستش.

  42. Avatar

    مهمان

    Ananymous

    دوباره سلام laugh
    یه سوال دیگه ای … توی یه بخشی از آموزش نوشته بودین از تابع هک کردن برای پیدا کردن پسوورد استفاده کردین … میشه بگین این تابع چیه ؟ یا اگه ممکنه یه مطلب کوچیک دربارش بزارین
    مرسی از زحمتات برادر good heart

  43. Avatar

    مهمان

    Ananymous

    سلام مجدد جناب دمرچیلو
    بنده وقتی کد هارو روی اردوینو آپلود میکنم و وقتی از سریال مانیتور میخوام ازش تست بگیرم نتیجه رو چرت و پرت به من میده
    http://s8.picofile.com/file/8303150092/Capture3.JPG
    اینم لینک نتیجه اش
    اگه ممکنه راهنمایی کنید …با تشکر

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

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

      مهدی دمرچیلو

      سلام
      والا BAUD RATE برابر نباشه این مشکل رخ میده – نمیدونم – یکم ور برو ببین مشکل از کجاس

  44. Avatar

    مهمان

    Ananymous

    آقای دمر چیلو فقط بشه پسوورد رو فهمید کافیه ؟ من از جایی شنیدم به غیر از پسوور اینا به یه الگوریتمی هم برای شارژ نیاز دارن . نظر شما چیه ؟

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

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

      مهدی دمرچیلو

      اونا رو دیگه من اطلاع ندارم.

      • Avatar

        مهمان

        Ananymous

        مرسی از راهنماییتون و وقتی که میزارین … آقای دمرچیلو چطور میشه با شما در ارتباط بود ؟

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

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

          مهدی دمرچیلو

          برای چه موردی؟ سوالات الکترونیک؟ سایت و گروه تلگرامی

        • Avatar

          مهمان

          Ananymous

          بله سوالات الکترونیک …شما تلگرام دارین؟میتونم آیدیتون رو داشته باشم؟

  45. Avatar

    مهمان

    ابراهیم

    سلام دوست عزیز
    یه سوال دارم
    من این ماژول را به طور کامل راه اندازی کردم با اردوینو یونو ولی تاکید استاد برای استفاده از میکرو های picیا armهست
    یه اردوینو dueمبتنی بر هستهarmخریداری کردم
    ولی متاسفانه نمی تونم همین ماژول رو ران کنم تو این اردوینو
    حالا نمی دونم شما کار کردبن باهاش یا نه
    نمیدونم مشکل چیه مشکل از پایه هاش هست یا نه نمی دونم
    اگر بتونین راهنمایی کنیم خیلی ممنون می شم
    پروژه کارشناسیم رو هواست

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

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

      مهدی دمرچیلو

      سلام – متاسفانه آردوینو DUE ندارم – در ضمن بعید میدونم منظورت استادتون استفاده از آردوینو باشه طبق حرفتون.

  46. Avatar

    مهمان

    Ananymous

    با عرض سلام و ادب خدمت جناب دمرچیلو عزیز… توی آموزش گفته بودین بعدا بیشتر در مورد کارتهای مترو و اتوبوس توضیح خواهین داد … اگه ممکنه این آموزش رو هم اضافه کنین که دیگه موضوعتون تکمیل تکمیل بشه . مرسی از زحمتاتون

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

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

      مهدی دمرچیلو

      سلام – والا تا جایی که بررسی کردم کارت مترو هم از همین مدل توی این مطلب هستن – چون کارت مترو رو بود فک کنم که من به این ماژول زدم کدشو خوند

      • Avatar

        مهمان

        Ananymous

        ینی شما میگی حتی اعتبارش رو هم با همین ماژول میشه تغییر داد ؟ با توابع MIFARE_Decrement و MIFARE_increment ?

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

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

          مهدی دمرچیلو

          نچ! کد دارن این کارتا!
          پسوردشو بدونی آره میشه!

  47. Avatar

    مهمان

    امین

    سلام آقا مهدی عزیز … ایشالا که اجرت رو از امام زمان گرفته باشی تا الان و اگرم نگرفتی که ایشالا خودشون بهت عنایت کنن .. آقا مهدی من یه چند تا سوال دارم اگه ممکنه و وقت دارین به ایمیلم یه ایمیل بزنین … زنده باد بچه های مسجد ok

  48. Avatar

    مهمان

    حامد

    سلام .من دقیقا جریان رمز رو نفهمیدم . یعنی توی این کارت هایی که میخریم میشه دیتا نوشت؟ میشه با استفاده از این ماژول محتوای کارتی رو به کارت دیگه کپی کرد ؟ ینی یه کپی از کارت درست کنیم ؟

1 2