[ 아두이노 프로젝트 ] RFID 모듈(RC522)과 블루투스를 활용한 도어락 만들기

윤감자·2023년 3월 28일
0

RFID모듈을 활용한 도어락 만들기 🔒



RFID란?

RFID태그를 활용하여 무선주파수(전파)를 통해 여러가지 정보를 주고받을 수 있는 장치.
교통카드, 학생증 겸용 카드, 연구실 및 회사 출입카드 등 여러곳에서 사용된다.



만들어 볼 것

RFID모듈, 초음파 센서, 서보모터, 블루투스, LED, LCD를 이용한 스마트 도어락


동작

  • 등록된 카드를 리더기에 읽히면 서보모터가 부착된 문이 열리면서
    OPEN LED에 불이 켜지고, LCD 화면의 문구가 WELCOME! 에서 OPEN으로 변경된다.

  • 등록되지 않은 카드라면 LCD 화면에 등록되지 않은 카드라고 표시된다.

  • 초음파 센서가 물체를 감지하면 웰컴 LED에 불이 켜진다.

  • 휴대폰 앱을 통해 블루투스로도 문을 열고 닫을 수 있다.



회로

  • RFID 모듈은 보통 3.3V에 연결시키지만, 조금이라도 깔끔하게 회로를 구성하고 싶어서 5V로 통일 시켰다.

  • 오렌지보드를 기준으로 구성한 회로이기 때문에 블루투스 모듈이 따로 존재하지 않는다. 아두이노 우노를 사용한다면 블루투스 모듈을 연결해야 한다.



연결 사진






코드 🖥

RFID 라이브러리를 설치해 ID를 등록한 뒤 실행해야 한다.

RFID 라이브러리 사용법

  1. RFID를 사용할 수 있도록 회로를 구성한다.
  2. MFRC522 검색, 설치
    ( 스케치 > 라이브러리 포함하기 > 라이브러리 관리 > 라이브러리 매니저 > )
  3. 파일 > 예제 > MFRC522 > ReadNUID 클릭, 실행
  4. 고유 ID 확인
#include <SPI.h>    // RFID를 위한 SPI 라이브러리
#include <MFRC522.h>// RFID 라이브러리
#include <SoftwareSerial.h> //블루투스 라이브러리

#include <LiquidCrystal_I2C.h>
#include <Wire.h> //lcd사용 라이브러리

#include <Servo.h> //서보모터

//RFID
const int SS_PIN = 10;   //RFID SS(SDA:ChipSelect) PIN
const int RST_PIN = 9;   //RFID Reset PIN
MFRC522 rfid(SS_PIN, RST_PIN); //RFID 라이브러리

//LED
const int WELCOME = 8;
const int OPEN_LED = 7; 

//블루투스
SoftwareSerial BTSerial(4,5);

//초음파센서
const int TRIG = 3; //초음파 보내는거
const int ECHO = 2; //초음파 받는거

//서보모터
const int SERVO_PIN = 6; //서보 PIN
Servo myservo;      //서보 라이브러리

// 등록된 RF CARD ID
#define PICC_0 0xC3
#define PICC_1 0xB3
#define PICC_2 0xC0
#define PICC_3 0xB6

//LCD
LiquidCrystal_I2C lcd(0x27,16,2);


void setup() { 
  SPI.begin(); // SPI 시작
  rfid.PCD_Init(); // RF 모듈 시작
  BTSerial.begin(9600); //9600의 속도로 블루투스 통신 시작 
  lcd.init(); //lcd 초기화
  lcd.backlight(); //lcd 백라이트 키기
  lcd.print("Hello!!");

  //led 핀모드 설정
  pinMode(WELCOME, OUTPUT);
  pinMode(OPEN_LED, OUTPUT);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  //서보모터 설정
  myservo.attach(SERVO_PIN); //서보 시작
  myservo.write(0); //초기 서보 모터를 0도로 위치 시킴
}

void RFID() { 
  //카드가 인식 안되었다면 더이상 진행하지 말고 빠져나감
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  //RF카드의 ID가 인식 안되었다면 더이상 진행하지 말고 빠져나감
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  //PICC 타입 읽어오기
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  //MIFARE 방식이 아니라면 더이상 진행하지 말고 빠져나감
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    return;
  }

  //ID가 등록된 ID와 동일하다면
  if (rfid.uid.uidByte[0] == PICC_0 || 
      rfid.uid.uidByte[1] == PICC_1 || 
      rfid.uid.uidByte[2] == PICC_2 || 
      rfid.uid.uidByte[3] == PICC_3 ) {
 
    //openled 켜짐
    digitalWrite(OPEN_LED, HIGH);

    //lcd
    lcd.init();
    lcd.setCursor(2,0); //커서 위치 설정
    lcd.print("Open"); //open 출력

    //서보 90도로 이동
    myservo.write(70);
    //1초 대기
    delay(2000);
    //서보 0도로 되돌림
    myservo.write(0);

    delay(2000);
    lcd.init();
    lcd.print("Hello!!");
    digitalWrite(OPEN_LED, LOW);
  }
  
  else{
    //lcd
    lcd.setCursor(0,0); //커서 위치 설정
    lcd.print("This is an"); //미확인 카드라고 출력
    lcd.setCursor(0,1); //커서 위치 설정
    lcd.print("unconfirmed Card");
    delay(2000);
    lcd.init();
  }
  
  //종료
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
  //다시 시작!
}

//초음파 센서
void Ultrasonic() {
  long duration, distance;
  int standard_distance = 10;
  
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  //물체에 반사되어돌아온 초음파의 시간을 변수에 저장.
  duration = pulseIn (ECHO, HIGH); 

  //cm로 변환
  distance = ((340 * duration) / 10000) / 2;

  if (standard_distance > distance) {
    digitalWrite(WELCOME, HIGH);
  }
  else {
    digitalWrite(WELCOME, LOW);
  }
}

//블루투스 작동
void BT() {
    if (BTSerial.available()){
    char data = BTSerial.read();
    
    if(data == 'o'){
      
      lcd.init();
      lcd.setCursor(2,0); //커서 위치 설정
      lcd.print("Open"); //open 출력
      
      myservo.write(90); //서보 90도로 이동
      delay(2000); //2초 대기
      myservo.write(0); //서보 0도로 되돌림
      
      digitalWrite(OPEN_LED, HIGH);
      delay(2000);
      
      lcd.init();
      lcd.print("Hello!!");
      
      digitalWrite(OPEN_LED, LOW);
    }
  }
}
 
void loop() {

  //초음파 센서
  Ultrasonic();

  //rfid
  RFID();

  //블루투스
  BT();


}

가독성을 위해 초음파센서, RFID, 블루투스 모듈 부분을 따로 함수로 만들었다.



완성

profile
감자 대학생

2개의 댓글

comment-user-thumbnail
2024년 4월 1일

안녕하세요. 이것을 따라하는 고등학교 2학년 학생입니다.
rfid 라이브러리 사용법에 관해서 자세히 설명해주실 수 있을까요?
답변해주시면 감사하겠습니다!

1개의 답글