Top 15 아두 이노 지문 인식 257 Most Correct Answers

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 아두 이노 지문 인식 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: 아두 이노 지문 인식 아두이노 지문인식 도어락, 지문인식 모듈, 라즈베리파이 지문인식, 지문인식 센서 가격, 아두이노 금고 키트, 지문인식센서 원리, 지문인식 원리, 아두이노 엑셀


[아두이노] 지문 인식 센서와 엑셀 연동하기 with LCDI2C, PLX-DAQ
[아두이노] 지문 인식 센서와 엑셀 연동하기 with LCDI2C, PLX-DAQ


아두이노 지문인식 키트 [SZH-ME005] / 디바이스마트

  • Article author: www.devicemart.co.kr
  • Reviews from users: 31887 ⭐ Ratings
  • Top rated: 3.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 아두이노 지문인식 키트 [SZH-ME005] / 디바이스마트 아두이노와 지문인식 센서를 이용한 지문 인식 키트 입니다. 지문을 등록하고 등록된 지문을 이용해 RELAY, LED, 서보 모터를 구동시키는 키트 입니다. …
  • Most searched keywords: Whether you are looking for 아두이노 지문인식 키트 [SZH-ME005] / 디바이스마트 아두이노와 지문인식 센서를 이용한 지문 인식 키트 입니다. 지문을 등록하고 등록된 지문을 이용해 RELAY, LED, 서보 모터를 구동시키는 키트 입니다. 디바이스마트 / 아두이노 지문인식 키트 [SZH-ME005] / 오픈소스/코딩교육 > 아두이노 > 교육용키트 / 디바이스마트 자체제작 / 아두이노와 지문인식 센서를 이용한 지문 인식 키트 / 지문인식센서를 이용한 알고리즘 이해아두이노 지문인식 키트 [SZH-ME005],디바이스마트,아두이노응용,아두이노키트,arduino,arduino kit,Arduino Uno,우노,지문인식키트,아두이노지문인식,코딩교육키트,아두이노,지문인식,키트,SZH-ME005,아두이노지문인식키트SZH-ME005,디바이스마트,자체제작,/,아두이노와,센서를,이용한,지문,인식,지문인식센서를,알고리즘,이해,디바이스마트자체제작/아두이노와지문인식센서를이용한지문인식키트/지문인식센서를이용한알고리즘이해,12375914,오픈소스/코딩교육 > 아두이노 > 교육용키트,디바이스마트
  • Table of Contents:
아두이노 지문인식 키트 [SZH-ME005] / 디바이스마트
아두이노 지문인식 키트 [SZH-ME005] / 디바이스마트

Read More

[아두이노 중급] 34-1. 지문 인식 센서(JM-101B)_ 프로그램 및 지문 등록 : 네이버 블로그

  • Article author: m.blog.naver.com
  • Reviews from users: 8496 ⭐ Ratings
  • Top rated: 3.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [아두이노 중급] 34-1. 지문 인식 센서(JM-101B)_ 프로그램 및 지문 등록 : 네이버 블로그 사실 지문인식에는 지문을 저장하고 비교하고 하는 다양한 동작이 필요하다. 그 동작을 아두이노에서 다하게 된다면 코딩도 사실 상당히 복잡할 것이고 그 … …
  • Most searched keywords: Whether you are looking for [아두이노 중급] 34-1. 지문 인식 센서(JM-101B)_ 프로그램 및 지문 등록 : 네이버 블로그 사실 지문인식에는 지문을 저장하고 비교하고 하는 다양한 동작이 필요하다. 그 동작을 아두이노에서 다하게 된다면 코딩도 사실 상당히 복잡할 것이고 그 …
  • Table of Contents:

카테고리 이동

~폴나의 공방~

이 블로그 
아두이노 중급
 카테고리 글

카테고리

이 블로그 
아두이노 중급
 카테고리 글

[아두이노 중급] 34-1. 지문 인식 센서(JM-101B)_ 프로그램 및 지문 등록 : 네이버 블로그
[아두이노 중급] 34-1. 지문 인식 센서(JM-101B)_ 프로그램 및 지문 등록 : 네이버 블로그

Read More

아두이노 지문인식 센서 사용하는 방법

  • Article author: diyver.tistory.com
  • Reviews from users: 39697 ⭐ Ratings
  • Top rated: 4.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 아두이노 지문인식 센서 사용하는 방법 지문인식센서를 보면 핀이 총 8개가 있는데,. 이 중에서 4핀만 사용한다. 자세히 보면 V+ 과 TX, RX, GND 가 몰려있는데. V+는 아두이노의 5V. …
  • Most searched keywords: Whether you are looking for 아두이노 지문인식 센서 사용하는 방법 지문인식센서를 보면 핀이 총 8개가 있는데,. 이 중에서 4핀만 사용한다. 자세히 보면 V+ 과 TX, RX, GND 가 몰려있는데. V+는 아두이노의 5V. <목표> – 스마트폰 보안이 지문으로 널리 쓰이고 있기 전에 이미 지문인식 센서는 존재했었다. 지금도 각종 보안장치에서 지문인식센서를 사용하고 있는데, 오늘은 그 지문인식 센서를 아두이노에서 어떻게 사용..
  • Table of Contents:

태그

관련글

댓글0

공지사항

최근글

인기글

최근댓글

태그

티스토리툴바

아두이노 지문인식 센서 사용하는 방법
아두이노 지문인식 센서 사용하는 방법

Read More

SAFE1 아두이노 지문인식센서 키트 조립방법 및 동작 | 싸이피아SCIPIA

  • Article author: scipia.co.kr
  • Reviews from users: 8570 ⭐ Ratings
  • Top rated: 4.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about SAFE1 아두이노 지문인식센서 키트 조립방법 및 동작 | 싸이피아SCIPIA 아두이노 우노보드와 지문인식센서, 릴레이모듈, 액티브부저를 이용한 지문이식센서 키트로서 각종 출입문 개폐 실습 및 출입통제시스템을 실습할 수 있습니다. …
  • Most searched keywords: Whether you are looking for SAFE1 아두이노 지문인식센서 키트 조립방법 및 동작 | 싸이피아SCIPIA 아두이노 우노보드와 지문인식센서, 릴레이모듈, 액티브부저를 이용한 지문이식센서 키트로서 각종 출입문 개폐 실습 및 출입통제시스템을 실습할 수 있습니다.
  • Table of Contents:

SAFE1 아두이노 지문인식센서 키트 조립방법 및 동작

1 특징 및 사전준비 사항

2 키트 구성품 리스트

3 아두이노 우노보드와 지문인식센서 연결

4 아두이노 우노보드와 릴레이 모듈 연결

4 아두이노 우노보드와 릴레이 모듈 연결

