ویژگی های ماژول سنسور اثر انگشت R308
ماژول سنسور اثر انگشت R308 ماژولی با دقت بالا ، سرعت عملکرد بالا ، الگوریتم تطبیق با کارایی بالا و تراشه ی فلش با ظرفیت بالاست که بر مبنای پردازش تصویر اثر انگشت و تطبیق و جستجو در حافظه و انجام عملکرد های مورد نظر، کار میکند. راه ارتباطی این ماژول با میکروکنترلر، سریال می باشد که در بادریت (Baud Rate) پیش فرض 57600 قرار دارد و امکان تغییر بادریت (Baud Rate) وجود ندارد. این ماژول قابلیت ذخیره سازی 500 اثر انگشت را دارد.
جهت دریافت دیتاشیت ماژول اثر انگشت R308 اینجا کلیک کنید.
R308 Biometric Fingerprint Module Datasheet
معرفی پایه ها (Pinout) ماژول اثر انگشت R308
ماژول سنسور اثر انگشت R308 دارای 4 پایه به شرح زیر است:
- VIN: تغذیه ماژول – 5 ولت
- GND: زمین
- RX: دریافت اطلاعات از طریق پروتکل سریال
- TX: ارسال اطلاعات از طریق پروتکل سریال
پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
راه اندازی ماژول اثر انگشت R308 با آردوینو
گام اول: سیم بندی
مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
توجه
رنگ بندی سیم ها در مدل های مختلف امکان دارد متفاوت باشد، حتما از ترتیب پایه ها که در بالاتر آماده است استفاده کنید.
گام دوم: کد
ابتدا کتابخانه زیر را بر آردوینوی خود نصب کنید.
https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library
توجه
اگر نیاز به راهنمایی بیشتر برای نصب کتابخانه بر روی آردوینو دارید، می توانید به آموزش نصب کتابخانه بر آردوینو مراجعه کنید.
/***************************************************
This is an example sketch for our optical Fingerprint sensor
Designed specifically to work with the Adafruit BMP085 Breakout
----> http://www.adafruit.com/products/751
These displays use TTL Serial to communicate, 2 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
#include <Adafruit_Fingerprint.h>
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
uint8_t id;
void setup()
{
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit Fingerprint sensor enrollment");
// set the data rate for the sensor serial port
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
}
uint8_t readnumber(void) {
uint8_t num = 0;
while (num == 0) {
while (! Serial.available());
num = Serial.parseInt();
}
return num;
}
void loop() // run over and over again
{
Serial.println("Ready to enroll a fingerprint!");
Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
id = readnumber();
if (id == 0) {// ID #0 not allowed, try again!
return;
}
Serial.print("Enrolling ID #");
Serial.println(id);
while (! getFingerprintEnroll() );
}
uint8_t getFingerprintEnroll() {
int p = -1;
Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
break;
default:
Serial.println("Unknown error");
break;
}
}
// OK success!
p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
Serial.println("Remove finger");
delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
Serial.print("ID "); Serial.println(id);
p = -1;
Serial.println("Place same finger again");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.print(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
break;
default:
Serial.println("Unknown error");
break;
}
}
// OK success!
p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK converted!
Serial.print("Creating model for #"); Serial.println(id);
p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println("Prints matched!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
Serial.println("Fingerprints did not match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
Serial.print("ID "); Serial.println(id);
p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
Serial.println("Stored!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("Could not store in that location");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("Error writing to flash");
return p;
} else {
Serial.println("Unknown error");
return p;
}
}
پس از آپلود کد، سریال مانیتور دستگاه خود را باز کنید.
دستگاه منتظر وارد کردن یک ID از سوی شما می باشد.
/***************************************************
This is an example sketch for our optical Fingerprint sensor
Designed specifically to work with the Adafruit BMP085 Breakout
----> http://www.adafruit.com/products/751
These displays use TTL Serial to communicate, 2 pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
#include <Adafruit_Fingerprint.h>
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");
// set the data rate for the sensor serial port
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
}
void loop() // run over and over again
{
getFingerprintIDez();
delay(50); //don't ned to run this at full speed.
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println("No finger detected");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK success!
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK converted!
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) return -1;
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
توجه
اگر نیاز به راهنمایی بیشتر برای نصب کتابخانه بر روی آردوینو دارید، می توانید به آموزش نصب کتابخانه بر آردوینو مراجعه کنید.
Comments (33)
سیم بندی این سنسور
سبز = GND
مشکی و قرمز = 5V
سفید= D3
زرد = D2
به صورت شماره ای هم بگم میشه
شماره 1 و 2 = 5V
شماره 3 = D2
شماره 4 = D3
شماره 5 = GND
سلام.
رنگبندی سیمها در ورژنهای مختلف بعضا متفاوت هست. اما در مورد ترتیب پایهها بله، درست میفرمایید. در قسمت معرفی پایهها pinout هم همین ترتیب در مورد پایههای ماژول آورده شده. و اینکه پایه شماره 1 هم نیازی نیست به 5ولت متصل بشه. همون پایه 2 برای راهاندازی کفایت میکنه.
سلام. خیلی لطف کردی آقا آرمان عزیز. الان نزدیک به 4 ساعت درگیر این قضیه بودم. فک نمیکردم مشکل از سیم بندیم باشه. فک میکردم این کتابخانه Adafruit برای r308 مناسب نباشه. بازم ممنون
برای من زمانی که اثر انگشتم مخوام ثبت کنم این برام میاد
Image taken
Image converted
Remove finger
ID 1
Place same finger again
……….Image taken
Image converted
Creating model for #1
Unknown error
Ready to enroll a fingerprint!
Please type in the ID # (from 1 to 127) you want to save this finger as…
سلام.
هر دفعه اتفاق میوفته یا بعضی وقت ها فقط پیش میاد؟
همیشه اتفاق می افته
لطفا کمکم کنید
اگر هر بار اتفاق میوفته امکان ایراد داشتن خود ماژول هست. برای اطمینان میتونید از لینک های زیر هم برای راهاندازی ماژولتون کمک بگیرید.
“https://www.arduino.cc/reference/en/libraries/r30x-fingerprint-sensor-library/”
“https://github.com/brianrho/FPM”
الان من رفتم تو قسمت مثال ها اردوینو و دقیقا همین کد پیدا کردم با یک تفاوت که یه دستور کامل از توش حذف شده بود و این دستور در قسمت void setup هست
finger.getParameters();
Serial.print(F(“Status: 0x”)); Serial.println(finger.status_reg, HEX);
Serial.print(F(“Sys ID: 0x”)); Serial.println(finger.system_id, HEX);
Serial.print(F(“Capacity: “)); Serial.println(finger.capacity);
Serial.print(F(“Security level: “)); Serial.println(finger.security_level);
Serial.print(F(“Device address: “)); Serial.println(finger.device_addr, HEX);
Serial.print(F(“Packet len: “)); Serial.println(finger.packet_len);
Serial.print(F(“Baud rate: “)); Serial.println(finger.baud_rate);
و زمانی که این کد میزدم همیچین ارورری تو کامپاین کردن اتفاق می افتاد
‘class Adafruit_Fingerprint’ has no member named ‘getParameters’
بله. این مثالی که نویسنده کتابخونه اصلی آماده کرده این ایراد رو داره و لازمه اون خط از کد حذف بشه تا به درستی کار کنه.
در واقع توضیح خطا این هست که کلاس اصلی نوشته شده در کتابخانه سنسور، تابعی به نام getParameters نداره ولی تو برنامه اصلی صدا زده شده
ماژورم سالمه چون برنامه R308_seach_database که مخصوص r308 را اجرا میکنه ولی این برنامه ای که مال شما هست را اجرا نمیکنه شما برنامه ی دیگه ای جز این ندارین چون واقعا به کدش احتیاج دارم
دوستانی که زمانی که در سریال مانیتور انگشتشان را میخواهند ذخیره کننده با ارورر ناشناخته رو به رو می شوند فقط کافی است ورژن پایین تر اردوینو استفاده کنند
لینکش براتون گذاشتم که مثل من وقتون تلف نشه برای یک چیز کوچک از ورژن ARDUINO 1.0.6 استفاده کنین به احتمال خیلی زیاد مشکل تون برطرف میشه :
https://bit.ly/31HBlGy
ممنون از اینکه تجربهتون رو به اشتراک گذاشتید. به شخصه با این مشکل مواجه نشده بودم.
سلام. من وقتی کد اول را دانلود میکنم در مانیتور پیام زیر نمایش داده می شود.
Adafruit Fingerprint sensor enrollment
Found fingerprint sensor!
Ready to enroll a fingerprint!
Please type in the ID # (from 1 to 127) you want to save this finger as…
و قسمت اخر که باید اثر انگشت ثبت شود نمایش داده نمی شود.
سلام.
تو این مرحله شما باید یک عدد بین 1 تا 127 وارد کنید به عنوان ID اثرانگشتی که میخواید ثبت بشه. بعد از اینکه عدد رو وارد میکنید عبارت Enrolling ID #number و بعد از اون هم Waiting for valid finger to enroll as #number نوشته میشه و ماژول منتظر یک اثرانگشت برای ثبت کردن میمونه.
Adafruit Fingerprint sensor enrollment
Did not find fingerprint sensor 🙁
سلام این ارور برام ارسال میشه یعنی ممکنه که از ماژول باشه با توجه به اینکه سیم بندی بر اساس شماره است نه رنگ
۳ ماژول به ۲
۴ ماژول به ۳
سلام
بله در صورتی که این ارور رو دریافت میکنید امکانش هست که یا در اتصال ماژول به آردوینو و سیمبندی ایرادی وجود داشته باشه و اگر از نحوه اتصال مطمئن هستید احتمالا مشکل از خود ماژول هست.
سلام اگر این مشکل رو دارید پین ها رو به انالوگ متصل کنید .
بهA0وA1با این تغییر در کد
SoftwareSerial mySerial(A0, A1);
منم همین مشکل رو داشتم با این کار درست شد.
رادمان مهدی پور
کانال اپارات اموزش های اردوینو و کد نویسی:
https://www.aparat.com/radmanmehdipour
لطفا دنبال کنید.
سلام وقت بخیر ، اگر بخواهیم به جای آیدی از یک نام استفاده کنیم باید چیکار کرد؟
سلام.
شما میتونید با استفاده از همین کد بعد از باز کردن سریال مانیتور، به جای عدد، اسم وارد کنید و مشکلی ازین بابت وجود نداره.
این ماژول ضرفیت ذخیره سازی ۱۰۰۰ عدد اثر انگشت را دارد وشماگفته اید یک عدد بین ۱ تا ۱۲۷ بنویسید آیامیشود برای انگشت هزارم نام انتخاب کرد
سلام.
در این کد نوشته شده فرض شده که فرد استفاده کننده تنها به ذخیره 128 اثر انگشت مختلف نیاز داره. شما میتونید تا عدد 1000 رو هم به عنوان ID استفاده کنید.
سلام خیلی ممنون
یعنی میتونم ۱۰۰۰ مدل مختلف ذخیره کنم
سلام
طبق دیتاشیت محصول ظرفیت حافظه تا 500 کد یا سمپل ثبت شده است
سلام اگر بخواهیم با یک کد فرایند ثبت وحذف اثر انگشت و تست رو انجام بدیم، ممکنه؟
سلام
بله امکان پذیر است.
سلام من الان سعی دارم یک پروژه با ماژول R308 و برد آردوینو درست کنم با این دو ارور همیشه مواجه میشم:
Arduino: 1.8.13 (Windows 7), Board: “Arduino Uno”
Sketch uses 990 bytes (3%) of program storage space. Maximum is 32256 bytes.
Global variables use 11 bytes (0%) of dynamic memory, leaving 2037 bytes for local variables. Maximum is 2048 bytes.
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
An error occurred while uploading the sketch
This report would have more information with
“Show verbose output during compilation”
option enabled in File -> Preferences.
واین ارور:
did not find fingerprint sensor 🙁
اگه میشه یکی بهم راهنمایی کنه ایراد ازکجاست؟
یه چیز دیگه سنسور اصلاروشن هم نمیشه نه درحالت اتصال ونه وقتی بخووتد اثرانگشت اسکن کنه.
با سلام
این ماژول ها به صورت نرمال هیچ چراغی بر رویشان روشن نمی شود. تا زمانی که ماژول تنظیم بشود.
مشکل اول شما عدم برقراری ارتباط بین سیستم خود و برد آردوینو شما می باشد. که در آپلود برنامه بر روی برد به مشکل میخورد.
مورد دوم شما نیز در بیشتر موارد عدم سیم کشی درست بین ماژول و برد می باشد.
سلام
من سه تا اثرانگشت روی این ماژول ذخیره کردم الان میخوام پاکشون کنم
با کدی که برای enroll هست اثرانگشت ها رو حذف میکنم
ولی وقتی با کد دوم که برای نمایش دادن آیدی اثرانگشت هست
همون اثرانگشت رو قرار میدم دوباره آیدی اثرانگشت رو پیدا میکنه ودرواقع پاک نشده
چیکار کنم؟
با سلام
با کد enroll فقط اثر انگشت تعریف می شود.
در همان لایبراری یک کدی قرار دارد به اسم delete و با ارسال ID مورد نظر ، اثرانگشت انتخابی پاک می شود، در صورتی که بخواهید کل اثرانگشت ها را حدف کنید می توانید از کد emptyDatabase استفاده کنید.
سلام مهندس این ماژول رو خرید کردم سیم بندی طبق شما بستم جریان مصرفی هم درسته حدود چهارصدم میکشه اما ال ای دی سبز که زمان گذاشتن انگشت فعال میشه رو ندارم فقط الی قرمز کم رنگ داخل روشن هست این طبیعیه ؟
با سلام
در صورتی که اثر انگشت شناسایی می شود بله درست هست.
رنگ چراغ هر مدل مختلف هست.
در صورتی که شناسایی نمیکند در بخش انجمن سوال را مطرح کنید و عکس از شدت نور نیز قرار بدهید.
سلام
مهندس چجوری میتونم بفهمم ماژولی که خرید کردم سوخته یا نه؟
با سلام
متاسفانه تا زمانی که دستور ها را به ماژول به درستی ارسال نشود امکان بررسی وجود دارد.
همچنین از روی مصرف برق سنسور نیز می توان متوجه شد که سنسور روشن شده است یا خیر.
همچنین توجه داشته باشید که رنگ سیم های سنسور با رنگ هایی که در عکس آمده است امکان دارد متفاوت باشد. در نتیجه سعی کنید با توجه به عکس pinout سنسور ببینید کدام سیم به کدام پین رفته است و همان را استفاده کنید.