아두이노 RFID 를 이용한 자동차 지문 시동시스템

2021. 8. 10. 19:44카테고리 없음

아두이노 RFID를 이용한 자동차 지문 시동 시스템

오늘날 대부분의 차에는 키리스 엔트리 및 푸시버튼 점화 시스템이 탑재되어 있어 키를 주머니에 넣고 다니기만 하면 되고 도어 핸들에 있는 정전 센서에 손가락을 대기만 하면 차 문을 열 수 있습니다. 이 프로젝트에서는 RFID와 지문 센서를 사용하여 이 시스템에 몇 가지 보안 기능을 추가하고자 합니다. RFID 센서는 사용자의 라이센스를 검증하고 지문 센서는 허가된 사람만 차량에 탑승할 수 있습니다.

이 지문 기반 자동차 점화 시스템은 R305 지문 센서와 EM18 RFID 판독기와 함께 아두이노를 사용하고 있습니다.

 

준비물

사용된 재료
아두이노 나노
R305 지문 센서
EM18 RFID 판독기
16*2 영숫자 LCD
DC 모터
L293D 모터 드라이버 IC
Veroboard 또는 Breadboard 중 사용 가능한 것
전선 연결
12V DC 배터리

 

EM18 RFID 판독기 모듈

RFID는 무선 주파수 식별을 나타냅니다. 디지털 데이터를 RFID 태그로 인코딩해 전파를 이용해 RFID 리더로 디코딩할 수 있는 기술을 말한다. RFID는 태그의 데이터가 장치에 의해 디코딩되는 바코딩과 유사합니다. RFID 기술은 보안 시스템, 직원 출석 시스템, RFID 도어락, RFID 기반 투표기, 통행료 징수 시스템 등 다양한 응용 분야에 사용됩니다.

EM18 Reader는 RFID 태그에 저장된 ID 정보를 읽을 수 있는 모듈입니다. RFID 태그는 12자리 고유 번호를 저장하며, 태그가 판독기와 함께 범위 내에 있을 때 EM18 판독기 모듈에 의해 디코딩할 수 있습니다. 이 모듈은 안테나가 내장된 125kHz 주파수로 작동하며 5V DC 전원 공급기를 사용하여 작동합니다.

직렬 데이터 출력을 제공하며, 8-12cm의 범위를 갖습니다. 시리얼 통신 파라미터는 데이터 비트 8개, 정지 비트 1개 및 보드 속도 9600입니다.

EM18 Features.

작동 전압: +45V ~ +5.5V DC
전류 소비량: 50mA
작동 주파수: 125KHz
작동 온도: 0~80°C
통신 보드 속도: 9600
판독 거리: 8-12cm
안테나: 내장

 

EM18 핀아웃:

핀 설명:

VCC: 4.5~5V DC 전압 입력

GND: 접지 핀

버저: 버저 또는 LED 핀

TX: RS232용 EM18의 직렬 데이터 송신기 핀(출력)

SEL: RS232(WEIGAND를 사용할 경우 낮음)를 사용하려면 이 값이 높아야 합니다.

데이터 0: WEIGAND 데이터 0

데이터 1: WEIGAND 데이터 1

RFID 및 태그에 대해 자세히 알아보려면 이전 RFID 기반 프로젝트를 확인하십시오.

아두이노를 사용하여 RFID 태그 고유 12자리 코드 알아보기
아두이노 차량 점화 시스템을 프로그래밍하기 전에 먼저 12자리 RFID 태그 고유 코드를 알아내야 합니다. 앞서 논의한 바와 같이 RFID 태그에는 12자리 고유 코드가 포함되어 있으며, RFID 리더를 사용하여 디코딩이 가능합니다. 판독기 근처에서 RFID 태그를 스와이프하면 판독기가 출력 직렬 포트를 통해 고유 코드를 제공합니다. 먼저 회로도에 따라 RFID 리더에 아두이노를 연결한 후 아래의 코드를 아두이노에 업로드합니다.

int count = 0;
char card_no[12];
void setup()
{
   Serial.begin(9600);
}
void loop()
{
   if(Serial.available())
   {
      count = 0;
      while(Serial.available() && count < 12)
      {
         card_no[count] = Serial.read();
         count++;
         delay(5);
      }
      Serial.print(card_no);
   }
}