5 사용방법

제품구매 정보

Follow Us

SAFE1 아두이노 지문인식센서 키트 조립방법 및 동작 | 싸이피아SCIPIA
SAFE1 아두이노 지문인식센서 키트 조립방법 및 동작 | 싸이피아SCIPIA

Read More

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

  • Article author: devicemart.blogspot.com
  • Reviews from users: 44041 ⭐ Ratings
  • Top rated: 3.9 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [흥프로] 아두이노 지문 인식 센서 사용하기 Adafruit Fingerprint 예제를 사용할 수 있습니다. 가장 간단하고 쉽게 지문인식센서를 이용할 수 있는 방법이에요.!! 1. 라이브러리는 … …
  • Most searched keywords: Whether you are looking for [흥프로] 아두이노 지문 인식 센서 사용하기 Adafruit Fingerprint 예제를 사용할 수 있습니다. 가장 간단하고 쉽게 지문인식센서를 이용할 수 있는 방법이에요.!! 1. 라이브러리는 …
  • Table of Contents:

전선 선택 방법 전선 굵기 선정 규격별 허용전류 저항 전압강하 계산식

[전선] AWG 규격 – SQ(mm2) 스퀘어 규격 사이즈 변환표

◎ M-TAP 탭 가공치수 드릴작업 기초홀 작업치수 탭가공

오디세이로 BLDC모터 및 액추에이터 제어하기

전선 선택 방법 전선 굵기 선정 규격별 허용전류 저항 전압강하 계산식

[전선] AWG 규격 – SQ(mm2) 스퀘어 규격 사이즈 변환표

◎ 스터드볼트 (STUD Bolt)의 정의와 규격

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

Read More

아두이노 센서 R305 지문인식 B181 : 엘케이 > BRAND SHOP > MCU보드/제어모듈

  • Article author: www.icbanq.com
  • Reviews from users: 13305 ⭐ Ratings
  • Top rated: 3.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 아두이노 센서 R305 지문인식 B181 : 엘케이 > BRAND SHOP > MCU보드/제어모듈 아두이노 AS608 지문인식 센서 B181. -지문을 인식하여 구별하는 센서 모듈. -AS601 프로세서를 사용하며 TTL 시리얼 인터페이스 구성. -내부 메모리에 지문 정보를 … …
  • Most searched keywords: Whether you are looking for 아두이노 센서 R305 지문인식 B181 : 엘케이 > BRAND SHOP > MCU보드/제어모듈 아두이노 AS608 지문인식 센서 B181. -지문을 인식하여 구별하는 센서 모듈. -AS601 프로세서를 사용하며 TTL 시리얼 인터페이스 구성. -내부 메모리에 지문 정보를 … 지문을 인식하여 구별하는 센서모듈 – 19000원 국내 최대 전자부품 전문 쇼핑몰 – 아이씨뱅큐
  • Table of Contents:

아두이노 센서 R305 지문인식 B181

결제 및 주문

아두이노 센서 R305 지문인식 B181 : 엘케이 > BRAND SHOP > MCU보드/제어모듈” style=”width:100%”><figcaption>아두이노 센서 R305 지문인식 B181 : 엘케이 > BRAND SHOP > MCU보드/제어모듈</figcaption></figure>
<p style=Read More

COM SAFE1 아두이노 지문인식센서 실험 키트 스타터 – 인터파크

  • Article author: m.shop.interpark.com
  • Reviews from users: 48188 ⭐ Ratings
  • Top rated: 3.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about COM SAFE1 아두이노 지문인식센서 실험 키트 스타터 – 인터파크 5%할인, 추가 회원 중복 할인 쿠폰, 기타에 대한 상품입니다. …
  • Most searched keywords: Whether you are looking for COM SAFE1 아두이노 지문인식센서 실험 키트 스타터 – 인터파크 5%할인, 추가 회원 중복 할인 쿠폰, 기타에 대한 상품입니다. PC부품/주변기기, PC 주변용품, 기타, COM, SAFE1, 아두이노, 지문인식센서, 실험, 키트, 스타터3%할인, 추가 회원 중복 할인 쿠폰, 기타에 대한 상품입니다.
  • Table of Contents:

구매하기

포토 건

포토 건

이 상품을 본 고객이 같이 본 상품

코디하기 좋은 상품

추천 딜

싸이피아 스토어를 찜하면할인쿠폰을 드립니다

할인쿠폰이 발급되었습니다

추천순

청구할인 적용 방법

선택1 001_화이트

할인쿠폰변경

쿠폰받기

COM SAFE1 아두이노 지문인식센서 실험 키트 스타터 - 인터파크
COM SAFE1 아두이노 지문인식센서 실험 키트 스타터 – 인터파크

Read More

Arduino_지문_인식_출입_감지_시스템.md · GitHub

  • Article author: gist.github.com
  • Reviews from users: 28683 ⭐ Ratings
  • Top rated: 3.9 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about Arduino_지문_인식_출입_감지_시스템.md · GitHub DIY 지문 인식 도어락 · 지문 인식 센서에 사용자 지문 등록 · 지문 등록 과정이 끝나면 아래의 아두이노 파일을 업로드 · 작동중인 프로그램에 지문 검사를 하면 끝. · 출입 … …
  • Most searched keywords: Whether you are looking for Arduino_지문_인식_출입_감지_시스템.md · GitHub DIY 지문 인식 도어락 · 지문 인식 센서에 사용자 지문 등록 · 지문 등록 과정이 끝나면 아래의 아두이노 파일을 업로드 · 작동중인 프로그램에 지문 검사를 하면 끝. · 출입 … GitHub Gist: instantly share code, notes, and snippets.
  • Table of Contents:

DIY 지문 인식 도어락

Footer

Arduino_지문_인식_출입_감지_시스템.md · GitHub
Arduino_지문_인식_출입_감지_시스템.md · GitHub

Read More


See more articles in the same category here: https://chewathai27.com/to/blog.

아두이노 지문인식 키트 [SZH-ME005]

배송정보 배송방법 택배발송 ㆍ택배사 : 롯데택배 1588-2121 또는 기타 택배

ㆍ배송지역 : 전국 (제주 및 도서산간지역은 3,000원 추가 운임이 발생하며 일부 지역은 +@ 추가 비용이 발생 됩니다.)

ㆍ배송기간 : 영업일 기준 평균 1~3일 소요되며, 택배사 사정에 따라 달라질 수 있습니다. (주말/공휴일 배송기간 제외)

ㆍ무료배송 : 총 결제 금액이 배송비를 제외하고 66,000원(vat포함) 이상인 경우 무료배송 처리됩니다.

처리됩니다. ㆍ유료배송 : 롯데택배 출고 기준 2,700원(vat포함)

