RFID태그를 활용하여 무선주파수(전파)를 통해 여러가지 정보를 주고받을 수 있는 장치.
교통카드, 학생증 겸용 카드, 연구실 및 회사 출입카드 등 여러곳에서 사용된다.
RFID모듈, 초음파 센서, 서보모터, 블루투스, LED, LCD를 이용한 스마트 도어락
RFID 모듈은 보통 3.3V에 연결시키지만, 조금이라도 깔끔하게 회로를 구성하고 싶어서 5V로 통일 시켰다.
오렌지보드를 기준으로 구성한 회로이기 때문에 블루투스 모듈이 따로 존재하지 않는다. 아두이노 우노를 사용한다면 블루투스 모듈을 연결해야 한다.
RFID 라이브러리를 설치해 ID를 등록한 뒤 실행해야 한다.
- RFID를 사용할 수 있도록 회로를 구성한다.
- MFRC522 검색, 설치
( 스케치 > 라이브러리 포함하기 > 라이브러리 관리 > 라이브러리 매니저 > )- 파일 > 예제 > MFRC522 > ReadNUID 클릭, 실행
- 고유 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, 블루투스 모듈 부분을 따로 함수로 만들었다.
안녕하세요. 이것을 따라하는 고등학교 2학년 학생입니다.
rfid 라이브러리 사용법에 관해서 자세히 설명해주실 수 있을까요?
답변해주시면 감사하겠습니다!