ویژگی های ماژول سنسور اثر انگشت R301T
ماژول اثر انگشت R301T ماژولی با دقت و سرعت عملکرد بالا، دارای الگوریتم تطبیق با کارایی عالی و همچنین یک تراشه ی فلش با ظرفیت بالاست. این سنسور بر مبنای پردازش تصویر اثر انگشت، تطبیق و جستجو در حافظه و انجام فرمان های مورد نظر، کار میکند . راه ارتباطی این ماژول با میکروکنترلر، سریال می باشد که در بادریت (Baud Rate) پیش فرض 57600 قرار داشته و امکان تغییر بادریت (Baud Rate) وجود ندارد. این ماژول قابلیت ذخیره سازی 1700 اثر انگشت را دارد.
معرفی پایه ها (Pinout) ماژول اثر انگشت R301T
ماژول سنسور اثر انگشت R301T دارای 6 پایه به شرح زیر است:
- 5V: تغذیه ماژول – 5 ولت
- GND: زمین
- RX: دریافت اطلاعات از طریق پروتکل سریال
- TX: ارسال اطلاعات از طریق پروتکل سریال
- Touch: خروجی لمس ماژول
پین اوت (Pinout) این ماژول را می توانید در تصویر زیر مشاهده کنید.
جهت دریافت دیتاشیت ماژول اثر انگشت R301T اینجا کلیک کنید.
R301T Fingerprint Module Datasheet
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
راه اندازی ماژول اثر انگشت R301Tبا آردوینو
گام اول: سیم بندی
مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
توجه
رنگ بندی سیم ها در مدل های مختلف امکان دارد متفاوت باشد، حتما از ترتیب پایه ها که در بالاتر آماده است استفاده کنید.
گام دوم: کد
ابتدا کتابخانه زیر را بر آردوینوی خود نصب کنید.
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;
}
}
پس از آپلود کد، سریال مانیتور دستگاه خود را باز کنید.
دستگاه منتظر وارد کردن یک عدد بین 1 تا 127 به عنوان 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;
}
پس از آپلود کد، سریال مانیتور را باز کنید. با هر بار قرار دادن اثر انگشت تعریف شده، کد ID آن اثر انگشت نمایش داده می شود.
Comments (13)
سلام . منظور از قسمت اول: پس از آپلود کد، سریال مانیتور دستگاه خود را باز کنید. دستگاه منتظر وارد کردن یک ID از سوی شما می باشد.چیست؟ چه کاری باید انجام دهیم؟
قسمت دوم کد چه کاری انجام دهیم؟
سلام.
بعد از اینکه کد رو آپلود کردین، تو نرمافزار آردوینو بخش سریال مانیتور رو باز کنید. سریال مانیتور رو میتونید از مسیر Tools -> Serial Monitor پیدا کنید. پس از اون شما باید اثر انگشتی که میخواید رو ثبت کنید. به این معنا که ابتدا یک عدد بین 1 تا 127 به عنوان ID وارد میکنید و بعد از اون اثر انگشت مربوطه رو روی ماژول قرار بدید و به این تریتیب ماژول، اثر انگشت رو ثبت میکنه. میتونید به تعداد 1 تا 127 عدد اثر انگشت ثبت کنید.
تو کد دوم، دیگه اثر انگشت ها و ID های اونها تعریف شده. تو این قسمت شما با لمس ماژول اثر انگشت، ماژول اثر انگشت رو اسکن میکنه و در صورتی که جزو اثر انگشتهای ثبت شده باشه، ID متناظر اون رو نمایش میده. در غیر این صورت پیامی با مضمون اینکه اثر انگشت پیدا نشد رو نشون میده.
سلام چطور میشه بعد از خوندن اثر انگشت نام و نام خانوادگی رو روی ال سی دی کاراکتری نمایش بده؟
سلام.
برای این کار میتونید از آموزشهای زیر که در رابطه با اتصال LCDهای کاراکتری به آردوینو و استفاده از اونها هست، کمک بگیرید.
https://thecaferobot.com/learn/using-1602-character-lcd-keypad-shield-arduino/
https://thecaferobot.com/learn/interfacing-character-lcd-display-modules-with-arduino/
https://thecaferobot.com/learn/interfacing-i2c-16×2-character-lcd-1602-display-module-with-arduino/
سلام این ماژول میتواند ۱۷۰۰ اثرانگشت را زخیره کند برای مثال چتور میتوان برای انگشت ۱۰۰۰ نام انتخاب کرد درصورتی که شما می گویید عددی بین ۱ تا ۱۲۷ برای انگشت انتخاب کنید
سلام
در این کد نوشته شده فرض شده که فرد استفاده کننده تنها به ذخیره 128 اثر انگشت مختلف نیاز داره. شما میتونید تا عدد 1700 رو هم به عنوان ID انتخاب کنید.
سلام
من متوجه نشدم آیا میتونم ۱۷۰۰ اثر انگشت مختلف را در این ماژول با همین کتاب خانه ذخیره کنم؟
فایل تصویری اثر انگشت ایا قابل انتقال بر روی حافظه جانبی یا مانیتور کامپیوتر بصورت فرمت عکس هست یا خیر یا فقط اطلاعات اثر انگشت بصورت کد ذخیره میشه؟
سلام وقتتون بخیر
بله همین ماژول میتونه دیتای عکس finger رو در قالب یک packet سریال به شما بده
برای این کار و نحوه انجام اون میتونید از لینک زیر کمک بگیرید
https://forum.arduino.cc/t/image-extraction-from-fingerprint-sensor/1034434/7
فایل تصویری اثر انگشت ایا قابل انتقال بر روی حافظه جانبی یا مانیتور کامپیوتر بصورت فرمت عکس هست یا خیر یا فقط اطلاعات اثر انگشت بصورت کد ذخیره میشه؟
بعبارتی من میخوام فایل خروجی رو در نزم افزار خودم پردازش کنم
و فقط اسکن میخوام
سلام خیلی ممنون
یعنی من میتونم ۱۷۰۰ نفر را در این ماژول با همین کتاب خانه ذخیره کنم (البته با آیدی نه شماره )
درسته ؟
با سلام باید کد لایبراری را نیز برای این موضوع مقداری تغییر بدهید. یا از کتابخانه دیگری استفاده کنید فگر میکنم این کتابخانه محدودیت داشته باشد.
id همان شماره ای می باشد که شما به دستگاه میدهد.
سلام اکر لطف کنید نحوه کار با کتاب خانه دیگر رو آموزش بدهید خیلی ممنون میشن