코드를 성공적으로 업로드한 후 시리얼 모니터를 열고 보드 속도를 9600으로 설정합니다. 그런 다음 판독기 근처에 카드를 문지릅니다. 그러면 12자리 코드가 시리얼 모니터에 표시되기 시작합니다. 사용된 모든 RFID 태그에 대해 이 프로세스를 수행하고 나중에 참조할 수 있도록 기록해 두십시오.

회로 다이어그램
이 지문 기반 점화 시스템에 대한 회로 다이어그램은 다음과 같습니다.

제 경우 아래와 같이 Perf 보드의 전체 회로를 납땜했습니다.

지문 센서 모듈
핑거프린트 센서 모듈 또는 핑거프린트 스캐너는 지문 이미지를 캡처한 후 동등한 템플릿으로 변환한 후 아두이노에 의해 선택한 ID(위치)의 메모리에 저장하는 모듈입니다. 여기서 모든 과정은 아두이노가 지문 이미지 촬영, 템플릿으로 변환, 저장 위치 등 명령합니다.

우리는 이전에 투표기, 출석부, 보안 시스템 등을 만들기 위해 동일한 R305 센서를 사용했습니다. 지문 기반 프로젝트는 모두 여기에서 확인하실 수 있습니다.

센서에 지문 등록 중:

프로그램을 진행하기 전에 지문 센서에 필요한 라이브러리를 설치해야 합니다. 여기서는 R305 지문 센서를 사용하기 위해 "Adafruit_Fingerprint.h"를 사용했습니다. 먼저 아래 링크를 사용하여 라이브러리를 다운로드하십시오.

과일 지문 센서 라이브러리 
다운로드가 완료되면 Arduino IDE에서 파일 > 도구 > 라이브러리 포함 > .zip 라이브러리 추가로 이동한 다음 라이브러리를 설치할 zip 파일 위치를 선택합니다.

라이브러리 설치에 성공하면 아래 단계에 따라 센서 메모리에 새 지문을 등록합니다.

1. Arduino IDE에서 파일 > 예 > Adafruit 지문 센서 라이브러리 > 등록으로 이동합니다.

2. 코드를 Arduino에 업로드하고 직렬 모니터를 보드 속도 9600으로 엽니다.

중요: 프로그램의 소프트웨어 시리얼 핀을 소프트웨어 시리얼 mySerial(12, 11)로 변경합니다.

3. 지문을 저장할 지문의 ID를 입력해야 합니다. 첫 지문이라 왼쪽 상단에 1을 입력한 다음 보내기 버튼을 클릭합니다.

4. 그런 다음 지문 센서의 표시등이 깜박이며, 이 표시등은 손가락을 센서에 대야 하며, 그런 다음 등록이 성공했음을 인식할 때까지 직렬 모니터에 표시된 단계를 따릅니다.

 

RFID 키리스 점화용 프로그래밍
이 생체 점화 시스템에 대한 전체 코드는 튜토리얼 끝에 제공됩니다. 여기서 우리는 코드의 몇 가지 중요한 부분을 설명하고 있습니다.

첫 번째는 필요한 모든 도서관을 포함하는 것입니다. 제 경우에는 R305 지문 센서를 사용하기 위한 "Adafruit_Fingerprint.h"를 포함시켰습니다. 그런 다음 지문 센서가 연결될 직렬 포트를 구성합니다. 저의 경우 12는 RX 핀, 11은 TX 핀으로 선언하였습니다.

#include <Adafruit_Fingerprint.h>
#include <LiquidCrystal.h>
SoftwareSerial mySerial(12,11);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

다음 단계에서 코드 전체에서 사용될 모든 변수를 선언합니다. 그런 다음 LCD 연결 핀을 Arduino로 정의한 후 LiquidCrystal 클래스의 객체 선언을 수행합니다.

char input[12];
int count = 0;
int a = 0;
const int rs = 6, en = 7, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

다음으로, 루프() 안에 코드가 작성되어 RFID 태그의 고유한 12자리 코드를 가져오고 배열에 저장됩니다. 여기서 어레이의 요소는 메모리에 저장된 고유 코드와 일치하여 인증된 사용자 세부 정보를 가져옵니다.

count = 0;
    while (Serial.available() && count < 12)
    {
      input[count] = Serial.read();
      count++;
      delay(5);
    }

