Get it on Google Play


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

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
퇴직한 전자과 게임프로그래머
2020.3.48f1 , 2022.3.6f1 주로 사용
모카쨩
@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 모카쨩

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입