Schede RFID ARDUINO

Ciao a tutti, un informazione ma c'è un modo per scrivere sulle schede RFID ? Qualcuno riesce a passarmi un esempio ? Grazie ciao

Se stai usando un 522 con la libreria di M. Balboa, tra gli esempi dovrebbe esserci un ReadWrite che te lo spiega.

Il vero problema è capire la cervellotica struttura dei tag!

Sto usando questo. In effetti vorrei fare in modo che quando avvicino la chiave alla sensore mi mette un credito di 1 quando premo un pulsante. Poi se rimetto la scheda sul sensore è premo un altro pulsante mi toglie il credito di 1. Sapete se c’è un esempio in giro su internet ? Io non ho trove to nulls in merito

Hai guardato l'esempio di cui ti ho parlato?

si è questo, solo che è complicato per me.
Adesso sto provando un altro più piccolo dove nel seriale scrivo qualcosa e poi se leggo la scheda con l'esempio DumpInfo noto che il blocco 4 cambia la sequenza dei numeri decimali in base a quello che scrivo.

Adesso sto vedendo questo che mi da la possibilità di scrivere.

#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
        SPI.begin();               // Init SPI bus
        mfrc522.PCD_Init();        // Init MFRC522 card
        Serial.println(F("Write personal data on a MIFARE PICC "));
}

void loop() {
        
        // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
        MFRC522::MIFARE_Key key;
        for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
        
        // Look for new cards
        if ( ! mfrc522.PICC_IsNewCardPresent()) {
                return;
        }

        // Select one of the cards
        if ( ! mfrc522.PICC_ReadCardSerial())    return;
        
        Serial.print(F("Card UID:"));    //Dump UID
        for (byte i = 0; i < mfrc522.uid.size; i++) {
          Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
          Serial.print(mfrc522.uid.uidByte[i], HEX);
        } 
        Serial.print(F(" PICC type: "));   // Dump PICC type
        MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
        Serial.println(mfrc522.PICC_GetTypeName(piccType));
         
        byte buffer[34];  
        byte block;
        MFRC522::StatusCode status;
        byte len;
        
        Serial.setTimeout(20000L) ;     // wait until 20 seconds for input from serial
        // Ask personal data: Family name
        Serial.println(F("Type Family name, ending with #"));
        len=Serial.readBytesUntil('#', (char *) buffer, 30) ; // read family name from serial
        for (byte i = len; i < 30; i++) buffer[i] = ' ';     // pad with spaces
        
        block = 1;
        //Serial.println(F("Authenticating using key A..."));
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
           Serial.print(F("PCD_Authenticate() failed: "));
           Serial.println(mfrc522.GetStatusCodeName(status));
           return;
        }
        else Serial.println(F("PCD_Authenticate() success: "));
        
        // Write block
  status = mfrc522.MIFARE_Write(block, buffer, 16);
  if (status != MFRC522::STATUS_OK) {
      Serial.print(F("MIFARE_Write() failed: "));
      Serial.println(mfrc522.GetStatusCodeName(status));
            return;
  }
        else Serial.println(F("MIFARE_Write() success: "));

        block = 2;
        //Serial.println(F("Authenticating using key A..."));
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
           Serial.print(F("PCD_Authenticate() failed: "));
           Serial.println(mfrc522.GetStatusCodeName(status));
           return;
        }
        
        // Write block
  status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
  if (status != MFRC522::STATUS_OK) {
      Serial.print(F("MIFARE_Write() failed: "));
      Serial.println(mfrc522.GetStatusCodeName(status));
            return;
  }
        else Serial.println(F("MIFARE_Write() success: "));

        // Ask personal data: First name
        Serial.println(F("Type First name, ending with #"));
        len=Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
        for (byte i = len; i < 20; i++) buffer[i] = ' ';     // pad with spaces
        
        block = 4;
        //Serial.println(F("Authenticating using key A..."));
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
           Serial.print(F("PCD_Authenticate() failed: "));
           Serial.println(mfrc522.GetStatusCodeName(status));
           return;
        }
        
        // Write block
  status = mfrc522.MIFARE_Write(block, buffer, 16);
  if (status != MFRC522::STATUS_OK) {
      Serial.print(F("MIFARE_Write() failed: "));
      Serial.println(mfrc522.GetStatusCodeName(status));
            return;
  }
        else Serial.println(F("MIFARE_Write() success: "));

        block = 5;
        //Serial.println(F("Authenticating using key A..."));
        status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
        if (status != MFRC522::STATUS_OK) {
           Serial.print(F("PCD_Authenticate() failed: "));
           Serial.println(mfrc522.GetStatusCodeName(status));
           return;
        }
        
        // Write block
  status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
  if (status != MFRC522::STATUS_OK) {
      Serial.print(F("MIFARE_Write() failed: "));
      Serial.println(mfrc522.GetStatusCodeName(status));
            return;
  }
        else Serial.println(F("MIFARE_Write() success: "));


        Serial.println(" ");
        mfrc522.PICC_HaltA(); // Halt PICC
        mfrc522.PCD_StopCrypto1();  // Stop encryption on PCD
       
}

