본문 바로가기
ESP32

아두이노 ESP32와 지문 센서로 프로젝트 보안 강화하기

by 모빌리티키즈 2023. 10. 18.
728x90

제목: 아두이노 ESP32와 지문 센서로 프로젝트 보안 강화하기

소개:
프로젝트의 보안은 매우 중요합니다. 특히 민감한 정보나 제한된 접근을 요구하는 경우, 추가적인 보안 기능이 필요합니다. 이 글에서는 아두이노 ESP32와 지문 센서를 사용하여 프로젝트의 보안을 강화하는 방법에 대해 알아보겠습니다. "Secure Your Projects With Fingerprint Sensors and Arduino EPS32"라는 주제로 설명하겠습니다.

재료:

아두이노 ESP32 개발 보드

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
지문 센서 모듈 (예: Adafruit Fingerprint Sensor)
점퍼 와이어
컴퓨터 또는 노트북
USB 케이블
절차:

아두이노 IDE 설치: 컴퓨터에 아두이노 IDE를 다운로드하고 설치합니다. 이 소프트웨어를 사용하여 코드 작성과 업로드를 수행할 것입니다.
하드웨어 연결: 아두이노 ESP32 개발 보드와 지문 센서 모듈을 점퍼 와이어를 사용하여 연결합니다. 일반적으로 VCC, GND, RX, TX 핀을 연결해야 합니다.
라이브러리 설치: 아두이노 IDE에서 "Adafruit Fingerprint Sensor" 라이브러리를 설치합니다. 이 라이브러리는 지문 센서 모듈과의 통신을 용이하게 해줍니다.
코드 작성: 아두이노 IDE에서 새 스케치를 열고 다음과 같은 코드를 작성합니다.

#include <Adafruit_Fingerprint.h>

// Initialize the fingerprint sensor
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1);

void setup() {
  Serial.begin(9600);
  finger.begin(57600);
  
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }
}

void loop() {
  getFingerprintID();
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  
  if (p != FINGERPRINT_OK) return p;
  
  p = finger.image2Tz();
  
  if (p != FINGERPRINT_OK) return p;
  
  p = finger.fingerFastSearch();
  
  if (p != FINGERPRINT_OK) return p;

  // If a match is found, print the ID
   Serial.print("Found ID #"); 
   Serial.print(finger.fingerID); 
   Serial.print(" with confidence of "); 
   Serial.println(finger.confidence); 
  
   return finger.fingerID;
}

코드 업로드: 작성한 코드를 아두이노 ESP32 개발 보드에 업로드합니다.
테스트 및 활용: 시리얼 모니터 창을 열고 지문 센서에 등록된 손가락으로 스캔해보세요.
지문 인식 후 등록된 ID 및 일치하는지 여부가 시리얼 모니터에 출력됩니다.
출력 결과에 따라 프로젝트의 로그인 접근 제어 등 다양한 기능을 추가할 수 있습니다.

결론:
아두이노 ESP32와 지문 센서는 프로젝트의 보안 강화에 유용한 도구입니다.
위 단계들을 따라가며 간단하게 구현할 수 있으며, 손쉬운 사용법과 안정성으로 신원 인증 및 접근 제어 시스템 구축에 도움을 줄 수 있습니다.
더 나아가 필요한 경우 데이터베이스와 연동하여 복잡한 인증 및 권한 관리 시스템도 구현할 수 있습니다.
보다 안전하고 신속한 프로젝트 운영을 위해 이 기술들을 활용해보세요!

생체 인증은 오늘날 점점 더 보편화되어 향상된 보안과 편의성을 제공합니다. 가장 널리 사용되는 생체 인식 방법 중 하나는 지문 인식입니다.

이 기사에서는 Adafruit 지문 라이브러리를 사용하여 Arduino로 지문 센서를 구현하는 방법을 살펴보겠습니다. 마지막으로 지문 기반 보안 프로젝트를 만드는 방법을 알게 될 것입니다.

Adafruit 지문 라이브러리 이해

Adafruit 지문 라이브러리는 지문 센서, 특히 Adafruit 광학 지문 센서와 Arduino의 통합을 간소화합니다. 이 라이브러리는 센서와 Arduino 간의 통신을 간소화하여 애호가와 개발자가 지문 기반 프로젝트를 더 쉽게 만들 수 있도록 합니다.

 

