به نام خدا : امروز بعد مدتها میخوام یه مطلب بزارم، آموزش کار با ماژول اثر انگشت r305 با arduino ، البته من قبلا هم یه ماژول اثرانگشت هم خریده بودم از ECA که نمیدونم خراب بود، من بلد نبودم ازش استفاده کنم، من زدم خرابش کردم، در کل قسمت نشد راه اندازیش کنم، چند هفته پیش یه ماژول اثر انگشت خریدیم با نام ماژول اثر انگشت r305 که بعد رفتم ببینم کتابخونه ای چیزی ازش هستش یا نه، یه چیزکی پیدا کردیم، بعد رفتیم سراغ ماژول، خلاصه بعد کلی اضیت کردن ماژولو راه انداختم با آردوینو، این سیماش هی قطع و وصل میشه، کلا بزرگترین مشکل من با این ماژول همین بود، البته این ماژول هم میتونه از طریق SERIAL و هم از طریق USB باهاش ارتباط برقرار کنید و … ( آموزش کار با ماژول اثر انگشت r305 با arduino )
( ادامه حرفهای بالام ) : چون من کار با پروتکول USB رو بلد نیستم فعلا سمتش نرفتم ( البته یکی از بچه ها گفته که میخواد آموزششو بزاره تو سایت، حالا ببینیم خدا چی میخواد )، خب میگفتم با SERIAL راه اندازی کردم این ماژولو، اون کتابخونه هه هم یکمکی ناقص بود و مشکل داشت به نظرم که این شد گفتیم بریم اون کتابخونه رو تکمیل و رفع مشکل کنیم ( چون هم یکم ناقص بود و همه امکانات ماژول اثر انگشت فوق رو پوشش نمیداد و هم این که بعضی توابعش برای من کار نمیکرد مخصوصا قسمت اضافه کردن اثر انگشت که اصلا کار نمیکرد ) خب رفتیم سراغ دیتاشیت این ماژول، چند تا فایل ناقص پیدا کردیم، و بعد از کلی جستوجو یه فایل تقریبا کامل ( که خب اونم باز ناقص بود ^_^ ولی خب نسبت به فایلای قبلی کامل بود ) پیدا کردیم که خب زبونش چینی بود ^_^ ولی خب به کمک مترجم گوگل ازش استفاده کردیم، و اون کتابخونه قبلیه رو تکیمل و رفع نقص! کردیم و شد کتابخونه ای که تو این مطلب میبینید؛ این سنسورش هم ماشاء الله 100 خورده ای پولشه، آدم استرس میگرتش وقتی باهاش کار میکنه، لذا سر همین موضوع من تابع سوییچ کردن بین SERIAL و USB رو ننوشتم ( البته USB رو یاد بگیرم کتابخونه رو تکمیل میکنم و آموزش استفاده از این ماژول با USB رو هم میزارم ) و بعضی توابع رو نوشتم ولی جرات استفاده ازش رو نداشتم مثل تنظیم سطح امنیت ماژول که چون دیتاشیت هایی که من دارم توضیح خاصی دربارش ندادن، منم نمیدونم سطح امنیت ماژولو تغییر بدم چه اتفاقی میوفته، لذا ازش استفاده نکردم، به شما هم توصیه میکنم استفاده نکنید، از تابع تغییر طول پکیج ها هم استفاده نکردم، از اینم استفاده نکنید، کلا از بحث تنظیمات ماژول فقط از تابع تنظیم BaudRate استفاده کنید؛ این ماژول میتونه اثر انگشت سنس کنه و میزان شباهتش رو با اثر انگشت های تعریف شده تو حافظش به ما بگه، میتونه تو خودش اثر انگشت ما رو ذخیره کنه و موقعیتش رو به ما بده، یه پسورد داره که درست واردش نکنی ماژول کار نمیکنه، یه آدرس داره که میتونید تغییرش بدید، این چیز خاصی نیست ولی خب اگه ندونیدش یکم اضیت میشید ( چون باید 32 بیت کد که تعداد کل حالاتش میشه 4,294,967,296 رو تست کنید تا آدرس رو پیدا کنید ولی برا بحث پسورد داستان متفاوته چون هم باید آدرس رو بدونید و هم پسورد و در کل میشه 18,446,744,073,709,551,616 حالت باید تست کنید تا پسورد و آدرس رو پیدا کنید ( در حالت حداکثر، لپ کلوم که خدا بیامرزه ماژولتونو ^_^ ، اگه پسورد و آدرس رو ندونید ولی اگه آدرس رو بدونید تعداد 4,294,967,296 حالت رو باید تست کنید تا پسورد رو پیدا کنید، تازه از کدنویسی داخل ماژول من اطلاعی ندارم که اگه مثلا 100 بار پسورد رو اشتباه وارد کنی یه حالت خاصی رخ میده، ممکنه همچین چیزی هم ماژول داشته باشه ولی خب چون دیتاشیت درست درمونی من ازش ندیدم در این مورد نمیتونم حرفی بزنم و فقط حدس و گمان هستش این قسمت حرفم )؛ قسمت تنظیم BaudRate هم چیز خاصی نیست، حتی اگه مثلا رو یه مقداری تنظیم کنیدو بعد فراموش کنید که رو چه مقدار تنظبیم کردید میتونید با 12 بار تست مقدارشو پیدا کنید، از این بابت جای نگرانی نیست. میتونید یه تابع بنویسید برا پیدا کردن BaudRate که خب من یادم رفت این کارو کنم، چیز خاصی هم نیست، خودتون هم میتونید ولی خب من مینویسم تو لیست تا دفه بعد این موردو به کتابخونه اضافه کنم؛ البته ماژول یه تابعی داره که تمام جزئیات ماژول رو به ما میگه ولی خب برا اونم باید یه دستوری بفرستید تا جواب ما رو بده، که خب برا اونم باید BaudRate درست تنظیم شده باشه ^_^ تقریبا لپ کلوم این که این تابع هم برا کسایی که BaudRate رو فراموش کردن مفید نیست، میمونه همون تست 12 بار برای پیدا کردن BaudRate ، چون کلا این ماژول 12 تا BaudRate رو پشتیبانی میکنه، مورد آخر این که فعلا این ماژول با سریال مجازی راه نمیوفته، حتما باید از سریال سخت افزاری استفاده کنید، توضیحات بسه دیگه، داستان لیلی و مجنون شد، بقیش بمونه کنار هر تابع توضیح میدم.
این کتابخونه یه سری تابع و متغییر داره که ما ازشون استفاده میکنیم که در زیر مشاهده میکنید و در ادامه مطلب هم به تدریج توضیح میدمشون ( این لیست توابع public هستش، توابع private رو استفاده نکنید ازشون، مگه این که طبق دیتاشیت ستفاده کنید ازشون و بخواین امکان جدیدی به کتابخونه اضافه کنید ) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void begin(uint16_t BaudRate, uint32_t OldAddress=0xFFFFFFFF); uint8_t setAddress(uint32_t NewAddress); uint8_t verifyPassword(uint32_t Password=0); uint8_t setPassword(uint32_t Password); uint8_t setBaudRate( uint8_t N = 6 ); // Default 57600 uint8_t setSecurityLevel( uint8_t Level = 3 ); // Default 3 uint8_t setPackageContentLength( uint8_t Length = 2 ); // Default 128 Byte uint8_t readSystemParameter(void); uint8_t isDuplicateModelExist(void); uint8_t findDuplicateModel(void); uint8_t getImage(void); uint8_t image2Tz(uint8_t slot = 1); uint8_t fingerFastSearch(void); uint8_t createModel(void); uint8_t storeModel(uint16_t id); uint8_t deleteModel(uint16_t id); uint8_t deleteAllModel(); uint8_t getModelCount(void); uint8_t loadModel(uint16_t id); uint8_t getModel(uint8_t *ModelData); uint16_t fingerID, confidence, templateCount; uint32_t DeviceAddress; uint16_t StatuRegister, SystemIdentifierCode, FingerLibrarySize, SecurityLevel, DataPacketSize, BaudRate; |
1 |
#include <DMF313_Fingerprint.h> |
بعد یه شیء از این کتابخونه ایجاد کنید تا بتونید به توابع و متغییر های عمومی این کتابخونه دسترسی پیدا کنید، به صورت زیر :
1 |
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); |
که به جای Serial1 باید اسم سریالتون رو قرار بدید، همون طور که میدونید این ماژول اثر انگشت R305 از طریق UART با میکرو تبادل داده داره، و چون سریال مجازی این کتابخونه ای که تو این مطلب گزاشتم فعلا مشکل داره و حتما باید از سریال حقیقی استفاده کنید لذا از آردوینو یونو نمیتونید برای این پروژه استفاده کنید و باید از آردوینو مگا استفاده کنید؛ در آردوینو مگا فک کنم 4 تا سریال با نام های Serial و Serial1 و Serial2 و Serial3 داره اگه اشتباه نکنم، که از هر کدوم از این سریال ها که خواستید استفاده کنید اسمشو به جای Serial1 قرار بدید )
توجه : در کد بالا من شیء یی با نام finger ایجاد کردم، لذا هر تابع و متغییری از این کتابخونه بخوام دسترسی داشته باشم باید اول اون تابع ( متغییر ) بنوسیم finger. البته این اسم اختیاری هستش، هرچی دوست دارید بزارید.
begin : این تابع که به صورت زیر هستش برا راه اندازی اولیه ماژول هستش که یه پارامتر ورودی داره که برا تعیین BaudRate هستش که میکرو با چه نرخ انتقال داده ای با ماژول اثر انگشت R305 قراره تبادل داده داشته باشه، شما این تابع رو به صورت زیر استفاده کنید و در اول پروژه ( در اول تابع Setup ) باید بنویسید؛ و یه پارامتر هم با نام OldAddress داره که آدرس فعلی ماژول هستش، که اگه آدرس ماژول رو تغییر ندادید، لازم نیست به این پارامتر مقدار بدید.
1 2 3 |
void begin(uint16_t BaudRate, uint32_t OldAddress=0xFFFFFFFF); // تعریف تابع در کتابخونه finger.begin(57600); // نحوه استفاده از این تابع در صورتی که آدرس ماژول رو تغییر نداده باشید finger.begin(57600, myAddress); // نحوه استفاده از این تابع در صورتی که آدرس ماژول رو تغییر دادین |
توجه : به جای myAddress، باید آدرس ماژول رو بزارید، به جای 57600 هم نرخ انتقلال داده ای که تنظیم کردید، البته در حالت پیشفرض رو مقدار باودریت رو 57600 تنظیم هستش.
verifyPassword : این تابع هم برای شناسایی ماژول استفاده میشه که بعد از تابع begin حتما باید از این تابع استفاده کرد، اگه پسورد ماژولو تغییر دادین باید به جای پارامتر Password پسورد ماژولو به صورت یه عدد صحیح بنویسید ( مثلا 313 یا 3456 و …. که خب باید یه عدد 32 بیتی باشه و پسورد حداکثر میتونه 4294967295 باشه و بیشتر از این عدد نباید باشه پسوردتون )، ولی اگه پسورد ماژولو تغییر ندادید، به پارامتر ورودی این تابع مقدار ندید، چون پسورد در حالت پیشفرض 0 هستش.
1 2 3 |
<span class="crayon-e">uint8_t </span><span class="crayon-e">verifyPassword</span><span class="crayon-sy">(</span><span class="crayon-e">uint32_t </span><span class="crayon-v">Password</span><span class="crayon-o">=</span><span class="crayon-cn">0</span><span class="crayon-sy">)</span><span class="crayon-sy">; // تعریف تابع در کتابخونه</span> <span class="crayon-e">uint8_t </span><span class="crayon-e">verifyPassword</span><span class="crayon-sy">(313</span><span class="crayon-sy">)</span><span class="crayon-sy">; // در صورتی که پسورد ماژولو، روی 313 تنظیم کرده باشید</span> <span class="crayon-e">uint8_t </span><span class="crayon-e">verifyPassword</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">; // در صورتی که پسرود ماژولو تغییر نداده باشید و روی همون مقدار پیشفرض هستش</span> |
این تابع یه مقدار 8 بیتی رو برمیگردونه که مقدارش برابر یکی از ماکرو های زیر هستش :
FINGERPRINT_OK : پسورد صحیح است و ماژول شناسایی شد.
FINGERPRINT_PACKETRECIEVEERR : خطایی در دریافت دیتا رخ داده است ( خطایی در ارتباط با ماژول رخ داده )
FINGERPRINT_PASSFAIL : پسورد صحیح نیست.
در صورتی که مقدار این تابع برابر ماکروهای بالا نبود : خطای ناشناخته.
توجه : بعد از فراخونی begin و verifyPassword میتونیم از بقیه توابع استفاده کنیم.
setPassword : این تابع برای تغییر پسورد ماژول هستش.
1 2 |
uint8_t setPassword(uint32_t Password); // تعریف تابع در کتابخونه setPassword(313); // نحوه استفاده از این تابع، مثلا پسورد رو، روی 313 قرار دادیم |
این تابع 2 مقدار زیر رو بر میگردونه :
FINGERPRINT_OK : تنظیم پسورد با موفیقت انجام شد.
FINGERPRINT_PACKETRECIEVEERR : خطایی در دریافت دیتا رخ داده است ( خطایی در ارتباط با ماژول رخ داده )
در صورتی که مقدار این تابع برابر ماکروهای بالا نبود : خطای ناشناخته.
setBaudRate : برای تنظیم BaudRate از این تابع استفاده میکنیم، در حالت پیشفرض BaudRate مقدارش برابر 57600 هستش، که میتونید یکی از مقادیر زیر رو برای BaudRate ماژول انتخاب کنید : 9600 – 19200 – 28800 – 38400 – 48000 – 57600 – 67200 – 76800 – 86400 – 96000 – 105600 – 115200؛ برای این کار باید یکی از مقدار 1 تا 12 رو به این تابع بدید، که هر عددی به این تابع بدید ضربدر 9600 میشه و میشه BaudRate ماژول ما، مثلا عدد 1 بدید BaudRate ماژول ما میشه 9600 و مقدار 6 ( که در حالت پیشفرض همین مقدار هستش ) بدید ضربدر 9600 میشه و BaudRate ماژول میشه 57600 و اگه مقدار 12 بدید این عدد ضربدر 9600 که بشه میشه 115200 و این عدد میشه BaudRate ماژول ما؛ مقادیری غیر از 1 تا 12 به این تابع بدید، تابع کار نمیکنه و مقدار FINGERPRINT_BAUDRATEINCORRECT رو بر میگردونه.
1 2 |
uint8_t setBaudRate( uint8_t N = 6 ); // Default 57600 --> نحوه تعریف این تابع در کتابخونه setBaudRate(12); // نحوه استفاده از این تابع، مثلا باودریت رو، روی 115200 تنظیم کردم |
خروجی این تابع برابر یکی از ماکروهای زیر هستش :
FINGERPRINT_OK : تغییر BaudRate با موفقیت انجام شد.
FINGERPRINT_PACKETRECIEVEERR : خطایی در ارتباط با ماژول رخ داده.
FINGERPRINT_BAUDRATEINCORRECT : مقدار داداه شده به تابع بین 1 تا 12 نبوده.
در صورتی که مقدار این تابع برابر ماکروهای بالا نبود : خطای ناشناخته.
setSecurityLevel : تنظیم سطح امنیتی ماژول، که میتونید یکی از مقادیر 1 تا 5 رو به این تابع بدید، مقدار پیشفرض 3 هستش.
1 |
uint8_t setSecurityLevel( uint8_t Level = 3 ); // Default 3, نحوه تعریف این تابع در کتابخانه |
توجه : تو دیتاشیتی که من دارم توضیح خاصی درباره این تابع نداده، اگه رو دیتاشیت ماژول مسلط نیستید، بهتره از این تابع استفاده نکنید.
setPackageContentLength : تنظیم طول داده Package Content که یکی از مقادیر 0 تا 3 رو میتونید به این تابع بدید، 0 بدید یعنی طول Package Content برابر 32 بایت باشه، 1 یعنی 64 بایت، 2 یعنی 128 بایت و 3 هم یعنی 256 بایت؛ مقدار پیشفرض 2 یعنی 128 بایت هستش.
1 |
uint8_t setPackageContentLength( uint8_t Length = 2 ); // Default 128 Byte |
توجه : تو دیتاشیتی که من دارم توضیح خاصی درباره این تابع نداده، اگه رو دیتاشیت ماژول و کتابخونه این ماژول که تو این مطلب دارم توضیحش میدم مسلط نیستید، بهتره از این تابع استفاده نکنید.
readSystemParameter : این تابع برا خوندن یه سری از مشخصلات و تنظیمات ماژول هستش، که یه سری اطلاعات رو داخل یه سری متغییر ذخیره میکنه، از اسمشون معلومه چی هستن لذا توضیح نمیدم ولی بعضیاشون رو خودم هم حتی نمیدونم کارشونو، فقط دیتاشیت گفته که همچین اطلاعاتی رو میده این تابع به ما.
1 |
uint8_t readSystemParameter(void); |
اطلاعات در متغییر های مقابل ذخیره میشه : StatuRegister، SystemIdentifierCode، FingerLibrarySize، SecurityLevel، DeviceAddress، DataPacketSize، BaudRate
توجه : مقدار این متغییر ها رو همانند تواند بخونید یعنی باید به صورت finger.BaudRate مقدارشونو بخونید، و در ضمن فقط مدار این متغییرها رو بخونید و به هیچ وجح مقدارشونو تغییر ندید.
خواندن اثر انگشت : برای خوندن یه اثر انگشت و تشخیص و شناساییش و این که قبلا در حافظه ماژول ذخیره شده و تعریف شده این اثر انگشت و چقدر با نمونه های ذخیره شده شباهت داره باید از یه چند تایی تابع در کنار هم استفاده کرد.
1) getImage : اول این تابع رو فراخونی میکنیم تا اثر انگشت رو شناسایی کنه، از این تابع به صورت زیر میشه استفاده کرد :
1 2 |
uint8_t getImage(void); // نحوه تعریف این تابع در کتابخونه finger.getImage(); // مثالی از نحوه استفاده از این تابع |
بعد میام مقداری که تابع برگردونده رو بررسی میکنیم تا ببینیم چه وضعیتی رخ داده، برای این کار یه سری ثابت تعریف شدن که برای این کار به ما میتونن کمک کنن که بررسی کنیم که چه وضعیتی رخ داده، لیست این define ( ماکرو ) ها به صورت زیر هستش :
FINGERPRINT_OK : عکس اثر انگشت تهیه شد ( عملیات با موفقیت انجام شد )
FINGERPRINT_PACKETRECIEVEERR : خطایی در ارتباط با ماژول رخ داده.
FINGERPRINT_NOFINGER : اثرانگشتی شناسایی نشد.
FINGERPRINT_IMAGEFAIL : تهیه عکس اثر انگشت موفق آمیز نبود.
در صورتی که مقدار این تابع برابر ماکروهای بالا نبود : خطای ناشناخته.
توجه : برای ما فقط حالت FINGERPRINT_OK مهمه، اگه این حالت رخ داد، یعنی تهیه عکس از اثر انگشت با موفقیت انجام شده، لذا میریم سراغ مرحله بعد.
2) image2Tz : تو مرحله بعد از این تابع استقاده میکنیم تا عملیات تبدیل رو انجام بده ( اطلاعات بیشتری درباره این تابع ندارم، تو خود کتابخونه هم توضیحی دربارش نداده بود، فک کنم تبدیل عکس به کد باشه کار این تابع، نمیدونم دقیقا )، این تابع یه پارامتر ورودی هم داره که کارشو نمیدونم چیه، ما ازش فعلا استفاده نمیکنیم، ما مقدار این تابعو میخونیم تا ببینیم چه وضعیتی رخ داده.
1 2 |
uint8_t image2Tz(uint8_t slot = 1); // نحوه تعریف این تابع در کتابخونه finger.image2Tz(); // نحوه استفاده از این تابع |
برای این تابع هم برای راحتی کار یه سری ماکرو هستش که ازشون استفاده میتونیم بکنیم، مقدار این تابع میتونه برابر یکی از ماکرو های زیر باشه :
FINGERPRINT_OK : عملیات تبدیل با موفقیت انجام شد.
FINGERPRINT_PACKETRECIEVEERR : خطایی در ارتباط با ماژول رخ داده.
FINGERPRINT_IMAGEMESS : تصویر گرفته شده کقیف/آشفته هستش.
FINGERPRINT_FEATUREFAIL : ویژگیهای یک اثر انگشت یافت نشد.
FINGERPRINT_INVALIDIMAGE : ویژگیهای یک اثر انگشت یافت نشد.
در صورتی که مقدار این تابع برابر ماکروهای بالا نبود : خطای ناشناخته.
توجه : مثل تابع قبلی برای ما فقط حالت FINGERPRINT_OK مهمه، اگه مقدار تابع برابر FINGERPRINT_OK بود یعنی عملیات تبدیل این تابع با موفقیت انجام شده و بعدش میریم سراغ مرحله بعد.
3) fingerFastSearch : این تابع هم میاد بین تمام اثر انگشت هایی که در ماژول ذخیره شده، یه بررسی میکنه تا ببینه که این اثر انگشتی که الان شناسایی کرده با اثر انگشت های ذخیره شده در ماژول چقدر شباهت داره، و به اون اثر انگشتی که خیلی شباهت داشته باشه رو شناسایی میکنه موقعیتش رو داخل متغییر fingerID ذخیره میکنه؛ اگه هم با هیچ اثر انگشتی برابر نبود که در متغییر fingerID چیزی ذخیره نمیکنه و در خروجی مقدار FINGERPRINT_NOTFOUND رو بر میگردونه.
برای این تابع هم یه سری ماکرو به صورت زیر هستش، که مقدار خونده شده از این تابع میتونه برابر یکی از این ماکروها باشه :
FINGERPRINT_OK : اثر انگشت جدید در حافظه یافت شد.
FINGERPRINT_PACKETRECIEVEERR : خطایی در ارتباط با ماژول رخ داده.
FINGERPRINT_NOTFOUND : اثر انشگت جدید در حافظه یافت نشد.
در صورتی که مقدار این تابع برابر ماکروهای بالا نبود : خطای ناشناخته.
4) fingerID : اگه در تمام 3 مرجله قبلی وضعیت FINGERPRINT_OK رخ داد، یعنی از اثر انگشت عکس گرفته شد، تبدیل شد، در حافظه شناسایی شد، تو مرحله آخر میایم موقعیت اثر انگشت رو در حافظه ماژول میخونیم و بعد میفهمیم که این اثر انگشت سنس شده متعلق به کدوم خونه ( چه شخصی ) هستش، برای این کار میایم مقدار متغییر fingerID رو میخونیم.
پیدا کردن اثرانگشت های تکراری در حافظه ماژول : ممکنه تو حافظه ماژول ما چند تا اثرانگشت تکراری رو تعریف کرده باشیم که در ادامه به کمک 2تا تابعی که معرفی میکنم، میتونیم این اثر انگشتهای تکراری رو پیدا کنیم.
isDuplicateModelExist : اول از این تابع استفاده میکنیم تا ببینیم که اثر انگشت تکراری کلا وجود داره یا نه، اگه مقدار این تابع برابر FINGERPRINT_OK بود میریم سراغ مرحله بعد.
findDuplicateModel : بعد میریم سراغ این تابع که id ( موقعیت ) اون اثرانگشت تکراری رو به ما میده و این id رو در متغییر fingerID و میزان شباهت دو اثر انگشت تکراری رو در متغییر confidence ذخیره میکنه؛ اگه مقدار این تابع برابر FINGERPRINT_OK بود میریم سراغ مرحله بعد.
fingerID : در مرحله آخر میریم مقدار این متغییر رو میخونیم و بعد این مقدارو میدیم به تابع حذف کردن اثر انگشت مدنظر.
1 2 |
uint8_t isDuplicateModelExist(void); uint8_t findDuplicateModel(void); |
ذخیره کردن یه اثر انگشت در حافظه ماژول : برای این کار در ته مطلب یه سری پروژه میزارم که پروژه enroll برای این کار هستش، چون توضیحاتش یکم زیاد میشه بیخیالش شدم، پروژه رو بررسی کنید، روال کار دستتون میاد.
حذف کردن اثر انگشت از حافظه : برای حذف کردن تمام اثرانگشت ها از حافظه باید از تابع deleteAllModel استفاده کرد و برای حذف کردن یه تک اثرانگشت باید از تابع deleteModel استفاده کنیم که باید موقیت اون اثر انگشت رو به این تابع بدیم.
1 2 |
uint8_t deleteModel(uint16_t id); uint8_t deleteAllModel(); |
تعداد کل مدلهای ذخیره شده در حافظه : اگه مقدار این تابع برابر FINGERPRINT_OK بود، بعدش میریم سراغ متغییر templateCount که تعداد نمونه ها داخلش ذخیره شده.
1 |
uint8_t getModelCount(void); |
خوندن کد اثر انگشت ها در قالب یه بسته 256 بایتی : پروژه readFingerpintArrayCode رو بررسی کنید، توضیح نمیدم دیگه.
1 2 |
uint8_t loadModel(uint16_t id); uint8_t getModel(uint8_t *ModelData); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <Adafruit_Fingerprint.h> Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); void setup() { Serial.begin(115200); finger.begin(57600); Serial.println("Delete Finger"); uint8_t status; /*status = finger.setPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Setting Complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error When Receiving Package"); break; default: Serial.println((String)"Unknown error = " + status); break; }*/ status = finger.verifyPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Correct, Found fingerprint sensor"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); while(1); case FINGERPRINT_PASSFAIL: Serial.println("Password inCorrect"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } Serial.println("Deleteing All Model ???"); while( !Serial.available() ); // هر کاراکتری رو وارد کنه حذف تمام مدل ها شروع میشه Serial.println("Deleteing All Model Started"); deleteAllFingerprint(); Serial.println("All Model Deleted"); } void loop() {} uint8_t deleteAllFingerprint() { uint8_t p = finger.deleteAllModel(); switch(p) { case FINGERPRINT_OK: Serial.println("empty success"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); break; case FINGERPRINT_DBCLEARFAIL: Serial.println("fail to clear finger library"); break; default: Serial.println((String)"Unknown error = " + p); break; } return p; } |
پروژه 2) حذف یه مدل خاص، که تو سریال باید ID اون مدل ( اثرانگشت ) رو به میکرو بدیم تا میکرو هم به ماژول بگه که اون اثرانگشت رو پاک کنه از حاقظه اش.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include <Adafruit_Fingerprint.h> Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); void setup() { Serial.begin(115200); finger.begin(57600); Serial.println("Delete Finger"); uint8_t status; /*status = finger.setPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Setting Complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error When Receiving Package"); break; default: Serial.println((String)"Unknown error = " + status); break; }*/ status = finger.verifyPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Correct, Found fingerprint sensor"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); while(1); case FINGERPRINT_PASSFAIL: Serial.println("Password inCorrect"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } } void loop() { Serial.println("Type in the ID # you want delete..."); uint8_t id = 0; while( !Serial.available() ); id = Serial.parseInt(); Serial.println( (String)"deleting ID #" + id ); deleteFingerprint(id); Serial.println("\n\n\n"); } uint8_t deleteFingerprint(uint8_t id) { uint8_t p = finger.deleteModel(id); switch(p) { case FINGERPRINT_OK: Serial.println("Deleted!"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_BADLOCATION: Serial.println("Could not delete in that location"); break; case FINGERPRINT_FLASHERR: Serial.println("Error writing to flash"); break; default: Serial.println((String)"Unknown error = " + p); break; } return p; } |
پروژه 3) پیدا کردن اثرانگشت های تکراری موجود در حافظه ماژول
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <Adafruit_Fingerprint.h> Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); void setup() { Serial.begin(115200); finger.begin(57600, 0xFFFFFFFF); uint8_t status; /*status = finger.setAddress(3848613); switch(status) { case FINGERPRINT_OK: Serial.println("address setting complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); }*/ /*status = finger.setPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Setting Complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error When Receiving Package"); break; default: Serial.println((String)"Unknown error = " + status); break; }*/ status = finger.verifyPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Correct, Found fingerprint sensor"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); while(1); case FINGERPRINT_PASSFAIL: Serial.println("Password inCorrect"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } DuplicateModel(); } void loop() {} void DuplicateModel() { uint8_t p = finger.isDuplicateModelExist(); Serial.println( (String)"isDuplicateModelExist = " + p ); p = finger.findDuplicateModel(); Serial.println( (String)"findDuplicateModel = " + p ); } |
پروژه 4) تعریف و ذخیره کردن یه اثرانگشت جدید در حافظه ماژول
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#include <Adafruit_Fingerprint.h> Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); void setup() { Serial.begin(115200); finger.begin(57600); uint8_t status; /*status = finger.setPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Setting Complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error When Receiving Package"); break; default: Serial.println((String)"Unknown error = " + status); break; }*/ status = finger.verifyPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Correct, Found fingerprint sensor"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); while(1); case FINGERPRINT_PASSFAIL: Serial.println("Password inCorrect"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } } void loop() { Serial.println("Type in the ID # you want to save this finger as..."); uint8_t id = 0; while( !Serial.available() ); id = Serial.parseInt(); Serial.println( (String)"Enrolling ID #" + id ); while( getFingerprintEnroll(id) != 1 ); delay(2000); } int16_t getFingerprintEnroll(uint8_t id) { int16_t p; Serial.println("Waiting for valid finger to enroll"); p = Image_Taken_Converted(1); if( p != 1 ) return p; // Image convert OK Serial.println("Remove finger"); delay(2000); do { p = finger.getImage(); } while( p != FINGERPRINT_NOFINGER ); Serial.println("Place same finger again"); p = Image_Taken_Converted(2); if( p != 1 ) return p; // Image convert OK p = finger.createModel(); switch (p) { case FINGERPRINT_OK: Serial.println("Prints matched!"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return -17; case FINGERPRINT_ENROLLMISMATCH: Serial.println("Fingerprints did not match"); return -18; default: Serial.println("Unknown error : "); return -19; } p = finger.storeModel(id); switch (p) { case FINGERPRINT_OK: Serial.println("Stored!"); return 1; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return -9; case FINGERPRINT_BADLOCATION: Serial.println("Could not store in that location"); return -10; case FINGERPRINT_FLASHERR: Serial.println("Error writing to flash"); return -11; default: Serial.println("Unknown error : "); return -12; } } int16_t Image_Taken_Converted(int8_t slot) { int16_t p; do { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("."); break; // No finger detected case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return -1; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); return -2; default: Serial.println("Unknown error"); return -3; } } while( p != FINGERPRINT_OK ); // getImage OK p = finger.image2Tz( slot ); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); return 1; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return -4; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return -5; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return -6; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return -7; default: Serial.println("Unknown error : "); return -8; } } |
پروژه 5) خوندن اثر انگشت و بررسی این که در حافظه وجود داره یا نه و اگه وجود داره id ییشو نمایش بده.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
#include <Adafruit_Fingerprint.h> Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); /*#include <SoftwareSerial.h> SoftwareSerial mySerial(18, 19); #include <Adafruit_Fingerprint.h> Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);*/ void setup() { Serial.begin(115200); finger.begin(57600, 0xFFFFFFFF); uint8_t status; /*status = finger.setAddress(3848613); switch(status) { case FINGERPRINT_OK: Serial.println("address setting complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); }*/ /*status = finger.setPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Setting Complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error When Receiving Package"); break; default: Serial.println((String)"Unknown error = " + status); break; }*/ status = finger.verifyPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Correct, Found fingerprint sensor"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); while(1); case FINGERPRINT_PASSFAIL: Serial.println("Password inCorrect"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } Serial.println("Waiting for valid finger..."); } void loop() { getFingerprintID(); } int16_t getFingerprintID() { uint8_t p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return -1; case FINGERPRINT_NOFINGER: Serial.println("No finger detected"); return -2; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); return -3; default: Serial.println((String)"Unknown error = " + p); return -4; } // OK success! p = finger.image2Tz(); switch (p) { case FINGERPRINT_OK: Serial.println("Image converted"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return -5; case FINGERPRINT_IMAGEMESS: Serial.println("Image too messy"); return -6; case FINGERPRINT_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return -7; case FINGERPRINT_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return -8; default: Serial.println("Unknown error"); return -9; } // OK converted! p = finger.fingerFastSearch(); //p = finger.Search(); switch (p) { case FINGERPRINT_OK: { Serial.println( (String)"Found ID #" + finger.fingerID + (String)" with confidence of " + finger.confidence ); return finger.fingerID; } case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); return -10; case FINGERPRINT_NOTFOUND: Serial.println("Did not find a match"); return -11; default: Serial.println("Unknown error"); return -12; } } int16_t getFingerprintIDez() { // returns -1::-12 if failed, otherwise returns ID, And Show Data uint8_t p = finger.getImage(); switch (p) { case FINGERPRINT_OK: break; case FINGERPRINT_PACKETRECIEVEERR: return -1; case FINGERPRINT_NOFINGER: return -2; case FINGERPRINT_IMAGEFAIL: return -3; default: return -4; } // OK success! p = finger.image2Tz(); switch (p) { case FINGERPRINT_OK: break; case FINGERPRINT_PACKETRECIEVEERR: return -5; case FINGERPRINT_IMAGEMESS: return -6; case FINGERPRINT_FEATUREFAIL: return -7; case FINGERPRINT_INVALIDIMAGE: return -8; default: return -9; } // OK converted! p = finger.fingerFastSearch(); switch (p) { case FINGERPRINT_OK: { Serial.println( (String)"Found ID #" + finger.fingerID + (String)" with confidence of " + finger.confidence ); return finger.fingerID; } case FINGERPRINT_PACKETRECIEVEERR: return -10; case FINGERPRINT_NOTFOUND: { Serial.println("Did not find a match"); return -11; } default: return -12; } } |
پروژه 6) خوندن کدهای یه اثر انگشت و نمایش دادن در پنجره سریال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#include <Adafruit_Fingerprint.h> Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); void setup() { Serial.begin(115200); finger.begin(57600); uint8_t status; /*status = finger.setPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Setting Complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error When Receiving Package"); break; default: Serial.println((String)"Unknown error = " + status); break; }*/ status = finger.verifyPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Correct, Found fingerprint sensor"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); while(1); case FINGERPRINT_PASSFAIL: Serial.println("Password inCorrect"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } if( finger.getModelCount() == FINGERPRINT_OK ) { Serial.println( (String)"templateCount = " + finger.templateCount ); } } void loop() { Serial.println("Type in the ID for load finger array"); uint8_t fingerID = 0; while( !Serial.available() ); fingerID = Serial.parseInt(); readFingerpintArrayCode( fingerID ); Serial.println("\n"); } uint8_t readFingerpintArrayCode(uint16_t id) { uint8_t p = finger.loadModel(id); switch (p) { case FINGERPRINT_OK: Serial.println( (String)"template " + id + (String)" loaded" ); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); return p; case FINGERPRINT_BADLOCATION: Serial.println("addressing PageID is beyond the finger library"); return p; case FINGERPRINT_DBRANGEFAIL: Serial.println("error when reading template from library or the readout template is invalid"); return p; default: Serial.println( (String)"Unknown error = " + p ); return p; } uint8_t ModelData[256]; p = finger.getModel( ModelData ); switch (p) { case FINGERPRINT_OK: Serial.println( (String)"template " + id + (String)" transferring" ); break; default: Serial.println( (String)"Unknown error = " + p ); return p; } //dump entire ModelData. This prints out 16 lines of 16 bytes for (int count= 0; count < 16; count++) { for (int i = 0; i < 16; i++) { Serial.print("0x"); Serial.print(ModelData[count*16+i], HEX); Serial.print(", "); } Serial.println(); } } |
پروژه 7) تنظیم پارامترهای ماژول و خوندنشون ( در استفاده از این پروژه دقت کنید —- اخطارررررررررررررررررر )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <DMF313_Fingerprint.h> DMF313_Fingerprint finger = DMF313_Fingerprint(&Serial1); /*#include <SoftwareSerial.h> SoftwareSerial mySerial(18, 19); #include <DMF313_Fingerprint.h> DMF313_Fingerprint finger = DMF313_Fingerprint(&mySerial);*/ void setup() { Serial.begin(115200); finger.begin(57600, 0xFFFFFFFF); uint8_t status; /*status = finger.setAddress(3848613); switch(status) { case FINGERPRINT_OK: Serial.println("address setting complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); }*/ /*status = finger.setPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Setting Complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Error When Receiving Package"); break; default: Serial.println((String)"Unknown error = " + status); break; }*/ status = finger.verifyPassword(313); switch(status) { case FINGERPRINT_OK: Serial.println("Password Correct, Found fingerprint sensor"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); while(1); case FINGERPRINT_PASSFAIL: Serial.println("Password inCorrect"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } /*status = finger.setBaudRate(6); switch(status) { case FINGERPRINT_OK: Serial.println("parameter setting complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); while(1); case FINGERPRINT_INVALIDREG: Serial.println("wrong register number"); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); }*/ // setSecurityLevel // setPackageContentLength /*status = finger.readSystemParameter(); switch(status) { case FINGERPRINT_OK: Serial.println("read complete"); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("error when receiving package"); while(1); while(1); default: Serial.println((String)"Unknown error = " + status); while(1); } Serial.println( (String)"StatuRegister = " + finger.StatuRegister ); Serial.println( (String)"SystemIdentifierCode = " + finger.SystemIdentifierCode ); Serial.println( (String)"FingerLibrarySize = " + finger.FingerLibrarySize ); Serial.println( (String)"SecurityLevel = " + finger.SecurityLevel ); Serial.println( (String)"DeviceAddress = " + finger.DeviceAddress ); Serial.println( (String)"DataPacketSize = " + finger.DataPacketSize ); Serial.println( (String)"BaudRate = " + finger.BaudRate );*/ } void loop() {} |
خب امیدوارم این مطلب براتون مفید بوده باشه، جهت شادی اموات یه فاتحه بفرستین ( هزینه این مطلب )
اینم یه قسمتی از حرف های امام خمینی، جالب بود، گفتم برای شما هم بزارم بخونید، فعلا یا علی.
****** صحیفه امام خمینی (ره) جلد ۲۱ – ۱۳۶۷/۰۴/۲۹ ******
ما این واقعیت و حقیقت را در سیاست خارجی و بینالملل اسلامیمان بارها اعلام نمودهایم که درصدد گسترش نفوذ اسلام در جهان و کم کردن سلطۀ جهانخواران بوده و هستیم.
حال اگر نوکران امریکا نام این سیاست را توسعهطلبی و تفکر تشکیل امپراتوری بزرگ میگذارند، از آن باکی نداریم و استقبال میکنیم.
ما درصدد خشکانیدن ریشههای فاسد صهیونیزم، سرمایهداری و کمونیزم در جهان هستیم.
ما تصمیم گرفتهایم، به لطف و عنایت خداوند بزرگ، نظامهایی را که بر این سه پایه استوار گردیدهاند نابود کنیم؛ و نظام اسلام رسول اللّه ( صلیاللّهعلیهوآلهوسلم ) را در جهان استکبار ترویج نماییم. و دیر یا زود ملتهای دربند شاهد آن خواهند بود…
امروز جنگ حق و باطل، جنگ فقر و غنا، جنگ استضعاف و استکبار، و جنگ پابرهنهها و مرفهین بیدرد شروع شده است.
و من دست و بازوی همۀ عزیزانی که در سراسر جهان کولهبار مبارزه را بر دوش گرفتهاند و عزم جهاد در راه خدا و اعتلای عزت مسلمین را نمودهاند میبوسم.
جنگ ما فتح قدس را در پی خواهد داشت (امام خمینی) >>>>>> اگر از صدام بگذریم، اگر مسأله قدس را فراموش کنیم، اگر از جنایت های امریکا بگذریم از آل سعود نخواهیم گذشت. انشاالله اندوه دلمان را را در وقت مناسب با انتقام از امریکا و ال سعود برطرف خواهیم کرد و داغ و حسرت حلاوت این جنایت بزرگ را بر دلشان خواهیم گذاشت و با برپایی جشن پیروزی حق بر جنود کفر و نفاق و آزادی کعبه از دست نااهلان و نامحرمان به مسجد الحرام وارد خواهیم شد (امام خمینی)
فعلا دارم رو USB و میکرو LPC کار میکنم، 3 تا موضوع مطرح هستش ( که تو ذهنمه هر3شو برم ) :
1) میکرو در نقش Device ( فعلا محوریت کار من این مورد هستش )
2) میکرو در نقش Host
3) میکرو در نقش OTG
و باز 2 تا موضوع مطرح هستش، برا راه اندازی usb دو تا راه داریم ( که تو ذهنمه هر2شو برم ) :
1) استفاده از میکروکنترلر ( فعلا محوریت کار من این مورد هستش که از LPC1768 استفاده میکنم )
2) استفاده از آیسی های مختص اینکار.
فعلا کارم با دیتاشیت usb تموم شده، دارم کلاس های usb رو مطالعه میکنم، کلاس cdc رو ماستمالی کردیم و یه پروژه ازش منتشر کردیم، الان رو کلاس HID ریز شدم و دارم مطالعه میکنمش و پروژه ازش میزارم تو سایت.
جزئیات داستان رو در لینک زیر میتویند ببینید :
سوالی داشتید در قسمت نظرت مطرح کنید؛ بلد باشم حتما جواب میدم ( اکثر مواقع آنلاین هستم و در کمتر از 1 ساعت جواب میدم )
دستت درد نکنه. من هروز وبسایت رو سر میزدم فکر می کردم مرورگرم خرابه کشش. مطلب بزارید
داچی ملت حمایت نمیکنن من چیکار کنم آخه – این ماژولو فک کنم ۱۰۰ تومن خریدم – یکی هم قبلا خریده بودم تو همین مایه ها که مشکل داشت انگار و حالا بنا به هر دلیلی راه نیوفتاد – الان چند ماهه من قسمت حمایت مالی رو گزاشتم ولی به اندازه پول ماژول توی این مطلب نشده کل مبلغ حمایت شده
چه توقعی داری نوکرتم آخه 
سلام .من یه ماژولr308دارم میخوام راش بندازم .فرقی تو راه اندازیش با ماژول r305 داره یا باهمین روش میتونم راش بندازم؟؟؟
سلام-دیتاشیتشو ندیدم والا – اگه میتونی بردار بیار برام – تا راش بندازم و یه کتابخونه براش بنویسم البته اگه دیتاشیتی ازش وجود داشته باشه.
به نظر میاد یکی باشه – باز پروژه این مطلبو تست کن – چون دیتاشیتشو دیدم نوشته بود R30X فرمت دیتاشم همون بود – بقشو دیگه نبدیم حسش نبود – ساعت ۳٫۵ شب
دمت گرم با همین روش جواب گرفتم
سلام لطفا مثل این پروژه رو برای c هم بزاربد .
سلام
برید یاد بگیرید خودتون – کار خاصی نداره
سلام،
کاش به جای این، r301 رو می خریدید که هم ارزون تر بود هم سطح امنیتیش بالاتر بود…
دو تا سوال داشتم:
۱-چرا از کتابخونه adafruit fingerprint اینا استفاده نکردید؟ آخرین نسخه هاش خیلی خوب جواب میده.
۲-میشه رو این هم کار کنید که کد اثرانگشت ها از ماژولی استخراج بشه و مثل یک اثر انگشت عادی داخل یک ماژول دیگه ذخیره بشه؟ چطور میشه چند تا حسگر با هم کار کنن؟
سلام
۱-تو مطلب توضیح دادم دیگه…
۲-چند تا سنسور اثر انگشت با هم کار کنند؟ خب اینا پروتکول ارتباطیشون سریال هستش – از میکرویی استفاده کن که چندتا سریال داشته باشه
۲٫۵-این کار باید بشه احتمالا – تو نسخه های بعدی بررسیش میکنم – این موردو به ته مطلب اضافه میکنم.
منظورم از کار کردن چند تا ماژول با هم اینه که یعنی فرضا دو تا حسگر دو طرف یک در هستن و کاربر از هر طرف انگشت بزنه در باز بشه؛ اگه بخوایم برای هر ماژول یک سری enroll کنیم خیلی فاجعه میشه!
خب گفتم دیگه – از یه میکرو استفاده کن که حداقل ۲-۳ تا سریال داشته باشه.
قسمت دوم حرفتو متوجه نشدم.بیشتر توضیح بده
منظورم اینه که بشه کاری کرد که کاربر روی حسگر مرکزی enroll کنه و بعدا بتونه با چند تا حسگر که نقاط مختلفی هستن در رو باز کنه؛ یعنی اون اثر انگشته (کد ش) از حسگر مرکزی استخراج بشه و داهل بقیه هم ذخیره بشه…
خب برا این مورد به دو تا تابع نیازه – یکی از این تابع ها نوشته شده – اون یکی نه – تو مطلب هم ذکر کردم که بعدا به کتابخونه اضافش کنم.
سلام
این موضوع کار کردن چنتا سنسور باهم رو به نتیحه ای رسیدین؟
که تو یکیش ذخیره کرد و این اثر انگشت تو بقیشون هم ذخیره بشه
سلام،
این بحث وارد کردن کد اثرانگشت رو میشه کمک کنید زودتر بررسی کنید؟ آخه من خیلی درگیرشم نیاز دارم…
سلام.الان شهرستانم
سلام با عرض خسته نباشید UART در AVR کتابخونش پیدا میشه مثل serial software اردوینو شما جایی منبع میشناسین چون گشتم پیدا نکردم تو نت
سلام – نه!
با عرض سلام
دنبال تابعی می گردم که بتوانم که اثر انگشت های ذخیره شده در ماژول را به یک sd کارت منتقل نمایم و همچنین برعکس از sd کارت به ماژول منتقل نمایم اگر امکان اش هست خواهشان راهنمایی بفرمایید
باتشکر
سلام
بنویس تابعشو/
بوسیله تابع getModel میتونیم یک اثر انگشت ذخیره شده در ماژول را در پورت سریال بخوانیم پس می توانیم بروی اس دی کارت بنویسیم.
حالا اگر برعکس میخواهیم به ماژول منتقل کنیم از کدام تابع استفاده کنیم.یه راه حل اینکه داده اثر انگشت را به تابع downchar به charebufer1 منتقل کنیم بعد با تابع stroemdel به مازول منتقل کنیم.حال من نمی تونم قسمت اول کار که داده اثر انگشت را به charbuffer1 منتقل کنم را بنویسم . کامند اش را ارسال می کنم ولی جطوری داده بفرستم را نمی دونم.اگه میشه راهنمایی کنید. باتشکر
سلام میشه کمکم کنید بتونم با ماژول r305 از طریق avr بتونم برنامه نویسی کنم
سلام
شما دستورات آردوینو و کامپایلر مد نظرتون مسلط باشید متونید کدشو به راحتی تبدیل کنید.
سلام
مرسی از اموزش های خوبت و خسته نباشید
من میخوام سنسور r300 fpc1020 راه بندازم
1-با این کد شما میشه؟
2-میخوام با ارم راه بندازم همین کد رو منتقل کنم رو ارم (با روش های تبدیل کردنش به کد ارم) جواب میده؟
3-من uno دارم اینجا نوشتی با ید مگا باشه !همون رو آرم بریزم اوکیه؟
یکی کمکم کنه الا یه هفتس درگیرشم
با نرم افزار راه میفته ولی نمیتونم با اردوینو و ابنا راهش بندازم
سلام-نمیدونم باید دیتاشیت هر دو ماژولو بررسی کنید.
2-خو باید کدو تبدیل کنید – مثلا توابع ورودی خروجی – توابع سریال و …
3-رو مگا نوشتم احتمالا چون 2 تا سریال نیاز داشتم وگرنه…
سلام من میخام این کد خواندن دیتای اثر انگشت رو کامپایل کنم این ارور رو میده
no matching function for call to ‘DMF313_Fingerprint::DMF313_Fingerprint(SoftwareSerial
سلام-یا کدو درست کپی نکردی یا کتابخونه های مورد نیاز تو سیستمت نی
سلام جناب مهندس
یه سوال
میشه دو تا اتصال سنسور به آردوینو رو به بقیه پایه های آردوینو متصل کرد؟
اگه بخوایم این کار رو بکنیم باید توی کتابخونه اش دست بیاریم؟؟
سلام- دو تا سنسور چی؟ به چه بردی؟ کدوم پایه های میکرو؟
سلام جناب مهندس
وقت بخیر
راه اندازی این ماژول با نرم افزار هایی که توی قسمت دانلود این صفحه قرار دادید، امکان چذیره؟
این نرم افزار ها با ویندوز 10 سازگاری دارن؟
ممنون
سلام-دقت کنی میبینی که ویندوز خودم 10 هستش.-فیلم.
سلام

خسته نباشین
قبل از اینکه سوالم رو بپرسم اجازه بدین خیلی خیلی ازتون تشکر کنم بابت مطالب فوق العاده عالی و تدریس مفهومی تون…
من ماژولم رو طبق آموزش تون قدم به قدم پیش بردم… ولی هر برنامه رو که آپلود میکنم فقط خطای نرخ داده رو میده… یعنی همش ارور شماره 255 رو میده…
فکر می کنید کجای کارم ایراد داره؟
همه 12 مقادیر 9600 تا 115200 رو هم تست کردم برطرف نشد
ممنونم
سلام- چک کن ببین اتصالاتت درسته. و پایه های سریال ماژول نسوخته باشه.
بله اتصالات رو بار ها چک کردم و درست بود
پایه های سریال رو چطوری بدونم سوخته ان یا نه؟
ماژول نو بوده آخه…
خب پس کتابخونه رو برسی کن – ببین مشکل از کجاس – روش درست و حسابی برای تست بلد نیستم ولی خب وقتی ببینم ماژول دیتا بهش میدی چیزی نمیده خب یعنی یه مشکلی داره دیگه
راستی اگه از برد آردوینو استفاده نمیکنی و میکروشو گرفتی ممکنه مشکل از کللاک میکرو باشه.
سلام من ماژول fpm10 رو دارم با استفاده کد های شما رمز رو عوض کردم و الان هر رمزی که میزنم قبول نمیکنه ماژول رو پیدا میکنه ولی unknow erorr میده فایل های مثالی که شما دادین رو ارور کامپایل میده Error compiling for board Arduino/Genuino Uno.
خودم کتابخانه آردواینو مربوط به اثر انگشت رو از تو کتابخانه اش سرچ کردم و قبل از اینکه رمز رو عوض کنم با اون کار میکرد اما الان بعد عوض شدن رمز کار نمیکنه و اگه داخل پرانتز وریفای پسورد هم رمز رو بنویسم ارور میده
exit status 1
no matching function for call to ‘Adafruit_Fingerprint::verifyPassword(int)’
خالی هم که گذاشتنی مشکل رمز دارم و مازول جواب نمیده
چند بار خواستم رمز رو عوض کنم ولی جواب نداد لطفا کمکم کنی خیلی حیاتیه
سلام.میشه آموزش راه اندازی ماژول اثرانگشت با میکرو رو توضیح بدین؟
سلام – سریاله دیگه این ماژول اگه اشتباه نکنم – دستوراتشو طبق دیتاشیت میدی بهش – جواب رو برات میفرسته – برا راحتی هم من برا آردوینو یه کتابخونه نوشتم براش شما میتونید برا هر میکرویی که نیازتونه بنویسید یا همینو ویرایش کنن که خب باید CPP رو بلد باشید.