라즈베리파이를 이용한 FDX-B Reader

HeeRyun, Jin·2023년 4월 10일
1

Petmily

목록 보기
1/1

서론

최근 4학년 캡스톤 디자인과 관련하여 반려 동물과 관련된 서비스를 제작하고 있습니다.

반드시 SW + HW를 동시에 사용하는 서비스를 제작하라는 교수님의 엄명에 Solution Challenge 결과물을 재활용하려던 계획은 수포로 돌아가게 되었습니다.

주제로 며칠을 고민하던 찰나, 하나의 유튜브 영상이 눈에 들어오게 됩니다.

애옹

반려동물등록제도에 흔히 사용되는 ISO 11784/11785 규격의 RFID 칩을 인식하여 지정된 동물에게만 사료 커버를 열어주는 기기였습니다.
사료통을 분리함으로써 얻을 수 있는 이점엔 여러가지가 있지만 이 글에서는 생략하겠습니다.

어찌되었든 "해당 기기를 개선하여 다양한 기능을 추가해보자!"라는 생각에 무작정 주제를 선정하고 기기 제작에 뛰어들게 되었습니다.
팀명은 Pet + Family -> Petmily 라는 귀여운 이름으로 결정되었습니다.

본 게시글에서는 가장 앞서 FDX-B를 라즈베리 파이에 연결하는 과정을 서술하고 있습니다.

Reader, Chip 구매

먼저 해야 할 일은 Global 규격의 Reader와 Chip을 구매하는 일이었습니다.
빠른 배송을 위해 국내 여러 판매처에서 구매를 시도한 결과.. 모두 재고가 없다는 답변을 받았습니다. 결국 믿음과 신뢰의 AliExpress의 힘을 빌리게 되었습니다.

요로코롬 귀엽게 생긴 Reader와 Chip을 구매하였습니다.
알리 5일 배송 시대에 한 달 남짓 걸려서 제품을 받았습니다...

Raspberry Pi 4와 연결

라즈베리와 연결하기에 앞서 판매자가 올려준 Spec Sheet(를 가장한 글자 모음)를 확인합니다.

요약
spec : ISO 11784/11785 134.2KHz
pin : GND(1) / VCC(2) / TXD(4)
data : start(1byte) + fixed(3byte) + country(2byte) + tag(5byte) + checksum(1byte) + end(1byte)

Spec Sheet를 확인했다면 엉성하게나마 납땜을 하고 라즈베리에 연결해줍니다.

라즈베리 기본 RX핀은 블루투스에 사용되므로, 블루투스를 활용할 계획이 있다면 UART를 추가적으로 활성화 시켜줘야 합니다. UART 활성화 관련 게시글

Python 코드 작성

연결했다면 RX핀에서 데이터를 받아오기 위한 코드를 작성합니다.

먼저 시리얼 통신을 위한 관련 라이브러리를 설치해줍니다.
pip install serial pyserial

이후 간단한 테스트 코드를 작성해봅니다.

import time
import serial

port = serial.Serial("/dev/ttyAMA1", 9600)
print("Port Open\n")

while True:
    read = port.read_all()

    if read != b"":
        read_hex = read.hex()
        print(f"read = {read}")
      
--------------------------------------------------------
결과

Port Open

read = b'\xaa\x0f\x08\x00\x03\x842\x0fe\xa4\xa6\xda\xbb'
read = b'\xaa\x0f\x08\x00\x03\x842\x0fe\xa4\xa6\xda\xbb'
--------------------------------------------------------

정상적으로 Chip을 인식하는 것을 확인할 수 있었습니다.

이후 오류 검증을 위한 CheckSum 코드를 추가해주었습니다.

0F(XOR)08(XOR)00(XOR)03(XOR)84(XOR)12(XOR)DB(XOR)FA(XOR)E7(XOR)D5 == CheckSum

import serial

port = serial.Serial("/dev/ttyAMA1", 9600)
print("Port Open\n")

while True:
    read = port.read_all()

    # 1byte start(AA) + 10byte data (3byte fixed + 2byte country + 5byte tag)
    # + 1byte checksum + 1byte end(BB)
    if read != b"":
        read_hex = read.hex()
        print("read = " + ' '.join(read_hex[i:i + 2] for i in range(0, len(read_hex), 2)))

        # calculate Check Sum
        calc_sum = 0x0f ^ 0x08 ^ 0x00 # fixed data
        for i in range(8, 22, 2):
            calc_sum = calc_sum ^ int(read_hex[i:i+2], 16)
        
        print(f"check_sum = {read_hex[22:24]}, calculated_check_sum =", "%x" % calc_sum, "\n")
        
--------------------------------------------------------
결과

Port Open

read = aa 0f 08 00 03 84 32 0f 65 a4 a6 da bb
check_sum = da, calculated_check_sum = da 
--------------------------------------------------------

결론

간단하게나마 FDX-B Reader를 라즈베리 파이에 연결하는 방법을 알아보았습니다.

항상 아두이노만 사용하다가 처음으로 라즈베리를 사용하려 하니 익숙치 않아서 어려움이 많은데(데이터를 받아오는 것과 어떻게 활용해야 할지..) 프로젝트를 진행하며 적응되길 바라고 있습니다.

profile
Mobile FE 개발자를 꿈꾸는 사람

0개의 댓글