그런 다음 수신된 배열을 저장된 태그 코드와 비교합니다. 코드가 일치하면 라이센스가 유효한 것으로 간주되어 사용자가 유효한 지문을 입력할 수 있습니다. 그렇지 않으면 유효하지 않은 라이센스가 표시됩니다.

if ((strncmp(input, "3F009590566C", 12) == 0) && (a == 0))
      {
        lcd.setCursor(0, 0);
        lcd.print("License Valid         ");
        lcd.setCursor(0, 1);
        lcd.print("Welcome               ");
        delay(1000);
        a = 1;
        fingerprint();
      }

다음 단계에서는 함수가 핑거프린트를 가져옵니다.이미 등록된 지문에 대한 유효한 지문 ID를 반환하는 ID가 작성되었습니다.

int getFingerprintID()
{
  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;
  return finger.fingerID;
}

RFID 매칭 성공 후 호출되는 내부 기능 지문()을 가져옵니다.유효한 지문 ID를 얻기 위해 ID 함수를 호출합니다. 그런 다음 if-else 루프를 사용하여 인증된 사용자 데이터에 대한 정보를 가져오고 데이터가 일치하면 차량에 점화됩니다. 그렇지 않으면 잘못된 지문을 입력하라는 메시지가 표시됩니다.

int fingerprintID = getFingerprintID();
        delay(50);
        if (fingerprintID == 1)
        {
          lcd.setCursor(0, 0);
          lcd.print("Access Granted        ");
          lcd.setCursor(0, 1);
          lcd.print("Vehicle Started       ");
          digitalWrite(9,HIGH);
          digitalWrite(10,LOW);
          while(1);
        }

이렇게 RFID 자동차 점화 시스템이 작동하여 자동차에 두 층의 보안을 강화합니다.

CODE

#include <Adafruit_Fingerprint.h>
#include <LiquidCrystal.h>
char input[12];
int count = 0;
int a = 0;
const int rs = 6, en = 7, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
SoftwareSerial mySerial(12,11);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("   WELCOME TO       ");
  lcd.setCursor(0, 1);
  lcd.print("  CIRCUIT DIGEST       ");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Please swipe           ");
  lcd.setCursor(0, 1);
  lcd.print("Your License          ");
}
void loop()
{
  if (Serial.available())
  {
    count = 0;
    while (Serial.available() && count < 12)
    {
      input[count] = Serial.read();
      count++;
      delay(5);
    }
    if (count == 12)
    {
      if ((strncmp(input, "3F009590566C", 12) == 0) && (a == 0))
      {
        lcd.setCursor(0, 0);
        lcd.print("License Valid         ");
        lcd.setCursor(0, 1);
        lcd.print("Welcome               ");
        delay(1000);
        a = 1;
        fingerprint();
      }
      else if ((strncmp(input, "0B0028883E95", 12) == 0) && (a == 0))
      {
        lcd.setCursor(0, 0);
        lcd.print("License Valid         ");
        lcd.setCursor(0, 1);
        lcd.print("Welcome                ");
        delay(1000);
        a = 1;
        fingerprint();
      }
      else
      {
        if (a != 1)
        {
          lcd.setCursor(0, 0);
          lcd.print("License Invalid         ");
          lcd.setCursor(0, 1);
          lcd.print("Try Again!!!            ");
          delay(2000);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Please swipe           ");
          lcd.setCursor(0, 1);
          lcd.print("Your License          ");
        }
      }
    }
  }
}
int getFingerprintID()
{
  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;
  return finger.fingerID;
}
void fingerprint()
{
  finger.begin(57600);
        while(a==1)
        {
        int fingerprintID = getFingerprintID();
        delay(50);
        if (fingerprintID == 1)
        {
          lcd.setCursor(0, 0);
          lcd.print("Access Granted        ");
          lcd.setCursor(0, 1);
          lcd.print("Vehicle Started       ");
          digitalWrite(9,HIGH);
          digitalWrite(10,LOW);
          while(1);
        }
        else if (fingerprintID == 2)
        {
          lcd.setCursor(0, 0);
          lcd.print("Access Granted        ");
          lcd.setCursor(0, 1);
          lcd.print("Vehicle Started       ");
          digitalWrite(9,HIGH);
          digitalWrite(10,LOW);
          while(1);
        }
        else
        {
          lcd.setCursor(0, 0);
          lcd.print("Pls Place a        ");
          lcd.setCursor(0, 1);
          lcd.print("Valid Finger       ");
        }
        }
}