RFID-RC522 제어(아두이노)

in #kr-arduino6 years ago (edited)

RFID-RC522 제어(아두이노)



오늘은 RFID-RC522 모듈을 살펴보고자 합니다. 이 모듈은 일상에서 교통카드, 출입문 카드, 도어락 카드와 같은 것들을 아두이노상에서 표현할 수 있는 모듈입니다. 카드에 등록된 정보를 RFID-RC522 리더기가 읽고 그 읽은 값을 통해서 우리는 여러가지를 표현할 수 있습니다. RFID 모듈은 통신 방식이 SPI여서 좀 까다롭습니다. I2C 모듈이면 좀 더 사용하기가 편할 텐데 말이죠. 실험에서는 카드 인식에 문제가 생겨서 아래 사진에서 보는 것처럼 열쇠 고리 모양 같은걸로 간단히 실험을 하였네요. 이제부터서 RFID-RC522 모듈을 아두이노 핀에 어떻게 연결하고 코딩할 때 필요한 MFRC522 라이브러리를 설치에 대해서 알아본 뒤에 라이브러리드 안에 있는 DumpInfo 예제를 통해서 카드 정보를 읽는 실험을 하겠습니다.

1. RFID-RC522




출처 : Fritzing

RFID-RC522 모습은 위 출처가 링크 된 곳에서 다운로드 하신 후 Fritzing에 등록하셔서 디자인 하시면 됩니다. 핀 번호는 위에서 부터 아래로 순서대로 아래 표를 참조하시면 되겠습니다.

SPI 통신을 하기 때문에 아두이노의 핀과 RFID-RC522 핀을 위 표처럼 연결하시면 됩니다. 어떤 RFID 모듈은 I2C통신을 하는 모듈이 있는데 그럴 경우는 아날로그 핀 A4, A5으로 연결하셔서 실험하시면 됩니다. 자신이 사용하는 모듈은 어떤 방식인지를 우선 구별하시고 핀을 연결하시면 됩니다.

2. RFID-RC522 회로도


  • 준비물 : RFID-RC522, 아두이노우노
  • 내용 : SPI 통신을 할 수 있게 핀은 연결한다.

선 연결이 좀 복잡해 보이지만 위 표를 보시고 선을 연결하시면 어렵지 않을 거라 생각됩니다. 그래도 이해가 안되시면 아래 스케메틱 회로도를 보고 선을 연결하시면 되겠습니다.


출처 : Fritzing

3. RFID-RC522 라이브러리 추가


rfid로 검색하시면 되는데 직접 MFRC522로 검색어로 검색하셔도 됩니다. 아래처럼 검색이 되면 이 라이브러리를 설치하시면 됩니다.

4. 코딩



MFRC522

#include <SPI.h>
#include <MFRC522.h>
  • MFRC522 mfrc522(SS_PIN, RST_PIN) : MFRC522 인스턴스화
  • SPI.begin() :SPI bus 초기화
  • mfrc522.PCD_Init() : MFRC522 초기화
  • mfrc522.PICC_IsNewCardPresent() : 새카드 확인
  • frc522.PICC_ReadCardSerial() : 하나의 카드읽기 확인
  • rfid.uid.uidByte[] : 읽은 카드 키값이 들어 있음

miguelbalboa의 라이브러리 안에 위 함수들이 있는데 여러가지 함수들이 있는데 가장 기본적인 것만 설명하기 때문에 꼭 기억해 주세요. 저도 이 라이브러리를 사용하여 간단히 테스트를 했지만 따로 만들고 싶은 것이 없어서 그냥 간단히 테스트만 했네요. 제대로 RFIC-RC522를 사용하기 위해서는 링크된 라이브러리에 가셔서 코딩을 제대로 이해하시고 사용하실 수 있을 꺼에요.

MFRC522 라이브러리를 설치하면 여러개의 예제가 있는 데 한번씩 다 사용해서 어떤 결과가 나오는지 확인 해보시기 바랍니다.

여러 예제들 중에서 소스 코딩이 짧아보이는 DumpInfo라는 예제가 있습니다. 카드 정보를 읽어와서 출력하는 예제인데 이걸로 정상 작동하는지 살펴 볼께요.

