라즈베리파이 + NFC 리더 를 이용한 대문열기.
개요 : NFC리더를 통해 스마트폰 또는 RFID 태그 의 UID 를 읽어들여 등록된 UID 인지 검증 후 문을 여는 동작을 한다.장점 : 열쇠 없이 대문 열기
단점 : 정전시 집에 못들어감, 라즈베리파이에 문제 발생시 집에 못들어감.
하드웨어 준비
준비물 : 라즈베리파이 1개
PN532 NFC 리더 1개
NFC housing : 3D printing http://www.thingiverse.com/thing:845134
NFC housing 3D 프린트를 원하면 클릭!! 3D Print
NFC housing 3D 프린트를 원하면 클릭!! 3D Print
인터폰선(4선식) 인터폰 -> 대문 까지.
릴레이 : 1개
다이오드 : 1개
트랜지스터 BC337 : 1개
저항 1K옴 : 1개
그림1. 전체 회로도
릴레이 부분 확대 사진.
인터폰 에서 대문까지 인터폰선을 연결(본인 집은 약 35미터), 프린팅한 하우징에 PN532 Reader를 장착하고 대문 인터폰 주변에 부착함.
좀 멀어서 통신에 문제가 있지 않을까 걱정 했지만 잘 작동함.
코딩
NFC Library 설치 : http://gaeranking.blogspot.kr/2015/05/nfc.html 를 참조.
디렉터리 구조 :
실행파일
/usr/local/bin
/usr/local/bin/doornfc > NFC reader로 부터 수신대기.
/usr/local/bin/dooropen.py > GPIO 제어하고 문을 연다.
/usr/local/bin/dooropen > dooropen.py를 호출
/usr/local/bin/addnfc-uid.sh > NFC UID 정보 수집을 위한 script, 읽은 데이터는
/var/nfc/uid.data에 저장한다.
데이터파일
/var/nfc/uid.data > UID 정보를 보관하는 파일.
1. uid.data 파일 만들기
$ sudo mkdir /var/nfc
$ sudo touch /var/nfc/uid.data
$ sudo chown pi /var/nfc/uid.data
2. 실행 스크립트 작성.
$ cat dooropen.py
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(23, GPIO.OUT)
GPIO.output(23, True)
time.sleep(0.2)
GPIO.output(23, False)
GPIO.cleanup()
time.sleep(1)
print ("OK")
$ cat dooropen
sudo python /usr/local/bin/dooropen.py
$ cat addnfc-uid.sh
#!/bin/bash
echo "Touch your NFC Device to reader"
NFCUID=`nfc-poll | grep UID`
CHECK_DOUBLE=`grep "$NFCUID" /var/nfc/uid.data`
if [ ${#CHECK_DOUBLE} -gt 0 ] ; then
echo "Your UID is already registered"
else
echo "$NFCUID" >> /var/nfc/uid.data
echo "UID registered."
exit 0
fi
$ cat doornfc
#!/bin/bash
echo $$ > /var/run/doornfc.pid
while [ true ]
do
# Reading UID from NFC tag
RESULT=`nfc-poll|grep UID`
#echo NFC-READ:$RESULT
if [ ${#RESULT} -eq 0 ]; then
echo "no data from NFC Reader try again..."
else
CHECK=`grep "$RESULT" /var/nfc/uid.data`
echo CHECK-DB:$CHECK
echo LENGTH_OF_CHECK=${#CHECK}
if [ ${#CHECK} -gt 0 ]; then
dooropen
fi
fi
done
NFC등록
addnfc-uid.sh 를 실행 후 NFC Reader 에 스마트폰 또는 RFID 태그 접촉.
$ addnfc-uid.sh
Touch your NFC Device to reader
nfc_initiator_target_is_present: Target Released
UID registered.
cat /var/nfc/uid.data 에 방금 접촉한 태그의 UID가 등록 되었다.
릴레이 작동해 보기
등록된 UID 로 릴레이가 작동 하는지 확인해 보자. doornfc 를 실행.
$ /usr/local/bin/doornfc
NFC Reader에 스마트폰이나 RFID 태그 를 접촉 시키면 릴레이 에서 "딸깍" 하는 소리가 나면 정상 작동 하는것.