راه اندازی ماژول اثر انگشت ZFM60 با آردوینو :
یکی از مهمترین ماژول های بیومتریک ، ماژول های اثر انگشت می باشند . از ماژول های اثر انگشت در سیستم هایی که به تایید هویت کاربر نیاز دارند استفاده می شود . سیستم هایی مانند اکسس کنترل ها و سیستم های حضور و غیاب . به طور کلی ماژول های اثر انگشت دارای دو نوع تکنولوژی خازنی و اپتیکال هستند . در ماژول های اثر انگشت خازنی ، از یک صفحه تاچ خازنی جهت اسکن اثر انگشت استفاده می شود . مدل های اپتیکال مکانیزم ساده تری دارند . در مدل اپتیکال از اثر انگشت شخص تصویر برداری می شود . در این ماژول ها اغلب از یک سطح شفاف جهت قرار گرفتن انگشت شخص بر روی آن استفاده می شود به طوریکه توسط یک منشور تصویر صفحه شیشه ای بر روی یک دوربین بازتاب داده می شود . در این مدل ماژول ها یک میکروکنترلر وظیفه پردازش تصویر اثر انگشت را بر عهده دارد که در نهایت یک عدد خاص برای هر اثر انگشت در نظر خواهید گرفت . ماژول ZFM60 نیز یک ماژول اثر انگشت اپتیکال است . در ماژول ZFM60 یک لنز 256 در 288 پیکسلی وظیفه تصویر برداری از اثر انگشت کار بر را بر عهده دارد . همچنین این ماژول دارای رابط ارتباطی UART می باشد لذا به ذاحتی می توان آن را به آردوینو متصل نمود . علاوه بر این نیز قابلیت ذخیره تا 100 کار بر را دارد .
پین های ماژول :
این ماژول دارای چهار سیم رنگی است که ترتیب هر کدام به شرح زیر می باشد :
1- سیم سبز پین RX ماژول
2- سیم سفید یا زرد پین TX ماژول
3- سیم مشکی GND مازول
4- سیم قرمز ولتاژ تغذیه ماژول
نحوه اتصال به آردوینو :
برای برنامه این که در پایان این آموزش قرار داده شده است سیم های ماژول را به صورت زیر به برد آردوینو خود متصل کنید :
1- TX ماژول یا همان سیم سفید/زرد را به پین شماره 2 آردوینو متصل کنید .
2- پین RX یا همان سیم سبز ماژول را به پین شکاره 3 آردوینو متصل کنید .
3- پین های Vcc و GND را به ترتیب به پین های +5V و GND آردوینو متصل کنید .
برنامه آردوینو :
#include <SoftwareSerial.h> #include <FPM.h> /* Enroll fingerprints with direct control of sensor LED * So far, only works with ZFM60 modules */ /* pin #2 is IN from sensor (GREEN wire) * pin #3 is OUT from arduino (WHITE/YELLOW wire) * Black Wire is GND * Red Wire is +5 Vcc */ SoftwareSerial fserial(2, 3); FPM finger(&fserial); FPM_System_Params params; void setup() { Serial.begin(9600); Serial.println("ENROLL + LED test"); fserial.begin(57600); if (finger.begin()) { finger.readParams(¶ms); Serial.println("Found fingerprint sensor!"); Serial.print("Capacity: "); Serial.println(params.capacity); Serial.print("Packet length: "); Serial.println(FPM::packet_lengths[params.packet_len]); } else { Serial.println("Did not find fingerprint sensor :("); while (1) yield(); } /* just to find out if your sensor supports the handshake command */ if (finger.handshake()) { Serial.println("Handshake command is supported."); } else { Serial.println("Handshake command not supported."); } } void loop() { Serial.println("Send any character to enroll a finger..."); while (Serial.available() == 0) yield(); Serial.println("Searching for a free slot to store the template..."); int16_t fid; if (get_free_id(&fid)) enroll_finger(fid); else Serial.println("No free slot in flash library!"); while (Serial.read() != -1); // clear buffer } bool get_free_id(int16_t * fid) { int16_t p = -1; for (int page = 0; page < (params.capacity / FPM_TEMPLATES_PER_PAGE) + 1; page++) { p = finger.getFreeIndex(page, fid); switch (p) { case FPM_OK: if (*fid != FPM_NOFREEINDEX) { Serial.print("Free slot at ID "); Serial.println(*fid); return true; } case FPM_PACKETRECIEVEERR: Serial.println("Communication error!"); return false; case FPM_TIMEOUT: Serial.println("Timeout!"); return false; case FPM_READ_ERROR: Serial.println("Got wrong PID or length!"); return false; default: Serial.println("Unknown error!"); return false; } yield(); } } int16_t enroll_finger(int16_t fid) { int16_t p = -1; Serial.println("Waiting for valid finger to enroll"); finger.led_on(); while (p != FPM_OK) { p = finger.getImageNL(); switch (p) { case FPM_OK: Serial.println("Image taken"); break; case FPM_NOFINGER: Serial.println("."); break; case FPM_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FPM_IMAGEFAIL: Serial.println("Imaging error"); break; case FPM_TIMEOUT: Serial.println("Timeout!"); break; case FPM_READ_ERROR: Serial.println("Got wrong PID or length!"); break; default: Serial.println("Unknown error"); break; } yield(); } // OK success! p = finger.image2Tz(1); switch (p) { case FPM_OK: Serial.println("Image converted"); break; case FPM_IMAGEMESS: Serial.println("Image too messy"); return p; case FPM_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FPM_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FPM_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; case FPM_TIMEOUT: Serial.println("Timeout!"); return p; case FPM_READ_ERROR: Serial.println("Got wrong PID or length!"); return p; default: Serial.println("Unknown error"); return p; } Serial.println("Remove finger"); delay(2000); p = 0; while (p != FPM_NOFINGER) { p = finger.getImageNL(); yield(); } p = -1; Serial.println("Place same finger again"); while (p != FPM_OK) { p = finger.getImageNL(); switch (p) { case FPM_OK: Serial.println("Image taken"); break; case FPM_NOFINGER: Serial.print("."); break; case FPM_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FPM_IMAGEFAIL: Serial.println("Imaging error"); break; case FPM_TIMEOUT: Serial.println("Timeout!"); break; case FPM_READ_ERROR: Serial.println("Got wrong PID or length!"); break; default: Serial.println("Unknown error"); break; } yield(); } finger.led_off(); // OK success! p = finger.image2Tz(2); switch (p) { case FPM_OK: Serial.println("Image converted"); break; case FPM_IMAGEMESS: Serial.println("Image too messy"); return p; case FPM_PACKETRECIEVEERR: Serial.println("Communication error"); return p; case FPM_FEATUREFAIL: Serial.println("Could not find fingerprint features"); return p; case FPM_INVALIDIMAGE: Serial.println("Could not find fingerprint features"); return p; case FPM_TIMEOUT: Serial.println("Timeout!"); return false; case FPM_READ_ERROR: Serial.println("Got wrong PID or length!"); return false; default: Serial.println("Unknown error"); return p; } // OK converted! p = finger.createModel(); if (p == FPM_OK) { Serial.println("Prints matched!"); } else if (p == FPM_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FPM_ENROLLMISMATCH) { Serial.println("Fingerprints did not match"); return p; } else if (p == FPM_TIMEOUT) { Serial.println("Timeout!"); return p; } else if (p == FPM_READ_ERROR) { Serial.println("Got wrong PID or length!"); return p; } else { Serial.println("Unknown error"); return p; } Serial.print("ID "); Serial.println(fid); p = finger.storeModel(fid); if (p == FPM_OK) { Serial.println("Stored!"); return 0; } else if (p == FPM_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FPM_BADLOCATION) { Serial.println("Could not store in that location"); return p; } else if (p == FPM_FLASHERR) { Serial.println("Error writing to flash"); return p; } else if (p == FPM_TIMEOUT) { Serial.println("Timeout!"); return p; } else if (p == FPM_READ_ERROR) { Serial.println("Got wrong PID or length!"); return p; } else { Serial.println("Unknown error"); return p; } }