본문 바로가기
Projects/근태관리 시스템 for Wemos,Rasp

1. RFID 카드 리더기 만들기 using Wemos and RC522

by Answer Choi 2017. 3. 8.
반응형

RFID 리더기 코드 다운로드



전체적인 구성도는 위 그림과 같습니다.


RFID 태그를 찍으면 wemos에서 RFID 데이터를 라즈베리파이 서버로 보내게 됩니다.


그리고 Raspberry pi 에는 데이터베이스와 웹서버, 미들웨어가 들어가 있습니다.


먼저 RFID 리더기를 만듭니다.


준비물은 Wemos D1, RFID-RC522, 부저, 스위치 저항 1개 정도입니다.


RFID-RC522는 Wemos와 SPI통신을 하고, 부저와 버튼은 GPIO 출력과 입력입니다.


부저는 RFID가 제대로 읽혀졌는지 확인 용도이며,


버튼은 Wemos의 WiFi연결을 위한 AP 설정용 버튼입니다.


그리고 코딩은 Arduino로 합니다.


Arduino의 MFRC522 라이브러리를 이용하면 RFID 리더기를 쉽게 만들수 있습니다.


실제 결선도입니다.


아두이노 코드입니다.


MFRC522 예제코드중 DumpInfo.ino를 보면 카드정보 읽어오는 예제가 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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));
}
cs


Line 3 : 새로운 카드가 읽히면 true를 반환합니다.


Line 8 : UID가 읽히면 true를 반환합니다.


Line 13 : 위 Line 8에서 UID가 읽혔으면 UID를 통해 카드 정보를 읽어옵니다.


위 예제에서 Line 13의 모든 태그정보는 필요가 없고  UID만 있으면 되므로 코드를 조금 수정합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
// 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_DumpDetailsToSerial(&(mfrc522.uid));
mfrc522.Reading_tag(&(mfrc522.uid));
if(mfrc522.read_tag)
    send_data();
cs


Line 11 : 위 샘플예제의 Line 13 대신 uid를 바로 읽을 수 있도록 했습니다.


Line 12~13 : 카드가 정상적으로 모두 읽히고 나면 서버로 전송합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void MFRC522::Reading_tag(Uid *uid){    
    // UID
    Serial.print(F("Card UID:"));
    for (byte i = 0; i < uid->size; i++) {
        if(uid->uidByte[i] < 0x10)
            Serial.print(F(" 0"));
        else
            Serial.print(F(" "));
        Serial.print(uid->uidByte[i], HEX);
        tag[i]=(uid->uidByte[i]);
    } 
    Serial.println();
    digitalWrite(16,LOW);
    delay(500);
    digitalWrite(16,HIGH);
    read_tag=true;
}
cs


Line 4~11 : debug창으로 카드의 uid를 print해줌과 동시에 tag라는 array에 uid값을 넣습니다.


Line 13~15 : 태그가 인식됐는지 확인용으로 부저를 울려줍니다.


Line 16 : 태그의 uid를 서버로 전송하기 위한 flag입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void send_data(){
    mfrc522.read_tag=false;
    tag_Data[0]=STX;
    tag_Data[5]=ETX;
    for(int i=0;i<4;i++){
 
        tag_Data[i+1]=mfrc522.tag[i];
 
    }
    int wifistatus = Wificlient.status();
    if (wifistatus != ESTABLISHED) {        //first connect
        debug.println("wifi status is not established");
        client_status(wifistatus);
        Wificlient.connect(serverIP, serverport);
        
    }
    Wificlient.write((const char*)&tag_Data,packetsize);
}
cs


모두 6byte를 서버로 전송하게 되는데 첫바이트는 STX, 마지막 바이트는 ETX이고 중간 4바이트는 UID입니다.


Line 11~16 : 서버에 접속이 되어있는지 확인합니다.


Line 17 : 서버로 UID 데이터를 전송합니다.



코드는 첨부파일에 있습니다.




반응형

'Projects > 근태관리 시스템 for Wemos,Rasp' 카테고리의 다른 글

3. DB및 웹서버(Web Server)  (0) 2017.03.14
2. MW 만들기 using JAVA  (0) 2017.03.09

인기글