※ 무료/유료 배송의 경우 – 직배송, 타 택배 이용시 유료배송 비용은 변경됩니다.

※ 부피 및 무게가 10KG 이상, 총 합의 길이가 1.2M 이상 또는 배송 사정으로 인해 롯데택배 이외 타 택배로 출고될 수 있으며,

운송수단에 따라 배송비는 선불 또는 착불(고객 부담) 발생될 수 있습니다. 퀵 / 고속 / KTX / 방문수령 ㆍ결제시 배송 방법 변경 (네이버페이는 장바구니에서 변경하셔야 적용 됩니다.)

ㆍ퀵 비용은 구매자 부담(착불)으로 서울,인천,경기 일부지역에서만 가능한 서비스입니다.

ㆍ고속버스 : 일반 고속버스 탁송료 20,000원 / KTX : 탁송료 30,000원 – 구매자 부담이며 지역 및 이동 시간에 따라 오후 3시 이후 접수 건은 당일 탁송 어려울 수 있습니다.

ㆍ제품은 [본사-인천]에서 준비되며, 방문 수령 장소는 [본사-인천]과 [구로매장]에서 선택 가능합니다. 제품이 준비되고 별도 연락 받으신 이후 수령 가능하며,

결제 직후 수령은 불가합니다.

ㆍ상품 준비기간은 상품에 명시된 평균 준비기간에 따릅니다.

ㆍ업체 직배송 및 해외 구매대행 상품의 경우 본사에서 준비되지 않는 상품으로 수령방법 변경 불가합니다. 배송안내 1. 제품마다 평균 준비기간을 명시하고 있습니다.

(평균 준비기간은 발송일정이 아니며 상품을 준비하는 기간을 평균적으로 명시합니다. 제조사 입고처 사정에 따라 평균 준비기간은 변동됩니다.)

(평균 준비기간은 발송일정이 아니며 상품을 준비하는 기간을 평균적으로 명시합니다. 제조사 입고처 사정에 따라 평균 준비기간은 변동됩니다.) 2. 영업일 기준 오후 3시 이전 결제확인 된 주문 건은 당사 보유 재고 상품에 한하여 당일 출고 됩니다.

3. 1가지 이상 상품을 주문을 하신 경우 평균 준비기간이 가장 긴 상품의 준비기간에 맞춰 일괄 또는 나눔 발송 처리됩니다.

4. 일부 상품의 경우 재고 보유 상황에 따라서 평균 발송일에 다소 차이가 발생될 수 있습니다.

※ 사전에 재고 확인 후 주문한 경우라도 이미 재고 소진이 된 이후에는 상품 준비기간은 안내 받으신 날짜와 상관없이 변경됩니다.

반품/교환/취소 및

AS안내 취소 진행 안내 직접 취소 가능 – 주문접수 [결제 전-입금 전] 상태에서는 회원, 비회원 구분없이 디바이스마트 로그인 후 – 주문내역에서 ‘주문무효’ 처리를 통해 취소 가능합니다.

취소 접수 요청 – 결제완료 이후 의 상태에서는 고객 본인 취소가 불가한 상태로 반드시 디바이스마트 고객센터 또는 1:1문의 게시판 통해 취소 문의 부탁드립니다. 반품/교환/취소 및 AS안내 ㆍ제품 수령 후 7일(주말/공휴일 포함) 이내 다음 사항의 경우 반품/교환 가능합니다.

ㆍA/S 관련 문의는 업체마다 상이할 수 있으며, 해외 상품은 A/S 불가할 수 있습니다.

ㆍ주문 제작 상품, 절단 상품, 해외 배송 상품, 복사 가능 상품(서적,USB,소프트웨어,메일 전송 등), 일회성 상품의 경우 결제완료 후

반품/교환/취소 /AS 절대 불가합니다.

ㆍ초기 불량, 오배송이 판매자 귀책일 경우 왕복 택배비용은 판매자 부담입니다.

ㆍ모든 제품은 제조사, 공급 업체 사정 및 천재지변 등에 따라 단가 변동 및 품절/단종/대체 등 재고 소진이 발생될 수 있습니다. 반품/교환/취소 및 AS 가능 [O] ㆍ수령한 제품의 초기 불량, 파손, 오배송,상세페이지 내용 불일치 등으로 사용이 불가한 경우

ㆍ단순 고객변심으로 인한 접수 기간이 7일을 초과하지 않고 , 제품을 훼손 또는 파손 하지 않고 , 미개봉/미사용인 경우

ㆍ제품 초기 불량으로 의심 되어 수령일 기준 7일이내 고객센터 접수 후 불량 확인 되었을 경우 반품/교환/취소 및 AS 불가 [X] ㆍ제품 수령일 기준 7일(주말/공휴일 포함)이 초과한 경우

ㆍ제품 및 포장을 파손, 훼손 변형 시켜 재화의 가치를 하락시키거나 사용자 과실로 인해 불량이 발생한 경우

ㆍ디바이스마트에 사전 안내나 확인 없이 반품 또는 제품을 일방적으로 전달하여 당사로 보내는 경우

ㆍ주문 제작 상품, 절단 상품, 해외 배송 상품, 복사 가능 상품(서적,USB,소프트웨어,메일 전송 등), 일회성 상품의 경우에는 반품/교환/취소 /AS 절대 불가

제품 수령 후 7일 또는 30일을 초과하여 오배송/누락 배송/택배사 분실로 교환/반품/취소 또는 추가 배송을 요청하는 경우

ㆍ해외 수입 상품을 1개 이상 주문 후 일부 상품의 단가 변동 및 품절/단종/대체 등 재고 소진 등의 이유로 공급이 불가하게 되어

나머지 상품 취소/반품/ 교환등을 요청의 경우

ㆍ1회 이상의 반품/교환/취소를 진행하였으나 동일 내용을 지속적으로 2회 이상 접수하여 수령일 기준 30일을 초과하는 경우

ㆍ고객 동의 후 대체/ 교환/AS 등을 진행하였으나 제품에 대한 인지 부족 또는 고객 변심으로 취소요청하는 경우 일부 상품의 경우 반품 /교환/취소 및 AS불가

ㆍ오배송 또는 AS 요청 교환 기간이 초과 또는 사용 후 반품을 보내는 경우

[아두이노 중급] 34-1. 지문 인식 센서(JM-101B)_ 프로그램 및 지문 등록

이번에는 아두이노를 활용한 지문 인식 장치에 대해 이야기 해보려고 한다.

이전에 프로젝트 쪽에 올렸던 지문 인식 장치에 대한 것이기도 하니 참고하자.