[소스] MFRC522의 예제 중 DumpInfo( 출처 : miguelbalboa의 라이브러리)

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9          // Configurable, see typical pin layout above
#define SS_PIN          10         // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

void setup() {
    Serial.begin(9600);     // Initialize serial communications with the PC
    while (!Serial);        // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init();     // Init MFRC522
    mfrc522.PCD_DumpVersionToSerial();  // Show details of PCD - MFRC522 Card Reader details
    Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
    // Look for new cards
    if ( ! mfrc522.PICC_IsNewCardPresent()) {
        return;
    }

    // Select one of the cards
    if ( ! mfrc522.PICC_ReadCardSerial()) {
        return;
    }

    // Dump debug info about the card; PICC_HaltA() is automatically called
    mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

[실행]

리더기가 정상적으로 인식했네요.

소스 코딩을 보면 MFRC522의 객체변수를 mfrc522를 선언할 때 RST, SS Pin을 두개를 인자로 인스턴스화 하네요.

SPI.begin();            // Init SPI bus
mfrc522.PCD_Init();     // Init MFRC522

이렇게 해서 초기화 작업을 끝냈고 장상적으로 인식하는지 테스트가 진행 됩니다.

mfrc522.PCD_DumpVersionToSerial();

위 실행 결과에서 정상적으로 "Firmware Version: 0x88= (clone)" 라고 떴지만 인식을 안하면 실패한 에러 메세지가 출력 됩니다.

정상적으로 인식 했으니깐 카드를 읽을 준비를 합니다.

두개의 if문이 loop()함수에서 나옵니다.

mfrc522.PICC_IsNewCardPresent() 새카드 확인
mfrc522.PICC_ReadCardSerial() 카드 읽기

새로운 카드를 확인하면 다음 카드 읽기가 진행됩니다. 이 두 과정을 IF문으로 이렇게 표현하면 어떻게 동작 할까요.

if(!조건식) return ;

이 명령라인의 의미는 조건식이 거짓일 때 참이 됩니다. 족건식이 거짓이면 if문이 참이되어 return 명령을 만나는데 이 명령은 현재 명령 범위에서 아래 명령을 수행 할 필요 없이 다시 그 명령 범위를 빠져 나오라는 의미가 됩니다.

void loop(){
  if(!조건식) return ;
    명령문1;
    명령문2;
}

이렇게 되어 있으면 조건식이 거짓이면 return 명령으로 명령문1, 명령문 2를 수행하지 않고 빠져나와 종료된다고 생각하시면 돼요. loop()은 문한 반복이니깐 빠져나왔지만 loop()함수가 처음부터 다시 수행됨으로 if문의 조건식이 참인지 거짓인지 계속 무한 판정을 하게 됩니다. 이때 if문이 거짓이 되면 return 명령을 수행하지 않고 다음 명령문1, 명령문2가 수행되게 됩니다. 어떤 의미인지 아시겠죠.

위 소스에서 PICC_IsNewCardPresent()함수로 새카드인지 확인하고 카드가 확인되면 if문에서 새카드 확인되지 못할 때만 return 명령을 수행하기 때문에 확인되면 다음으로 넘어 갑니다. PICC_ReadCardSerial() 확인된 새카드를 읽게 됩니다. 읽게 되면은 if문에서 읽지 못할때 return 명령을 수행하기 때문에 읽었으니깐 다음 명령으로 넘어 가게 됩니다.

이렇게 두단계로 새카드 확인과 카드읽기로 락을 걸어놓은 것이죠.

mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

Dump 정보를 시리얼모니터로 출력시키는 명령입니다.

5. 결과


아래와 같이 카드를 리더기에 올려놓으면 카드의 정보를 읽어오게 됩니다.


5. RFID-RC522 인식이 에러 해결책


아래와 같은 메세지가 인식하지 못할 때 뜨게 됩니다.

첫번째, 인식 실패의 원인은 접촉 불량입니다. 처음에 잘 작동되더라도 나중에 쓰다보면 잘 인식하지 못합니다. 그래서 이 모듈을 사용하는 분들은 대부분 납땜을 많이 합니다.

두번째, 기존 아두이노에 이식 된 프로그램에 새로 업로드 한 프로그램과 그 사이에 리더기의 동작 에러가 발생 할 수 있습니다. 전원을 끄고 다시 접속해서 한번 문제가 생기면 사실 재 인식이 되지 않는 경우가 발생 합니다. 그럴 때 접촉 불량인가 하고 다시 연결선들을 점검하는데 혹시 이런 문제로 인해 인식을 못할 수 있으니깐요. 다른 프로그램을 아두이노에 업로해서 돌려 본 뒤에 다시 RFID-RC522 소스를 돌려보세요. 저도 방금 전 잘 인식되던게 인식 에러 상황을 만들려고 Gnd 선을 빼고 프로그램을 업로드 한뒤에 정상적으로 선 연결하고 업로드 했더니 RFID-RC522가 인식을 안하더군요. 선 접촉 불량인가 하고 삽질을 하다가 그냥 기본 예제인 Blink를 아두이노에 업로드 하고 나서 다시 RFID-RC522 소스를 업로드 하니깐 그때서야 정상적으로 인식이 되었습니다.

마무리


RFID-RC522 라이브러리가 참 쉽지 않는 라이브러리 입니다. 사용하는 함수들이 많은데 사실 라이브러리 파일을 찾아가서 안에 함수 내용이 정확히 어떻게 코딩되어 있는지 확인해야 그 의미를 이해할 수 있습니다. 저도 이 RFID 리더기를 사용할 때 좀 버겁습니다. 단지 카드를 대면 리더기가 읽으면 카드 UID값이 rfid.uid.uidByte[] 변수에 저장되는데 카드 UID 값을 기준으로 간단한 제어만 할 수 있습니다.

이 부품은 응용 범위가 많습니다. 일상에서 하루에 한번씩은 접해 보셨을 거라 생각됩니다. 교통카드 충전할 때 그 상황을 생각해보세요. 또는 매장에 물건을 살 때 택을 찍을 때를 상황을 떠올려 보세요. 도서관이나 회사 입구를 지나갈때 카드를 대고 지나가는 상황을 떠올려 보세요. 교통카드로 전철이나 버스를 타기 위해서 교통카드를 찍을 때를 떠올려 보세요. 집 출입문에 도어락을 떠올려보세요. 이외에도 많은 곳에서 이와 비슷한 것들이 많습니다.

RFID-RC522를 이용하시는 분들은 한번 이 모듈을 이용하여 어떤 것을 표현하고 싶은지 상상을 해보시고 재밌어 보이면 해당 라이브러리를 한번 열어보시고 그 함수의 로직이 어떻게 코딩되어 있는지 제대로 공부해보세요. 응용 분야가 많아서 아이디어만 있으면 꽤 괜찮은 작품들을 만들어 낼 수 있을 거라 생각됩니다.

Sort:  

짱짱맨 호출에 출동했습니다!!

오늘도 짱짱맨 방문에 감사합니다.

오호.... 이런 원리가 숨어있었군요..... 여전히 컴퓨터 코딩은 어렵습니다.... 라즈베리 파이로 요즘 삽질 중입니다... 레트로 게임을 하고 싶어서 샀는데 알수 없는 에러가 잔뜩 ㅠㅠ

라즈베리파이가 좀 사용하기 불편할 꺼에요.
몇번 깔고 지우고 해야 좀 익숙해질 듯요.

계속 모아 두었다가 책을 만들어도 되겠습니다.

그정도는 아니고 그냥 간단한 것 이야기 하는 수준이에요.

RF-ID는 여러모로 쓸 곳이 많은 것 같아요. 나중에 이런 것 한번 해보고 싶어요. 신용카드 IC Chip 읽어서 빈 IC 카드에 복사해 넣어서(?) 교통카드로 활용??? 아 범죄에 활용 되려나요. ㅎㅎㅎ

일상에서 비슷한 것들이 많아서 여러 부품을 결합하면 재밌는 표현이 많은데 라이브러리가 좀 어려워서 저도 사용하는데 좀 애먹네요. 라이브러리 코딩 내부를 해독해야하는데 그냥 기초적인 것만 가져다가 응용한 실험만 했네요

에이, 그래도 올려주시는 것 보면 그냥 기초는 아닌 것 같아요. 저야.. 솔직히 나중에 필요할 때 필요한 부분을 찾아보려고 마음 먹고는 있습니다. 모든 포스팅을 죄송스럽게도 다 보지는 못하고요. ㅠㅠ

그냥 코딩으로 스트레스 푸는 스타일이라 post 쓰면서 증흥적으로 떠오르는 것을 실험하고 그래서 좀 정리가 안된 상태에서 올리고 있어서 챙피할 따름입니다.

코딩으로 스트레스 푼다고요? ㄷㄷㄷㄷ 그래서 코딩맨이시군요. 코딩하면 저는 스트레스부터가... ^^;;

포스팅 내용과 관련이 없어, 미안한데요. 궁금한 게 있어요. 파워업 연습을 하는데요...이 작업은 Active or Owner 키 또는 마스터 비밀번호가 필요합니다.
이건 어디에서 확인하죠? ㅠㅠ

지갑의 권한 가시면 post, active 키를 확인 할 수 있습니다. 참고로 active 키를 확인하기 위해서는 마스터 키가 필요합니다. 참고로 지갑 누르면 또 페이지에서 권한이 있어요 그러면 권한페이지에서 post키랑 active키를 확인 가능해요.
처음 스팀잇 가입할 때 발급 받은 비번 있잖아요. 그 키가 마스터키에요.
steemit에 처음 접속할 때 로그인 한 키가 바로 마스터키에요 그걸로 하시면 돼요.

구글 아이콘을 누르면 평소에 자주 들어가는 사이트가 화면 가운데 6개 정도 떠잖아요. 맨앞에 스팀화면(내 아이디도 보임)이 있는데, 그걸 누르면 그냥 내 블러그로 들어오거든요. 아이디나 비밀번호를 치지도 않았는데...그러면 누군가도 마음대로 들어올 수 있다는 뜻일까요?

아뇨!
캐시에 저장되어 있어서 그래요.
집 컴퓨터면은 상관 없습니다. good21님이 쓰시는 컴퓨터 웹브라우저 캐쉬에 저장되어 있어서 그래요.
pc방이나 외부에서 접속하면 꼭 로그아웃을 해주셔야 합니다.
예전에 pc방에 갔는데 제가 자리잡은 pc가 이전에 쓰던 분이 로그인 하고 로그아웃안하고 가신분 있었는데요. 메신저 계정 보니깐 여성이더군요.
제가 다 로그아웃 시켜놓고 흔적 다 지워줬던 기억이 나네요.

참고로 pc방 브라우저 로그인 하시면 될 수 있으면 방문기록 창 가셔서 캐시지우기 하시고 나오세요.

꼭 pc방 가시면 접속한 웹브라우저 방문기록 전부 지우고 나오세요

오늘 1불 정도 파워업 연습을 하면서, 마스터키를 사용했거던요. 근데 어떤 글을 보니까, 마스터키는 사용안하는 게 좋다고 하면서, 다른 키를 사용하라고 하는데, 귀찮기도 하고, 잘 모르겠기도 하고, 그냥 마스터키로 쓰고 있는데, 또 당연히 로그인 자체를 마스터키로 하고 잇는 상태고, 이러면 해킹의 위험이 있나요. 지금이야 스팀이 손톱만큼 있으니까, 별 문제없지만, 만일 수량이 증가하면 위험할까요?

다른곳에서 로그인을 요구하는 사이트 있잖아요.
거기서, 마스터키를 될 수 있으면 사용는 것은 안좋고요. 그곳 해킹에 툴리면 그냥 다 털리는 거죠.
그리고 집컴퓨터 말고 외부 컴퓨터에서 접속할 때도 마스트키는 될 수 있으면 사용하지 마세요.
pc방 같은 경우는 해킹 툴이 깔려있는 경우가 많아서 안전 장치가 없어요. 로그인 할 때 로그인 기록을 따로 해킹하면 답 없음.
예전에 고전 해킹 툴이인터넷에 떠도는 것이 있었는데요. 호기심에 테스트 목적으로 무슨 프로그램인지 이제 기억은 안나지만요. 집에서 깔고 돌려봤더니 제가 사용한 pc에 로그인 했던 기록들이 전부 뜨더군요. 아디랑 비번을 넣은 기록들이 다 뜨더군요. 이렇게 위험합니다.
외부 컴퓨터로 특히 pc방 같은곳에서 주의하셔야 해요.
키 값 털리면 자신의 지갑이 아니게 돼요.
그리고 엑티브키로 활동을 하면서 털리더라도 마스터키로 지갑은 건질 수 있어요.
될 수 있으면 마스터키는 사용 안하시는게 좋아요.

액티브키가 할 수 있는 능력이 제한돼 있는 것 같은데, 그러면 파워업 할때는 액티브키를 썼다가 로그인할때는 또 다른 키를 사용해야 한다는 얘기인가요?
집에서 내 pc로만 스팀을 한다면 그냥 마스터키를 사용해도 안전할까요?

키를 자세히 보시면요.
포스트 키, 엑티브 키, 오너키, 메모키 이렇게 4개로 구분됩니다.
오너키는 마스터키로 모두를 다 제어 할 수 있고요.
오너키가 다른 키를 변경할 수 있어요.
엑티브키는 오너키와 능력이 같아요. 단, 엑티브키로는 활동은 가능하나 자체로 다른 키를 수정할 수 없어요.
즉, 엑티브키로 활동하다가 해킹 당해도 오너키로 엑티브키를 변경하면 다시 지갑을 되 찾아 올 수 있어요.
그래서 오너키(마스터키) 사용하실 때 주의해서 써야 하고요.
엑티브키는 사실 지갑을 건들 수 있어서 막쓰면 안되지만 지갑을 건들기 위해서는 엑티브 키가 있어야 하니깐 어느정도 막서도 되는 키고요.
지갑을 안건들 때믄 포스트 키로 쓰는게 좋겠죠.

엑티브키는 능력이 제한 된 건 없어요 지갑을 건들 수 있기 때문에 사실상 일반 로그인 비밀키라고 생각하시면 돼요.

오너키(마스터키)만 외부에서 쓰지 마시고 그냥 보관만 잘하시고요 엑티브키로만 활동하시면 돼요.

그리고 집 pc에서 안전한게 아니라 물론 안전합니다. 외부 pc에 비해서요. 그 안전은 good21님이 개인적으로 해킹당할 때에 안전이고요.
사이트 해킹에 경우에서는 오너키(마스터키)로 사용하시면 집 pc여도 안전하지 않습니다.
그냥 활동은 엑티브키로 하시고 중요한 변경이나 특정 뭔가를 할 때만 오너키(마스터키)를 사용하세요.
로그인이 필요만 사이트 중에서 로그인 할 때 오너키(마스터키) 사용은 추천하지 않고요.

해커톤 하면서 코딩맨님 자료를 참조하는 중입니다. ^^ 역시 지존이네요. ㅎㅎㅎㅎ 감사합니다. ㅎㅎㅎㅎ ㅠㅅㅠ 근데 무한 인식에러가 발생..... 흑흑 ㅎㅎㅎㅎㅎ 고쳐야 되는데 ......

예제 자체가 루프문이거든요. 그래서 인식이 루프 돌때마다 발생하는 것이고요.
루프문을 수정하시면 무한 인식부분은 해결 될꺼에요.
조건문을 넣고 딜레이 없이 시간 함수를 사용하셔서 약간의 딜레이를 주면서 조건문을 만드셔도 되고요.
인식 한 순간 딜레이 시간을 부여해서 시간 차를 만들어 놓거나 아니면 조건문으로 상황을 만드시면 해결 될거로 보입니다.

아, 제가 설명을 똑바로 못했네요. ㅎㅎㅎㅎ 지금 문제는 인식이 되지 않는 것 ㅇㅇ;;; 입니다. ㅎㅎㅎㅎ 계속 반복문 돌고 있는 건 아니고요. 인식기 모듈에다가 근접거리로 키나 카드를 대면 인식은 되는데, 인식실패가 계속 떠요. ㅇㅇ;;; 인식만 성공돼도 반은 먹고 들어갈 것 같은데...... 아쉽습니다. ㅎㅎㅎㅎㅎ

모듈을 납땜해보세요. 핀으로 꼽으면 인식이 잘 안되는 경우가 있어요. 됐다 안됐다 그러고요. 노이즈 현상 때문에 그런지 모르겠지만요.
인식은 되는데에서 인식 실패 메시지가 뜬다고 하셨는데 의미를 잘 이해했는지 모르겠지만 값을 제대로 읽지 못한다면 인식이 되지 못한거고 읽지를 못한 경우이고요.

저도 처음에 실패 한 삽질

  • 납땜 안해서 약간은 노이즈 현상으로 정상적으로 인식 못함
  • 라이브러리 문제(읽기는 하는데 뭔가 이상한 현상 정상처리 못함)

인식 실패 에러가 뜨면요 모듈을 납땜해서 다시 도전해보세요.
저도 처음에 할 때 인식되는 것 같은데 인식실패에러 메시지기 키를 대면 같은 메시지가 떠서 삽질 좀 했죠.

납땜은 해놨는데, 비스듬히 붙어있었어요. ㅇ_ㅇ 그래서 납땜한 거 다시 붙여서 정상적인 각도로 접합되게 하려고 했죠. 2번째로 납땜하려고요. 납땜 떼내고 녹이고 하다가 8핀 중 1~3개가 맛이 간듯 ㅋㅋㅋㅋ

Firmware Version: 0x0 = (unknown)
WARNING: Communication failure, is the MFRC522 properly connected?
Scan PICC to see UID, SAK, type, and data block...

에러가 발생해서
카드를 대기도 전에
아예 기본 인식이 안 되네요. ㅎㅎㅎㅎㅎㅎㅎㅎㅎ 아놔. ㅎㅎㅎㅎㅎ
다른 센서로 커버해야겠습니다. ㅎㅎㅎㅎㅎㅎㅎㅎㅎ

초기화 인식이 안된거네요.
안잡혀서 발생한거라 핀 연결에서 정상적으로 수신이 안되어서 발생한거고요.
납땜 문제일 듯요.
저도 첨에 인식되다가 위와 같은 메시지로 애먹은 적이 있는데 나중에 핀 납땜하고 해결 했네요.
모듈 문제인데 다시 납땜하시거나 다른 모듈로 해보세요.

납땜만 잘 했어도 ㅋㅋㅋㅋ 1개 밖에 없는데다 재납땜도 안 돼서 그냥 접었습니다. ㅎㅎㅎㅎ 결과물도 못 내고 나온 대회는 처음이네요. ^^;;;; 와... 이건 수상 이전의 문제인듯 ㅋㅋㅋㅋ

납땜부위가 문제 없어도 반대편 보드에는 핀을 꼽았을 거라 생각 되네요.
이게 접촉 불량일 때도 문제가 생겨요.
저도 이 모듈을 처음 실험 할 때 삽질 무자게 했어요.
납땜 했어도 똑같은 현상이 발생하기도 하고요.
참고로 모듈 라이브러리도 여러 종류가 있는데 제대된 라이브러리인지도 확인 하셔야 하고요.
라이브러리 문제로도 좀 삽질을 하긴 했어요.
그리고 보드에 전원 공급도 약간 핀 연결시 문제가 발생하기도 하고요.
이 모듈이 의외로 잘 안되는 경우가 많고 모듈 불량 문제인가 하고 좀 삽질을 저도 처음에 했어요.
몇차례 시행 착오를 하고 나니깐 이 모듈이 이런 문제들이 발생도 하구나하고 이해하게 되더군요.

Coin Marketplace

STEEM 0.19
TRX 0.18
JST 0.035
BTC 90928.46
ETH 3207.56
USDT 1.00
SBD 2.81