Questo di leggere. Solo che qui leggo solo il blocco scritto ma non riesco a vedere quello che c’è scritto realmente.

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

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);	// Create MFRC522 instance.

void setup() {
	Serial.begin(9600);	// Initialize serial communications with the PC
	SPI.begin();		// Init SPI bus
	mfrc522.PCD_Init();	// Init MFRC522 card
	Serial.println("Scan a MIFARE Classic PICC to demonstrate Value Blocks.");
}

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

	// Select one of the cards
	if ( ! mfrc522.PICC_ReadCardSerial()) {
		return;
	}
	// Now a card is selected. The UID and SAK is in mfrc522.uid.
	
	// Dump UID
	Serial.print("Card UID:");
	for (byte i = 0; i < mfrc522.uid.size; i++) {
		Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
		Serial.print(mfrc522.uid.uidByte[i], HEX);
	} 
	Serial.println();

	// Dump PICC type
	byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
	Serial.print("PICC type: ");
	Serial.println(mfrc522.PICC_GetTypeName(piccType));
	if (	piccType != MFRC522::PICC_TYPE_MIFARE_MINI 
		&&	piccType != MFRC522::PICC_TYPE_MIFARE_1K
		&&	piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
		Serial.println("This sample only works with MIFARE Classic cards.");
		return;
	}

	// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
	MFRC522::MIFARE_Key key;
	for (byte i = 0; i < 6; i++) {
		key.keyByte[i] = 0xFF;
	}

	// In this sample we use the second sector (ie block 4-7).
	byte sector			= 1;
	byte valueBlockA	= 5;
	byte valueBlockB	= 6;
	byte trailerBlock	= 7;
	
	// Authenticate using key A.
	Serial.println("Authenticating using key A...");
	byte status;
	status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
	if (status != MFRC522::STATUS_OK) {
		Serial.print("PCD_Authenticate() failed: ");
		Serial.println(mfrc522.GetStatusCodeName(status));
		return;
	}
	
	// We need a sector trailer that defines blocks 5 and 6 as Value Blocks and enables key B.
	byte trailerBuffer[] = { 255,255,255,255,255,255,  0,0,0,  0,  255,255,255,255,255,255}; // Keep default keys.
	// g1=6 => Set block 5 as value block. Must use Key B towrite & increment, A or B can be used for derement.
	// g2=6 => Same thing for block 6.
	// g3=3 => Key B must be used to modify the Sector Trailer. Key B becomes valid. 
	mfrc522.MIFARE_SetAccessBits(&trailerBuffer[6], 0, 6, 6, 3);
	
	// Now we read the sector trailer and see if it is like we want it to be.
	Serial.println("Reading sector trailer...");
	byte buffer[18];
	byte size = sizeof(buffer);
	status = mfrc522.MIFARE_Read(trailerBlock, buffer, &size);
	if (status != MFRC522::STATUS_OK) {
		Serial.print("MIFARE_Read() failed: ");
		Serial.println(mfrc522.GetStatusCodeName(status));
		return;
	}
	if (	buffer[6] != trailerBuffer[6]
		&&	buffer[7] != trailerBuffer[7]
		&&	buffer[8] != trailerBuffer[8]) {
		Serial.println("Writing new sector trailer...");
		status = mfrc522.MIFARE_Write(trailerBlock, trailerBuffer, 16);
		if (status != MFRC522::STATUS_OK) {
			Serial.print("MIFARE_Write() failed: ");
			Serial.println(mfrc522.GetStatusCodeName(status));
			return;
		}
	}
	
	// Authenticate using key B.
	Serial.println("Authenticating again using key B...");
	status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
	if (status != MFRC522::STATUS_OK) {
		Serial.print("PCD_Authenticate() failed: ");
		Serial.println(mfrc522.GetStatusCodeName(status));
		return;
	}
	
	// Value blocks has a 32 bit signed value stored three times and an 8 bit address stored 4 times.
	// Make sure blocks valueBlockA and valueBlockB has that format.
	formatBlock(valueBlockA);
	formatBlock(valueBlockB);

	// Add 1 to the value of valueBlockA and store the result in valueBlockA.
	Serial.print("Adding 1 to value of block "); Serial.println(valueBlockA);
	status = mfrc522.MIFARE_Increment(valueBlockA, 1);
	if (status != MFRC522::STATUS_OK) {
		Serial.print("MIFARE_Increment() failed: ");
		Serial.println(mfrc522.GetStatusCodeName(status));
		return;
	}
	status = mfrc522.MIFARE_Transfer(valueBlockA);
	if (status != MFRC522::STATUS_OK) {
		Serial.print("MIFARE_Transfer() failed: ");
		Serial.println(mfrc522.GetStatusCodeName(status));
		return;
	}
	
	// Dump the result
	mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
	
	// Halt PICC
	mfrc522.PICC_HaltA();

	// Stop encryption on PCD
	mfrc522.PCD_StopCrypto1();
}