공급

코드를 살펴보기 전에 다음 구성 요소가 준비되었는지 확인합니다.

      1. Arduino 보드(예: Arduino Uno 또는 Arduino Nano)
      2. Adafruit 광학 지문 센서
      1. https://link.coupang.com/a/bcRCN3
      2. "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
      3.  
      4. 점퍼 와이어
      5. Arduino IDE가 설치된 컴퓨터
      6. Adafruit 지문 라이브러리(Arduino 라이브러리 관리자에서 사용 가능)

1단계: 지문 센서 연결

다음과 같이 지문 센서를 Arduino에 연결합니다.

- VCC에서 5V로

- GND에서 GND로

- RX (센서) - 2 (Arduino)

- TX (센서) - 3 (아두이노)

 

2단계: Adafruit 지문 라이브러리 설치

  1. Arduino IDE를 열고 "스케치" -> "라이브러리 포함" -> "라이브러리 관리..."로 이동합니다.
  2. 라이브러리 관리자에서 "Adafruit 지문 센서 라이브러리"를 검색하여 설치합니다.

3단계: 센서에 손가락 등록

지문 센서에 지문을 등록하려면 일반적으로 향후 인증을 위해 센서의 메모리에 고유한 지문 패턴을 캡처하고 저장하는 일련의 단계가 포함됩니다. 다음은 Arduino와 함께 지문 센서(예: Adafruit 광학 지문 센서)를 사용하여 지문을 등록하는 방법에 대한 일반적인 가이드입니다.

메모: 이 예제에서는 지문 센서를 이미 Arduino에 연결하고 이 코드를 업로드하여 손가락을 등록했다고 가정합니다.

#include <Adafruit_Fingerprint.h>

// Create an Adafruit_Fingerprint object
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial);

void setup()  
{
  Serial.begin(9600);
  delay(100);
  Serial.println("Adafruit fingerprint sensor enrollment");

  // Initialize the fingerprint sensor
  if (!finger.begin(57600)) 
  {
    Serial.println("Couldn't find fingerprint sensor :(");
    while (1);
  }

  // Check if the sensor is connected
  if (finger.verifyPassword()) 
  {
    Serial.println("Found fingerprint sensor!");
  } 
  else 
  {
    Serial.println("Did not find fingerprint sensor :(");
    while (1);
  }
}

void loop()                     
{
  // Enroll a new fingerprint
  Serial.println("Place your finger on the sensor...");

  // Wait for a valid fingerprint
  while (! finger.getImage());
  Serial.println("Image taken");

  int result = finger.image2Tz(1);
  switch (result) 
  {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return;
    default:
      Serial.println("Unknown error");
      return;
  }

  // Prompt the user to remove and reposition the same finger
  Serial.println("Remove your finger and reposition it...");
  delay(2000);

  // Wait for the user to place the same finger again
  Serial.println("Place the same finger on the sensor again...");

  // Wait for a valid fingerprint
  while (! finger.getImage());
  Serial.println("Image taken");

  result = finger.image2Tz(2);
  switch (result) 
  {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return;
    default:
      Serial.println("Unknown error");
      return;
  }

  // Create a fingerprint template
  result = finger.createModel();
  if (result == FINGERPRINT_OK) 
  {
    Serial.println("Fingerprint enrolled successfully!");
  } 
  else 
  {
    Serial.println("Unknown error");
    return;
  }
}

이 코드는 일관성을 보장하기 위해 사용자의 지문을 두 번 캡처한 다음 템플릿으로 저장합니다.

직렬 모니터를 열고 단계에 따라 손가락을 등록합니다. 등록되면 이 템플릿을 지문 확인 및 액세스 제어에 사용할 수 있습니다.

4단계: 지문 인증

센서에 등록한 손가락을 인증하려면 다음 코드를 업로드해야 합니다.

/***************************************************
  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>


#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("\n\nAdafruit 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;
}

이제 직렬 모니터를 열고 센서에 손가락을 대십시오. 이미 등록된 손가락을 놓으면 발견된 손가락 일치가 표시됩니다. 그렇지 않으면 일치 항목을 찾을 수 없음이 표시됩니다.

이런 식으로 Arduino와 함께 지문 센서를 쉽게 사용할 수 있습니다.

728x90