( https://blog.naver.com/darknisia/222204861701 )

아마 이제 대부분 한번쯤은 써봤을 정도로 지문 인식이라는 것은 요즘 주변에서 쉽게 볼 수 있는 보안장치 중 하나다.

쉽게 생각해보면 항상 들고 다니는 스마트폰에서도 볼 수 있을 것이다.

그리고 일을 하시는 분이라면 결제 시스템이라던가 등록시스템에서 별도의 지문 인식 장치를 사용하는 사람들도 있다.

그런 것처럼 지문 인식은 쉽게 접할 수 있고 보안 장치를 이야기 할 때 빠지지 않고 등장하는 것 중 하나다.

지문 인식은 아마 스마트 폰의 스펙에 대해 관심이 많은 사람들이라면 그 원리에 대해 대략 알고 있을 것이다.

폰의 기종에 따라 잠금을 해제하는 지문 인식 방법이 조금씩 다르기 때문이다.

지문 인식 방법을 간단히 살펴보면 크게 광학식, 정전 용량식, 초음파식으로 나뉘게 된다.

먼저 광학식을 이야기하자면 우리가 주변에서 쉽게 볼 수 있는 방식이 이 광학식이다.

가시광선에 반사된 지문 영상을 획득하는 방식으로 카메라나 광학 스캐너를 이용한다.

쉽게 말해 강한 빛을 손 끝에 쏘아 지문 형태가 반사되면 그 이미지를 추출하는 방식이다.

LG 벨벳이 광학식 지문인식을 사용하고 있다.

정전 용량식은 지문의 굴곡을 활용하여 인식하는 방식이다.

정전 용량식은 매우 민감한 센서를 사용하며 100um이하로 촘촘한 전극 간격을 생성하고 그 위로 지문을 얹히면 지문의 들어간 부분과 나온 부분의 전기량 차이를 인식하여 이미지를 추출하게 된다.

현대 자동차의 보안장치로 정전 용량식 지문인식을 활용한다고 한다.

초음파식은 초음파 검사와 유사한 방법으로 초음파를 이용해 피부 표피층의 미세한 특징을 스캔하는 방식이다.

이 방식은 초음파의 일부 물체를 투과 할 수 있다는 장점을 활용하여 손가락의 물과 같은 일부 이물질이 묻은 상태라도 인식률이 높다.

그래서 차세대 지문 인식 방식으로 알려져 있기도 하다.

갤럭시 S21이 이 방식으로 지문 인식을 활용하고 있다.

이왕 지문 인식에 대해 공부하는 것이니 간단한 개념 정도는 알아두는 것이 좋을 것 같아 소개했다.

자, 그럼 우리가 사용 할 지문 인식 센서에 대해 알아보자.

우리가 쉽게 구할 수 있는 지문 인식 센서은 Adafruit, Seeed, DFROBOT의 센서들일 것이다.

위의 그림이 DFROBOT의 지문 인식 센서인 SEN0188 이다.

앞에서 언급한 3개의 회사 모두 형태는 동일하며 차이점은 센서에서 출력되는 데이터 선의 종류 정도가 차이가 있다.

그리고 방식 또한 짐작한 사람들도 있겠지만 대부분 광학식을 사용하고 있다.

정전 용량식의 센서도 판매를 하긴 하지만 구하기가 쉽지 않고 그건 모양이 좀 다르게 생겼다.

그래서 이 포스팅에서는 광학식을 사용하는 지문 인식 센서에 대해 포스팅 할 것이다.

아마 지문 인식 센서를 사용하기 위해서는 구입을 해야 될텐데 위에서 언급한 3개의 회사의 제품들을 검색을 해보면 사실 구입하기 꺼려 질 수도 있다.

지금 그림으로 표현된 DFROBOT의 센서의 가격이 보통 60,000원대에 판매가 되고 있다.

쉽게 테스트나 재미를 위해 구입하기에는 선뜻 꺼려지는 가격일 것이다.

그래서 그 대안이라고 할 수 있는 중국산 센서를 사용해 볼 것이다.

참고로 중국산 센서라고 해도 성능은 위의 3사의 제품과 거의 동일하고 사용법도 동일하니 다른 센서를 가지고 있다고 해도 같이 따라해도 된다.

중국산 센서는 JM-101B 센서로 가격은 15,000원대에 해당한다.

위의 그림이 JM-101B 센서인데 사실 생긴 모양은 큰 차이가 없다.

동작방법도 마찬가지다.

사실 지문인식에는 지문을 저장하고 비교하고 하는 다양한 동작이 필요하다.

그 동작을 아두이노에서 다하게 된다면 코딩도 사실 상당히 복잡할 것이고 그 처리 시간 또한 짧지는 않을 것이다.

다행히 앞에서 언급한 지문인식 센서들은 대부분 자체 컨트롤러를 가지고 있다.

꽤나 고성능 DSP 칩이 부착되어 있기 때문에 센서에서 측정되는 모든 이미지의 렌더링, 계산, 찾기 및 검색 기능을 수행 할 수 있다.

지문인식 또한 보통의 시중에 판매되는 센서만큼의 성능을 낼 수 있도록 500dpi의 해상도를 가지고 있다.

500dpi의 성능은 위의 그림으로 대략 비교를 할 수 있을 것이다.

또한 인식 시간에는 1초 이내의 시간 밖에 들지 않는다.

아무튼 시중에 판매되는 성능 정도는 낼 수 있다는 말이다.

동작 전압은 3~5V로 아두이노로 충분히 동작을 할 수 있는 센서다.

그리고 이 센서의 사용방법은 크게 2가지다.

우리가 사용할 아두이노와 같은 컨트롤러를 연결해서 사용하는 방법과 호환되는 프로그램을 이용하여 윈도우에서 바로 동작을 하든가 하는 방법이다.

두 방법의 차이는 아두이노를 활용한다면 저장되는 지문의 모양을 볼 수 없지만 프로그램을 활용하면 시중에 판매되는 지문인식 장치에서 볼 수 있는 지문의 모양을 볼 수 있다.

그래서 센서의 연결법도 2가지 방법이 있다.

센서의 연결부를 보면 총 연결선은 8개로 이루어져 있다.

(센서에 따라 핀맵이 다를 수 있으니 구입처에서 꼭 확인하자)

각각 연결선의 번호는 위의 그림을 기준으로 위에서부터 순서대로 1~8에 해당한다.

하지만 여기서 보면 알다시피 우리가 사용할 선은 사실 몇 개 없다.

전원선인 Vin과 GND는 당연히 연결해야 하고 시리얼(Serial) 통신을 활용할 것이면 Tx Rx 핀을 사용하면 되고 바로 컴퓨터에 연결 할 것이면 USB 핀인 D+ D-핀을 사용하면 된다.

다만 연결선이 조금 아두이노에 바로 연결하기에는 문제가 있다.

위의 그림과 같이 선이 아주 얇기 때문에 끝에 연장을 해주어야 한다.

아두이노에 연결할 때는 일반 점퍼선을 연결하면 되지만 USB로 바로 동작하기 위해서는 4핀 USB 커넥터에 연결해야 하는데 이게 일반적으로는 쉽지 않을 것이다.

그래서 일단은 이 포스팅에선 점퍼선을 연결하여 사용하는 방법에 대해 설명하겠다.

선은 위의 그림과 같이 연결했다.

아두이노를 활용할 것이기 때문에 1~4번 선만 필요하다.

그래서 4개의 선만 연장한 상태다.

그럼 이 선을 센서에 연결하고 본격적으로 사용해보자.

먼저 윈도우 프로그램을 활용해서 동작하는 방법을 간단히 살펴보자.

위의 그림은 참고사항이니 선 연결부는 잘 확인하고 하면 된다.

프로그램과 연동을 위해서는 원래 중간 USB to Serial 변환장치가 필요하다.

(사실 D+ D-를 바로 사용한다면 이 작업이 필요치 않다)

하지만 그런 장치가 없는 사람들이 대부분일테니 그럴 때는 위의 그림처럼 아두이노를 활용하면 된다.

먼저 아두이노 보드에 빈 코드를 업로드하자.

빈 코드라고 하면 아두이노 스케치를 새창으로 띄웠을 때 void setup() { } void loop() { }만 있는 상태를 말한다.

빈 코드를 올렸다면 이제 지문 센서를 연결하자.

전원선은 당연히 전원에 연결하고 Rx Tx는 교차 연결이 아니라 바로 연결하면 된다.

쉽게 말해 센서의 Rx 핀을 아두이노의 0핀에 Tx핀을 아두이노의 1번 핀에 연결하면 된다.

참고로 이와 같은 방식으로 동작 할 수 있는 보드는 아두이노 우노, 메가와 같이 USB to Serial 장치가 별도로 부착되어 있는 보드에만 활용할 수 있다.

레오나르도, 마이크로, 제로와 같이 메인 컨트롤러가 USB to Serial 역할을 함께 하는 경우에는 빈코드가 아닌 아래의 코드를 업로드 하고 사용해야 한다.

레오나르도 코드 void setup() { Serial1.begin(57600); Serial.begin(57600); }

void loop() { while(Serial.available()){ Serial1.write(Serial.read()); } while(Serial1.available()){ Serial.write(Serial1.read()); } }

그럼 이번엔 센서 사용을 위해 프로그램을 켜보자.

파일은 첨부된 것을 활용해도 되고 아래의 링크를 활용해도 된다.

( https://bc-robotics.com/shop/fingerprint-sensor-jm-101/ )

위의 링크로 들어가서 아래의 그림처럼 downloads에 있는 파일을 다운받으면 된다.

파일을 받아서 압축을 풀고 SFGDemo.exe 파일을 켜보면 아래의 그림과 같이 나타난다.

그림과 같이 프로그램이 나타나면 Open Device 버튼을 눌러 현재 연결된 아두이노의 포트를 선택하자.

그리고 JM-101B 센서는 기본 통신속도가 57600 baud이나 참고하자.

이후에는 Preview 체크 박스를 활성화시키고 Enroll 버튼을 통해 지문을 등록할 수 있다.

Con Enroll 버튼은 여러개의 지문을 한 번에 등록할 때 사용하는 버튼이다.

프로그램은 이 정도만 설명하고 넘어가겠다.

이 포스팅은 아두이노를 활용하는 것이니 말이다.

그럼 이제 아두이노를 활용하는 방법으로 넘어가자.

이번에는 아두이노의 시리얼 모니터를 활용해야 하기 때문에 센서의 RX TX핀을 각각 아두이노의 3번 2번 핀에 연결하자.

센서를 연결했으면 이번엔 코딩을 해보자.

코딩은 간단하게 라이브러리를 활용하자.

앞에서 이야기 했듯이 JM-101B 센서는 중국에서 만들어진 저가형 지문 인식 센서다.

그래서 이 센서는 기존의 Adafruit와 호환이 가능하게 만들어져 있다.

그럼 Adafrut의 라이브러리를 다운로드 받아보자.

먼저 아두이노 스케치를 켜고 라이브러리 관리를 들어가보자.

라이브러리 관리를 들어가면 이번에는 Adafruit fingerprint를 검색해보자.

검색하게 되면 하나의 라이브러리가 나타난다.

이 라이브러리를 설치하자.

라이브러리 설치가 끝나면 바로 사용해 볼 수 있다.

이번에는 라이브러리를 사용해서 지문 등록을 해보자.

위의 그림처럼 Adafruit fingerprint 라이브로러로 가서 enroll 예제를 불러와보자.

enroll 예제는 아래와 같다.

enroll 코드 /*************************************************** 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

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__) // 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) // Set up the serial port to use softwareserial.. SoftwareSerial mySerial(2, 3);

#else // data-on Leonardo/M0/etc, others with hardware serial, use hardware serial! // #0 is green wire, #1 is white #define mySerial Serial1

#endif

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(”

Adafruit 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); } }

Serial.println(F(“Reading sensor parameters”)); 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); }

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; }

return true; }

상당히 길어보이지만 사실 막상 들여다 보면 별 것 없는 코드다.

일단은 동작부터 해보자.

예제를 업로드하고 시리얼 모니터를 열어보자.

만약 시리얼 모니터에 그림과 같이 나타난다면 현재 센서를 찾지 못하고 있는 것이나 선 연결을 다시 확인하자.

제대로 연결이 됬다면 아래와 같이 나타난다.

그림과 같이 길게 쭉 내용이 나타나는데 뭐 중요한 것은 위의 2줄과 아래의 2줄 정도가 되겠다.

위의 2줄은 센서가 잘 연결되어 찾았다는 뜻이고 아래 2줄은 지문을 등록할 준비가 되었으니 지문을 저장 할 장소를 지정해 달라는 것이다.

그외의 가운데 내용은 현재 센서의 정보를 알려주고 있다.

지금은 이 부분은 필요없으니 넘어가도록 하자.

자 그럼 지문등록을 해야하는데 보면 총 1~127 번까지 지문을 등록할 수 있다고 되어있다.

하지만 알다시피 이 라이브러리는 adafruit의 지문인식 센서에 관한 내용이다.

실제 우리가 사용하는 지문 인식 센서는 스펙상 162개가 등록된다고 되어 있으니 참고하자.

자, 그럼 이번엔 지문을 등록해보자.

위의 그림과 같이 나타난 창에서 지문을 등록하고 싶은 번호를 지정하자.

그럼 3번에 저장을 해보자.

3을 입력하면 3번에 저장하겠다는 내용이 나타나고 지문이 인식되기를 기다린다.

그리고 지문을 인식하게 되면 손을 치워달라는 문구가 나탄난다.

지문 이미지의 변환이 완료되면 확인을 위해 다시 한 번 지문을 올려달라고 한다.

지문을 한 번 더 올려서 2개의 지문이 일치하면 지문이 해당되는 번호에 등록되게 된다.

이렇게 쉽게 지문을 등록 할 수 있다.

지문의 이미지 처리를 센서의 DSP가 다 처리하다 보니 사실 우리가 할 건 그다지 많지 않다.

통신을 통해 ‘지문 등록 할게’ 나 ‘지금 지문 비교해줘’ 정도의 명령만 내리는 것이다.

그리고 참고 사항으로 아 실수로 내가 같은 지문을 여러 개 등록하는 경우가 생길 것이다.

지문을 인식하는 것은 뒤에 할 것이지만 미리 이야기 하자면 같은 지문을 여러개 등록하게 되면 먼저 저장된 곳의 번호가 불려오게 된다.

엄지 손가락지문을 5번과 15번에 저장했다면 인식 할 때는 5번이 우선적으로 나타난다는 말이다.

거기다 지문이 저장되는 위치가 센서의 컨트롤러에 저장되다 보니 아두이노를 리셋하거나 코드를 다른 코드를 넣더라도 지문 정보는 계속 유지되게 된다.

뒤에서 마찬가지로 하겠지만 지문 정보를 삭제하기 위해서는 별도의 코딩을 통해 센서에 지문을 지워달라는 요청을 해야 한다.

자, 그럼 코드를 한 번 살펴보자.

기본적으로 예제 코드다 보니 간단하게 살펴보자.

일단 예제 코드 내에서 주석과 쓸데 없는 부분들을 지워보자.

코드 1 #include

SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

uint8_t id;

void setup() { Serial.begin(9600); while (!Serial); delay(100); Serial.println(”

Adafruit Fingerprint sensor enrollment”);

finger.begin(57600);

if (finger.verifyPassword()) { Serial.println(“Found fingerprint sensor!”); } else { Serial.println(“Did not find fingerprint sensor :(“); while (1) { delay(1); } }

Serial.println(F(“Reading sensor parameters”)); 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); }

uint8_t readnumber(void) { uint8_t num = 0;

while (num == 0) { while (! Serial.available()); num = Serial.parseInt(); } return num; }

void loop() { 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; }

return true; }

주석을 지웠는데도 사실 코드가 상당히 길다.

그럼 하나씩 살펴보자.

#include

SoftwareSerial mySerial(2, 3);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

uint8_t id;

void setup(){ Serial.begin(9600); while (!Serial); delay(100); Serial.println(”

Adafruit Fingerprint sensor enrollment”);

finger.begin(57600);

if (finger.verifyPassword()) { Serial.println(“Found fingerprint sensor!”); } else { Serial.println(“Did not find fingerprint sensor :(“); while (1) { delay(1); } }

Serial.println(F(“Reading sensor parameters”)); 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); }

위의 코드는 setup까지 코드를 가져온 것이다.

여기서부터 살펴보자.

처음엔 라이브러리를 불러왔고 그 다음에는 소프트웨어 시리얼을 설정해줬다.

아두이노 우노에서는 시리얼 핀이 모자라기 때문에 사용된 것이다.

여기서 하나 주목 할 점은 소프트웨어 시리얼이 사용됬는데 그 라이브러리는 따로 불러오지 않은 점이다.

이때 소프트웨어 시리얼의 라이브러리는 Adafruit_Fingerprint 라이브러리 안에서 불러오고 있기 때문에 이 코드에서는 따로 선언해 줄 필요가 없는 것이다.

그리고 다음으로 있는 코드가 아래의 코드다.

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial)

이 코드는 쉽게 말해 지문 인식 센서와 연동될 통신을 설정하는 것과 동시에 지문 인식 라이브러리에 사용될 인스턴스 변수 즉, 이름을 지어준다라고 생각하면 된다.

만약 위에 표시된 finger 자리에 넣고 싶은 이름이 있다면 그 이름으로 넣고 아래의 함수들도 그 이름으로 변경 하면 된다.

다음으로 넘어가 보자.

이번에는 간단한 id라는 변수가 선언되어 있는데 이 변수는 지문 등록을 할 때 선택하는 번호가 저장될 변수로 기억하면 된다.

그럼 setup을 살펴보자.

setup 안도 내용은 꽤 길게 나타나 있다.

먼저 통신 속도 설정이 있는데 Serial 통신, 아두이노와 컴퓨터 간의 통신은 속도를 9600 baud로 해두었다.

하지만 센서와의 통신에 사용될 통식속도는 57600 baud로 설정되었다.

finger.begin(57600)

JM-101b 센서는 기본 통신 속도가 57600으로 설정되어 있다.

그외에도 9600, 19200,28800, 38400 등의 통신 속도를 지원하니 참고하자.

if (finger.verifyPassword()) { Serial.println(“Found fingerprint sensor!”); } else { Serial.println(“Did not find fingerprint sensor :(“); while (1) { delay(1); } }

다음에는 지문 인식 센서를 확인하는 코드다.

finger.verifyPassword()

여기서 사용되는 위의 함수는 지문 인식 센서의 비밀번호를 확인하는 함수로 if 문에 나타난대로 비밀번호가 맞다면 Found ~ 의 내용을 띄우고 아니라면 센서를 찾지 못했다는 내용을 나타낸다.

이 부분에서 나타난 것처럼 사실 이 지문 인식 센서도 보안을 위해 비밀 번호를 설정 할 수 있다.

그리고 비밀 번호가 맞을 때만 동작하는 것이다.

처음 제품을 구입했을 때의 기본 비밀 번호는 0x000000에 해당한다.

사실 이때 확인 할 비밀번호는 앞의 함수에 나타난다.

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial, Password)

지금은 비밀번호가 0이라 생략되었다.

비밀번호를 변경하는 방법은 추후에 다시 이야기 하도록 하자.

자 그럼 다음 코드를 살펴보자.

Serial.println(F(“Reading sensor parameters”)); 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);

다음 코드는 더욱 간단하다.

이 코드의 핵심은 현재 센서의 파라미터를 읽어오는 것이다.

finger.getParameters()

읽어오는 파라미터는 통신속도, 센서의 주소 등등 7가지 정보를 나타낸다.

뭐 사실 우리가 사용할 때는 딱히 필요없는 부분이니 넘어가자.

다음은 loop문을 살펴보자.

사실 이 코드에서 loop문은 상당히 짧다.

대부분 별도의 함수로 나타냈기 때문이다.

void loop() { 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() ); }

loop문을 보면 처음에는 지문을 등록할 준비가 되었다는 내용과 등록할 번호(ID)를 적으라는 문구를 시리얼 모니터에 나타낸다.

그리고 그 이후에 있는 것이 readnumber() 함수다.

이 함수는 loop 문 바로 위에 정의되어 있다.

uint8_t readnumber(void) { uint8_t num = 0;

while (num == 0) { while (! Serial.available()); num = Serial.parseInt(); } return num; }

readnumber에서는 간단히 시리얼 모니터를 통해 글자를 읽어오는 것을 나타낸다.

이때 데이터를 읽어오는 함수로 사용된 시리얼 함수가 있다.

Serial.parseInt();

이 함수는 시리얼 모니터 상에서 입력되는 내용 중에 int 형태의 문자열을 불러오는 함수다.

만약 시리얼 모니터에 asd12라고 적는다면 이 중에서 12라는 숫자만 읽어오게 되는 것이다.

여기서 한 번 더 꼬아서 만약 a1s2라고 적는다면 아마 1과 2를 각각 읽어오게 될 것이다.

당연히 지문 등록 작업을 2번해야 한다.

아무튼 readnumber는 시리얼 모니터에서 입력되는 숫자를 읽어오는 함수에 해당한다.

그리고 읽어온 값은 id 변수에 저장된다.

다시 loop 문으로 돌아가보면 readnumber 이후에는 읽어 온 수를 시리얼 모니터에 나타내 주는 동작을 하고 이제 지문을 등록하는 함수를 불러오게 된다.

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; }

return true; }

getFingerprintEnroll 함수는 사실상 이 예제의 핵심이 되는 함수다.

지문을 등록하고 등록시 발생하는 오류에 대해 나타내는 내용이기 때문이다.

이 함수를 한 번 살펴보자.

getFingerprintEnroll 함수는 크게 3 부분으로 나뉘어져 있다.

먼저 첫 번째 지문 등록에 관한 내용이다.

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; }

사실 이 부분은 case 문 때문에 코드가 길어보이지만 내용을 이해한다면 코드가 긴 것이 아니라는 것을 알 것이다.

먼저 p라는 변수가 나오는데 이 변수는 후에 센서에 돌아오는 대답이 저장될 곳이다.

그럼 코드를 살펴보자.

코드의 첫번째 while 문 안을 보자.

가장 먼저 나타나 있는 함수가 있을 것이다.

finger.getImage()

이 함수는 센서에 손가락의 이미지를 촬영하도록 요청하는 함수다.

이 함수를 사용하면 상황에 따라 다른 값이 반환된다.

이때 반환되는 값들이 위의 코드에 나타나있는 case 문의 내용들이다.

반환 값 내용 FINGERPRINT_OK 이미지 촬영 성공 FINGERPRINT_NOFINGER 지문을 찾지 못함 FINGERPRINT_PACKETRECIEVEERR 센서와의 통신 에러 FINGERPRINT_IMAGEFAIL 촬영 중 이미지 에러

반환되는 내용은 위의 표와 같다.

그렇기 때문에 코드 상에서 나타나 있는 case 문의 내용들도 표를 바탕으로 나타나고 있다.

다음 사용된 함수를 살펴보자.

finger.image2Tz(1)

이 함수는 간단히 말해 지문을 등록하기 전 임시로 저장하는 함수다.

이미지를 feature template(특징 탬플릿)으로 변환하여 저장하게 되는데 저장공간은 1과 2 이렇게 2가지 공간이 있다.

추후에 2 이미지가 모두 저장이 되면 서로 비교하여 지문이 등록되게 된다.

이 함수 역시 다양한 값을 반환하게 된다.

반환 값 내용 FINGERPRINT_OK 이미지 변환 성공 FINGERPRINT_IMAGEMESS 이미지가 너무 지저분 함 FINGERPRINT_PACKETRECIEVEERR 센서와의 통신 에러 FINGERPRINT_FINGERPRINT_FEATUREFAIL 지문의 특징 확인 실패 FINGERPRINT_INVALIDIMAGE 지문의 특징 확인 실패

위의 표와 같은 값을 반환하게 된다.

이 또한 코드 상에 case문으로 나타나 있다.

이렇게 첫 번째 지문 등록이 끝나면 이제 두 번째 지문 등록이 남았다.

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; }

두 번째 지문 등록 역시 내용은 동일하다.

처음에는 손가락을 치워달라는 문구를 2초간 표시하고 다시 finger.getImage 함수를 통해 지문을 읽어온다.

그리고 지문을 성공적으로 읽어오면 지문 이미지를 feature template으로 변환하여 저장해준다.

이번에는 finger.image2Tz(2)에 저장하게 된다.

두 번의 지문의 feature template 모두 등록되었다면 이제 실제 지문이 저장될 차례다.

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; }

이제 실제 지문 정보가 등록 될 차례다.

코드를 보면 먼저 저장될 장소를 다시 한 번 말해준다.

그리고 나오는 함수가 실제 지문 모델을 만드는 함수다.

finger.createModel()

이 함수는 앞서 finger.image2Tz() 함수로 저장된 2가지의 feature template을 활용하여 지문의 모델을 만들도록 요청하는 함수다.

저장되어 있는 2가지의 지문 특징을 활용하여 하나의 지문 정보를 만드는 것이다.

이 함수 또한 앞서 본 함수들과 마찬가지로 동작 결과에 따라 반환하는 값이 달라진다.

반환 값 내용 FINGERPRINT_OK 지문 모델 생성 성공 FINGERPRINT_PACKETRECIEVEERR 센서와의 통신 에러 FINGERPRINT_ENROLLMISMATCH 두 지문이 일치 하지 않음

이렇게 지문 모델이 완성이 되고 마지막으론 지문을 저장해야 한다.

finger.storeModel(id)

마지막으로 사용된 이 함수가 지문 모델을 저장 할 장소를 뜻한다.

그래서 괄호 안에 저장될 위치를 같이 넣어 줘야 한다.

마지막으로 이 함수의 반환 값은 아래와 같다.

반환 값 내용 FINGERPRINT_OK 지문 모델 저장 성공 FINGERPRINT_BADLOCATION 저장 위치 오류 FINGERPRINT_FLASHERR 플래시 메모리의 모델 저장 오류 FINGERPRINT_PACKETRECIEVEERR 센서와의 통신 에러

이렇게 지문 센서 JM-101B를 활용해 지문 등록하는 방법에 대해 알아보았다.

사실 이번 포스팅에서 지문 인식과, 지문 정보 삭제, 비밀번호 설정까지 다 하려고 했지만….

알다시피 내용이 너무 길어져 다음 포스팅으로 넘어가도록 하겠다.

이렇게까지 길어질 내용이 아니었는데 욕심이었나 싶은 생각도 든다…..

아두이노 지문인식 센서 사용하는 방법

<목표>

– 스마트폰 보안이 지문으로 널리 쓰이고 있기 전에 이미 지문인식 센서는 존재했었다.

지금도 각종 보안장치에서 지문인식센서를 사용하고 있는데,

오늘은 그 지문인식 센서를 아두이노에서 어떻게 사용할 수 있는지 다뤄보도록 하겠다.

<준비물>

– 아두이노(우노, 나노, 메가), 지문인식센서, 지문인식센서 용 케이블

<회로도>

지문인식센서를 보면 핀이 총 8개가 있는데,

이 중에서 4핀만 사용한다.

자세히 보면 V+ 과 TX, RX, GND 가 몰려있는데

V+는 아두이노의 5V

TX는 아두이노의 2번핀

RX는 아두이노의 3번핀

GND는 아두이노의 GND핀에 연결해주면 된다.

연결된 모습은 위와 같다.

<코드 및 실행결과>

아두이노에서 라이브러리를 설치해야 한다.

라이브러리 매니저를 실행시키고 검색어에 finger 만 입력해도 설치해야 할 라이브러리가 잘 뜨는 것을 확인할 수 있다.

Adafruit Fingerprint Sensor Library 를 설치하면 된다.

아두이노에서 예제를 살펴보면 추가한 라이브러리의 예제가 생성된 것을 확인할 수 있다.

예제들 중에서 사용할 예제는 총 3개로,

enroll – 지문 저장

fingerprint – 지문 인식

delete – 지문 삭제

가 되겠다.

지문 저장부터 해보도록 하자.

enroll 예제를 열고 업로드를 해주도록 한다.

업로드 후에 시리얼모니터를 띄우고

숫자 1을 입력하여

1번 저장공간에 지문 하나를 등록해준다.

이렇게 저장된 값은 센서 자체에 저장이 되기 때문에, 아두이노 전원이 꺼져도 데이터가 저장되게 된다.

이번에는 fingerprint 예제를 아두이노에 업로드 해주도록 한다.

이 예제의 경우 센서에 저장되어있는 지문 값과 일치하는지 보여주는 것이 전부라고 할 수 있다.

센서에 등록된 손가락을 인식시키면 매치되는 ID가 뜨면서 저장된 값이라고 알려준다.

저장되지 않은 다른 지문을 읽힌 경우에는 일치하지 않는다고 결과를 띄워준다.

마지막으로 delete 예제를 살펴보도록 하자.

예제 파일명 그대로 등록된 지문을 지워주는 역할을 한다.

시리얼 모니터에서 지문 번호를 입력하면 해당 지문 데이터가 지워지게 된다.

그런데 약간 의아한 점이 있다.

바로, 저장조차 하지 않았던 지문 번호라도 Deleted! 라고 결과값이 뜨면서 제거가 되었다고 알려준다…

등록할 수 있는 지문 저장 가능 개수를 파악하려면 사용자가 직접 코딩을 해야 할 것으로 보인다.

/*************************************************** 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 #if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__) // 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) // Set up the serial port to use softwareserial.. SoftwareSerial mySerial(2, 3); #else // On Leonardo/M0/etc, others with hardware serial, use hardware serial! // #0 is green wire, #1 is white #define mySerial Serial1 #endif 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(”

Adafruit 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); } } Serial.println(F(“Reading sensor parameters”)); 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); } 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; } return true; }

/*************************************************** 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 #if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__) // 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) // Set up the serial port to use softwareserial.. SoftwareSerial mySerial(2, 3); #else // On Leonardo/M0/etc, others with hardware serial, use hardware serial! // #0 is green wire, #1 is white #define mySerial Serial1 #endif Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); void setup() { Serial.begin(9600); while (!Serial); // For Yun/Leo/Micro/Zero/… delay(100); Serial.println(”

Adafruit finger detect test”); // set the data rate for the sensor serial port finger.begin(57600); delay(5); if (finger.verifyPassword()) { Serial.println(“Found fingerprint sensor!”); } else { Serial.println(“Did not find fingerprint sensor :(“); while (1) { delay(1); } } Serial.println(F(“Reading sensor parameters”)); 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); finger.getTemplateCount(); if (finger.templateCount == 0) { Serial.print(“Sensor doesn’t contain any fingerprint data. Please run the ‘enroll’ example.”); } else { Serial.println(“Waiting for valid finger…”); Serial.print(“Sensor contains “); Serial.print(finger.templateCount); Serial.println(” templates”); } } void loop() // run over and over again { getFingerprintID(); 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.fingerSearch(); 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; }

/*************************************************** This is an example sketch for our optical Fingerprint sensor Designed specifically to work with the Adafruit Fingerprint sensor —-> 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 #if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__) // 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) // Set up the serial port to use softwareserial.. SoftwareSerial mySerial(2, 3); #else // On Leonardo/M0/etc, others with hardware serial, use hardware serial! // #0 is green wire, #1 is white #define mySerial Serial1 #endif Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); void setup() { Serial.begin(9600); while (!Serial); // For Yun/Leo/Micro/Zero/… delay(100); Serial.println(”

Delete Finger”); // 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); } } 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(“Please type in the ID # (from 1 to 127) you want to delete…”); uint8_t id = readnumber(); if (id == 0) {// ID #0 not allowed, try again! return; } Serial.print(“Deleting ID #”); Serial.println(id); deleteFingerprint(id); } uint8_t deleteFingerprint(uint8_t id) { uint8_t p = -1; p = finger.deleteModel(id); if (p == FINGERPRINT_OK) { Serial.println(“Deleted!”); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println(“Communication error”); return p; } else if (p == FINGERPRINT_BADLOCATION) { Serial.println(“Could not delete in that location”); return p; } else if (p == FINGERPRINT_FLASHERR) { Serial.println(“Error writing to flash”); return p; } else { Serial.print(“Unknown error: 0x”); Serial.println(p, HEX); return p; } }

Adafruit_Fingerprint_Sensor_Library.zip 2.29MB

라이브러리를 직접 다운하여 사용하고 싶은 경우에는 위의 파일을 다운받아 라이브러리에 추가하면 된다.

※ 궁금하시거나 질문사항이 있으시면 댓글로 작성해주시면 답변해 드릴 수 있는 부분에서 친절히 답변드리겠습니다!

So you have finished reading the 아두 이노 지문 인식 topic article, if you find this article useful, please share it. Thank you very much. See more: 아두이노 지문인식 도어락, 지문인식 모듈, 라즈베리파이 지문인식, 지문인식 센서 가격, 아두이노 금고 키트, 지문인식센서 원리, 지문인식 원리, 아두이노 엑셀

Leave a Comment