void formatBlock(byte blockAddr) {
	Serial.print("Reading block "); Serial.println(blockAddr);
	byte buffer[18];
	byte size = sizeof(buffer);
	byte status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
	if (status != MFRC522::STATUS_OK) {
		Serial.print("MIFARE_Read() failed: ");
		Serial.println(mfrc522.GetStatusCodeName(status));
		return;
	}

	if (	(buffer[0] == (byte)~buffer[4])
		&&	(buffer[1] == (byte)~buffer[5])
		&&	(buffer[2] == (byte)~buffer[6])
		&&	(buffer[3] == (byte)~buffer[7])
		
		&&	(buffer[0] == buffer[8])
		&&	(buffer[1] == buffer[9])
		&&	(buffer[2] == buffer[10])
		&&	(buffer[3] == buffer[11])
		
		&&	(buffer[12] == (byte)~buffer[13])
		&&	(buffer[12] ==        buffer[14])
		&&	(buffer[12] == (byte)~buffer[15])) {
		Serial.println("Block has correct Block Value format.");
	}
	else {
		Serial.println("Writing new value block...");
		byte valueBlock[] = { 0,0,0,0,  255,255,255,255,  0,0,0,0,   blockAddr,~blockAddr,blockAddr,~blockAddr };
		status = mfrc522.MIFARE_Write(blockAddr, valueBlock, 16);
		if (status != MFRC522::STATUS_OK) {
			Serial.print("MIFARE_Write() failed: ");
			Serial.println(mfrc522.GetStatusCodeName(status));
		}
	}		
} // End formatBlock()

C'è un modo per capire cosa mi esce scritto in questa sequenza binaria ?

Adding 1 to value of block 5
1 7 00 00 00 00 00 00 19 67 8E 00 00 00 00 00 00 00 [ 0 1 1 ]
6 00 00 00 00 FF FF FF FF 00 00 00 00 06 F9 06 F9 [ 1 1 0 ] Value=0x0 Adr=0x6
5 33 00 00 00 CC FF FF FF 33 00 00 00 05 FA 05 FA [ 1 1 0 ] Value=0x33 Adr=0x5
4 4C 75 63 61 20 43 6F 6C 69 40 54 65 63 6E 69 63 [ 0 0 0 ]

