[흥프로] 아두이노 지문 인식 센서 사용하기



아두이노 지문 인식 센서 
알아보기 




안녕하세요~!!

구독자 여러뷴~

디바이스마트 엔지니어 흥프로 입니다~~!!~!

오늘의 포스팅은 !!!

지문 인식 센서 알아보기 입니다.~

여러분~!~!

제가 지문 인식 센서를 가져왔습니다.~!~!

이미 다양한 제조사에서 판매중이긴 합니다만....




DFROBOT 사

http://www.devicemart.co.kr/goods/view?no=1278682

디바이스마트,MCU보드/전자키트 > 센서모듈 > 기울기/진동/충격/터치 > 터치/지문/전도성,DFROBOT,Fingerprint Sensor [SEN0188], Arduino 호환 지문 모듈 / 전원 공급 장치 : DC 3.8V-7.0V / 치수 : 54 * 20 * 20.5 mm / 동작 전류 : 65mA


에서 판매 중이지만....

어찌 이렇게 비싸단 말이요!!!!!

그래서 제가 초특급 저렴이

중국산 광 지문 센서를 가져왔습니다.

짜잔!!!


MINGWUDUANZI 사의 JM 101 모델 입니다.!!!



상세 스팩입니다.!!

JM-101 Spec

공급 전압 : DC 3.3V~5V
공급 전류 : 작동 전류 : <60mA
피크 전류 : <60mA
지문 이미지 입력 ​​시간 : <1.0 초
창 영역 : 15.3x18.2mm
해상도 : 500dpi
USB / UART / Serial 통신 지원

저렴한데 어떤점이 다른지 모르겠어요!!!

상품 링크 먼저 확인하시고 사용 예시 올려볼께요!

http://www.devicemart.co.kr/goods/view?no=12169464

Adafruit Fingerprint 예제를 사용할 수 있습니다.

가장 간단하고 쉽게 지문인식센서를 이용할 수 있는 방법이에요.!!


 1. 라이브러리는 Adafruit_Fingerprint를 사용합니다. 



설치 후 예제를 보면 많이 있습니다.

저희는 3개만 사용합니다. (enroll, fingerprint, emptyDatabase)

2. enroll - 지문 정보 저장 하기.




enroll 업로드 후 시리얼 모니터 입니다.
1~127번까지 등록이 가능합니다.
10번에 등록을 해볼까요?


처음 인식 시키고 한번 더 인식 시키면 성공
(처음 지문과 두번째 지문이 일치 되지 않으면 등록이 안됩니다.)


 3. 예제 fingerprint 에서 지문 인식 확인하기.

제 지문 인식 센서에는 총 7종의 지문이 등록 되어 있네요.

스캔한 지문과 일치하는 지문의 등록번호를 
디스플레이해주며 일치된 데이터배열 수를 표시해줍니다. 



 fingerprint 수정해서 릴레이&LED 작동 시키기

동작 예시 입니다. 

아래 코드를 활용하여 원하시는 분야에 
적용 시켜서 사용하시길 바랍니다.

소스 코드에 대한 동작 원리에 대해서만 설명 하겠습니다.

지문이 인식되어 이전에 등록된 지문과 
일치하는 배열의 수가 100이상일때
릴레이와 LED 상태를 반전 시켜 줍니다. 
일치 하지 않으면 반전 시키지 않습니다.



그래도 소스 코드는 드려야죠!! ㅎㅎ
한번 보시고 분석해보세요! 
fingerprint예제에서 변화 된 곳은 얼마 없습니다.


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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*************************************************** 
  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
 ****************************************************/
int cont=0;
int red=5;
int blue=4;
int rele=7;
#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()  
{
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(7,OUTPUT);
  digitalWrite(rele,1);
  Serial.begin(9600);
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nAdafruit finger detect test");
  digitalWrite(red,1);
  // 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();
  
  digitalWrite(blue,cont);
  digitalWrite(red,!cont);
  digitalWrite(rele,!cont);
  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);
  if(finger.confidence >= 100){
  Serial.println("Identical" );
  cont=!cont;
   }
  else{
  Serial.println("retouch");  
  }
  Serial.println(cont);
  return finger.fingerID; 
}


어떠신가요!? 코드는 길고 무슨 말인지 모르겠지만!!!

아래의 동영상을 보시면 지문이 인식되면 변수하나를 반전 시켜서

각각의 digital out 을 반전 시켜서 ON/OFF 처럼 사용한겁니다.!!!

1 인식 -> A변수 = 1 -> Relay On / Red On / Blue Off
2 인식 -> A변수 반전 = 0 -> Relay Off / Red Off / Blue On 

이런식으로요! 릴레이에 dc 모터를 연결한다던가, 
DIO에 서보 모터를 연결한다던가 하면 잠금 장치로 사용 가능 하겠죠?




이번에 어떤 분이 문의를 하셨어요...
동작 원리나 해당 모듈에 
대한 자세한 내용을 알고 싶은데 
없어서 아쉽다고...
죄송해요 ㅠㅠ 전 거기까진... 
여러가지를 다 다뤄야 하는 입장이라 한 가지를 파고 들어가서 
자세하게 설명을 해 드릴 수가 없는 ㅠㅠㅠ

전 넓고 얇은 지식의 소유자입니다...ㅠㅠ

저는 어떤 원리로 동작하는지 보단.

'어떻게 하면 동작을 할까?' 
'고객님들이 어떻게 하면 쉽게 접근해서 구현 할 수 있을까?'

를 중요시 해서 

지문 인식 센서가 어찌 동작하는지, 
통신 프로토콜은 어떻게 구성되어있는지..
패킷은 어떻게 구성해서 던저야 하는지...는 몰라요 ㅎㅎ

제가 갖은 기초 지식으로 이것 저것 합쳐서 만들어 내는것. 

이후 최적화는 각 분야 연구원 분들이 하는 것이라고 생각합니다.

여러분도 부담 갖지 마시고 일단 구현 시켜보세요.

이후 어떻게 동작하는지 확인해도 늦지 않습니다.

괜히 어렵다고 분석하시다가 흥미를 잃지 마세요!!

항상 여러분의 도전을 응원합니다.

수고 하셨습니다

감사합니다!


이상 엔지니어 흥프로 였습니다.!








댓글 쓰기

2 댓글

  1. 올려주신 코드를 사용하여 컴파일을 진행했는데 Did not find fingerprint sensor 이라고 나오네요 어떻게 해야 할까요

    답글삭제
    답글
    1. 이런 경우는 대부분 접촉 불량입니다! Rx Tx이 점퍼로 안되어 있어서 피복을 약간 벗겨내고 더 둡겁게 해서 더 깊게 눌러 잘 연결 되게 넣어주세요! 그 위에 점퍼선이나 핀헤더를 이용해서 눌러주셔도 됩니다!

      삭제