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(§orTrailerBuffer[6], 0, 0, 0, 1);
}
else
{
//B값
[0 1 1]
mfrc522.MIFARE_SetAccessBits(§orTrailerBuffer[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 |