Luca Coli@Tecnic

? :slight_smile:

scusate il binario :slight_smile: :slight_smile:

Daiiii come hai fatto ? mi dici come Grazie mille

fatto!! :slight_smile: :slight_smile: :slight_smile:
ce un modo per farlo fare ad Arduino ?
Nel senso che prende quella sequenza e la traduce ?

Ciao, mi servirebbe una mano perchè è da ieri che ci smanetto mo non riesco a capire come fare. :frowning: :frowning:

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

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);	// Crea l'istanza MFRC522

void setup()
{
	Serial.begin(9600);	
	SPI.begin();		
	mfrc522.PCD_Init();	
}

void loop() 
{
// Vede la presenza della KEY
      if ( ! mfrc522.PICC_IsNewCardPresent()) {
		    return; }

// Legge la KEY
  	  if ( ! mfrc522.PICC_ReadCardSerial()) {
		    return; }

// Prepara la KEY.
  	MFRC522::MIFARE_Key key;
	  for (byte i = 0; i < 6; i++) {
		key.keyByte[i] = 0xFF;
    }

// In questo esempio si usa il secondo settore (ad esempio blocco 4-7).
  	byte sector			= 1;
	  byte valueBlockA	= 5;
	  byte valueBlockB	= 6;
	  byte trailerBlock	= 7;
	  byte status;
	 
	  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
  	byte trailerBuffer[] = { 255,255,255,255,255,255,  0,0,0,  0,  255,255,255,255,255,255}; 
  	mfrc522.MIFARE_SetAccessBits(&trailerBuffer[6], 0, 6, 6, 3);
	
  	byte buffer[18];
	  byte size = sizeof(buffer);
	  status = mfrc522.MIFARE_Read(trailerBlock, buffer, &size);
  	status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));

// Aggiungere 1 al valore di valueBlockA e memorizzare il risultato in valueBlockA.
  	Serial.print("Lettura Key"); Serial.println(valueBlockA);
	  status = mfrc522.MIFARE_Increment(valueBlockA, 1);


  	mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);

  	mfrc522.PICC_HaltA();

  	mfrc522.PCD_StopCrypto1();
}

questo è il programma, un po modificato, per farlo funzionare come serve a me.
Quello che vorrei fare e che a me serve e prendere solo la parte Hexadecimal evidenziata in rosso
e convertirla in testo e ristampato sul seriale.

Lettura Key5
1 7 00 00 00 00 00 00 19 67 8E 00 00 00 00 00 00 00 [ 0 1 1 ]
6 00 00 00 00 FF FF FF FF 00 00 00 00 06 F9 06 F9 [ 1 1 0 ] Value=0x0 Adr=0x6
5 59 00 00 00 A6 FF FF FF 59 00 00 00 05 FA 05 FA [ 1 1 0 ] Value=0x59 Adr=0x5
4 50 61 6C 6C 61 43 65 6E 74 72 6F 20 20 20 20 20 [ 0 0 0 ]

Grazie mille.

Non capisco bene i giri strani che fa quel codice, comunque in teoria i dati sono memorizzati in "buffer", che è un array di byte. Ti basta stampare i byte che ti interessano convertendoli (= facendone il cast) in char.

Si grazie, ma come faccio a stampare solo i dati che mi servono ?

Intanto fai un ciclo per stampare l'intero array, poi capirai da solo :).

Bhooo. Ok grazie lo stesso.

Sai fare un ciclo per stampare un array???

se sapevo farlo non chiedevo. ho scritto il mio aiuto perchè non riesco, se possibile con un aiuto arrivare alla mia soluzione

… scusa, sai bene che ogni elemento di un array è esaminabile tramite l’indice, esempio mioArray[5] mi da il sesto (si comincia da 0) elemento del mioArray.

Dopo di che sai fare un ciclo for con una variabile che va da 0 ad N … esempio: for (i = 0; i < N; i++)

Ora … unisci le due cose e vedi un po’ … :wink:

Guglielmo