Get it on Google Play


Wm뮤 :: 아두이노 RC522 (RFID 13.56MHz)

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
전자과 게임프로그래머 (퇴사함)
2022.3.22f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2020. 11. 12. 13:43 아두이노

rc522는 RFID모듈이다 2020년 기준 국내 1000~2000가격에 구할수 있다

 

 

NFC랑 RFID랑 다른것 같다. 뭔차인진 몰겄고 걍 작동만 되면 된다

 

 

 

 

다음 표를 보면서 핀을 넣는다

주의할점은 IRQ는 사용 안함이고 핀순서가 뒤죽박죽이기 때문에 기판에 인쇄된 글자를 보면서 해야한다

 

 

 

결과

 

 

 

카드의 값을 읽어올때는 DumpInfo예제를 쓴다

 

결과

 

 

PCD_Authenticate() failed: Error in communication. 에러는 일반적으로 암호화된 블록을 키없이 읽으려고 할때 발생한다.

읽기 키 기본값은 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF이고 키를 변경하면 키를 가진사람외에는 읽기 방지 할 수있다.

 

 

보통은 이걸 바꾼다

MFRC522::MIFARE_Key key;

void setup() {
    for (byte i = 0; i < 6; i++) {
        key.keyByte[i] = 0xFF;
    }
    }

 

 

A MIFARE PICC responded with NAK.

은 쓰기방지가 걸려있는거다. 다른 섹터, 혹은 블록을 참조해야한다고했는데 알고보니 트레일러가 잘못된거였다

 

 

 

 

함수모음

    //카드접촉검사
    if ( ! mfrc522.PICC_IsNewCardPresent())
        return;

    //카드읽기가 정상인지 검사
    if ( ! mfrc522.PICC_ReadCardSerial())
        return;

 

 

데이터블록은 blockAddr/4*4+3이여야 한다

혹은 blockAddr-(blockAddr%4)+3

즉 1이면 3, 4이면7, 5여도 7 

    byte sector         = 1;
    byte sector2         = 0;
    
    byte blockAddr      = 1;
    byte dataBlock[]    = {
        0x01, 0x02, 0x03, 0x04, //  1,  2,   3,  4,
        0x05, 0x06, 0x07, 0x08, //  5,  6,   7,  8,
        0x09, 0x0a, 0xff, 0x0b, //  9, 10, 255, 11,
        0x0c, 0x0d, 0x0e, 0x0f  // 12, 13, 14, 15
    };
    byte trailerBlock   = blockAddr/4*4+3;

 

데이터시트

www.nxp.com/docs/en/data-sheet/MF1S50YYX_V1.pdf

 

0번섹터 0번블록은 UID등등의 값이 들어가있고 Manufacture Block이라고 한다

503번RFID는

0~3바이트는 NUID

500번RFID는

0~5바이트는 UID

 

각 섹터별 3번블록은 섹터정보가 있는지 함부로 값을쓰면 개박살난다

 

 

 

 


  byte sectorTrailerBuffer[16]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0x80,0x69,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

block=1;

      byte sectorTrailerIndex = block/4*4+3;
      
      
      //해당 블록에 액세스
      
      status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, sectorTrailerIndex, &key, &(mfrc522.uid));
      if (status == MFRC522::STATUS_OK) 
      {
        Serial.println(F("PCD_Authenticate() success: "));
      }
      else 
      {
        Serial.print(F("PCD_Authenticate() failed: "));
        Serial.println(mfrc522.GetStatusCodeName(status));
        return;
      }
      
      
      
  
  if(block==sectorTrailerIndex)
      {
      if(useAkey)
      {
//A값
[0 0 1]
  mfrc522.MIFARE_SetAccessBits(&sectorTrailerBuffer[6], 0, 0, 0, 1); 
      }
      else
      {
//B값
[0 1 1]
  mfrc522.MIFARE_SetAccessBits(&sectorTrailerBuffer[6], 3, 3, 3, 3); 
      }
      
  
        status = mfrc522.MIFARE_Write(block, sectorTrailerBuffer, 16);
      }
      else
      {
        status = mfrc522.MIFARE_Write(block, buffer, 16);
      }
      
  
    
    if (status == MFRC522::STATUS_OK) 
    {
      Serial.println(F("MIFARE_Write() success: "));
    }
    else 
    {
      Serial.print(F("MIFARE_Write() failed: "));
      Serial.println(mfrc522.GetStatusCodeName(status));
      return;
    }
  
  
  
  

'아두이노' 카테고리의 다른 글

byte to hex  (0) 2021.02.23
블루투스 테스트용 앱들  (0) 2020.08.01
블루투스 셋업용 코드  (0) 2020.07.31
posted by 모카쨩

저사양 유저용 블로그 진입