[ Guida ] Leggere Scrivere su RFID-RC522 Read Write

Link libreria : GitHub - miguelbalboa/rfid: Arduino RFID Library for MFRC522

Ieri notte ho chiesto all 'autore della libreria del RFID di aggiungere il mio sketch tra gli esempi per leggere e scrivere su RFID RC522,
la richiesta e stata accettata ; ho aggiunto anche i pin che utilizza arduino mega per utilizzare il transponder.

eccovi il codice molto semplice per la scrittura , Spero sia di vostro gradimento !

https://github.com/miguelbalboa/rfid/blob/master/examples/MifareClassicValueBlock/ReadAndWrite.ino

Le parti più salienti sono :

  1. i dati da scrivere nei vari blocchi del settore della carta ( buffer[0] buffer[1] buffer[2] ecc ecc ... )
byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,11,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };
  1. leggere e comparare i vari blocchi scritti sulla carta
  byte buffer[18];
        byte size = sizeof(buffer);
        // change this: valueBlockA , for read anather block
        // cambiate valueBlockA per leggere un altro blocco
        status = mfrc522.MIFARE_Read(valueBlockA, buffer, &size);
        Serial.print("Settore : 0 Valore :");
        Serial.println(buffer[0]);
        // e cosi via fino all ultimo blocco da leggere e comparare

Buon divertimento !!

Grazie. Karma +1 :smiley:

Grazie a te ! spero che possa essere di aiuto a qualcuno e che possa non fare stare sveglio altre persone fino alle 4 di mattina per capire come fare :slight_smile:

Ciao a tutti,
sono nuovo del forum e nuovo di arduino :slight_smile:

Ho acquistato su ebay il modulo RFID-RC522 per la lettura scrittura.
Ho scaricato i sorgenti e collegato i pin ad arduino uno come indicato ma ho un piccolo problema con il programma.
Verificando mi viene fuori l'errore sulla riga:

MFRC522 mfrc522(SS_PIN, RST_PIN);
'MFRC522' does not name a type

e successivamente i seguenti errori (legati a questo):
ReadAndWrite:44: error: 'MFRC522' does not name a type
ReadAndWrite.ino: In function 'void setup()':
ReadAndWrite:49: error: 'mfrc522' was not declared in this scope
ReadAndWrite.ino: In function 'void loop()':
ReadAndWrite:56: error: 'MFRC522' has not been declared
ReadAndWrite:56: error: expected `;' before 'key'
ReadAndWrite:58: error: 'key' was not declared in this scope
ReadAndWrite:61: error: 'mfrc522' was not declared in this scope
ReadAndWrite:66: error: 'mfrc522' was not declared in this scope
ReadAndWrite:73: error: 'mfrc522' was not declared in this scope
ReadAndWrite:80: error: 'mfrc522' was not declared in this scope
ReadAndWrite:83: error: 'MFRC522' has not been declared
ReadAndWrite:84: error: 'MFRC522' has not been declared
ReadAndWrite:85: error: 'MFRC522' has not been declared
ReadAndWrite:103: error: 'MFRC522' has not been declared
ReadAndWrite:103: error: 'key' was not declared in this scope
ReadAndWrite:104: error: 'MFRC522' has not been declared
ReadAndWrite:112: error: 'MFRC522' has not been declared
ReadAndWrite:113: error: 'MFRC522' has not been declared
ReadAndWrite:124: error: 'MFRC522' has not been declared

Qualcuno sa aiutarmi?Dove sto sbagliando?

Grazie
Fabio

Ciao Fabio,
prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI e di leggere il REGOLAMENTO ...

Poi, venendo al tu problema, hai scaricato e installato la necessaria "libreria" per l'utilizzo di quel modulo (vd. primo post di questo thread) ? Perché il compilatore ti sta chiaramente dicendo che non conosce il tipo MFRC522 che, immagino, sia definito nella libreria ... :wink:

Guglielmo

@Pablo, benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

P.S. scusa @Guglielmo se posto qualcosa di simile al tuo, volevo dare anche alcuni link utili nel forum. :smiley:

Si Nid, ma ...
... il problema specifico di Fabio è un'altro .. on quello dei collegamenti, ma quello Software e, in particolare, la mancata inclusione della necessaria libreria ... quindi ... :roll_eyes:

Guglielmo

P.S. : Inoltre il consiglio di "presentarsi" e di leggere il "regolamento" ... erano i primo due punti del mio post ...

Ciao a tutti, sto provando un pò ad usare la libreria postata all'inizio e tutto ok con gli esempi e con qualche modifica per testarne il funzionamento.
Purtroppo volevo capirne un pò di più e dopo aver studiato il datasheet del chip, e la libreria, c'è qualcosa che non capisco. Praticamente quali valori passare alla funzione SetAccessBits. Nell'esempio trovo:

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);

ma i 3 valori g1, g2 e g3 con quale criterio si modificano?
nella libreria trovo:

// The access bits are stored in a peculiar fashion.
	// There are four groups:
	//		g[3]	Access bits for the sector trailer, block 3 (for sectors 0-31) or block 15 (for sectors 32-39)
	//		g[2]	Access bits for block 2 (for sectors 0-31) or blocks 10-14 (for sectors 32-39)
	//		g[1]	Access bits for block 1 (for sectors 0-31) or blocks 5-9 (for sectors 32-39)
	//		g[0]	Access bits for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39)
	// Each group has access bits [C1 C2 C3]. In this code C1 is MSB and C3 is LSB.
	// The four CX bits are stored together in a nible cx and an inverted nible cx_.
	byte c1, c2, c3;		// Nibbles
	byte c1_, c2_, c3_;		// Inverted nibbles
	bool invertedError;		// True if one of the inverted nibbles did not match
	byte g[4];				// Access bits for each of the four groups.
	byte group;				// 0-3 - active group for access bits
	bool firstInGroup;		// True for the first block dumped in the group

e poi questo:

/**
 * Calculates the bit pattern needed for the specified access bits. In the [C1 C2 C3] tupples C1 is MSB (=4) and C3 is LSB (=1).
 */
void MFRC522::MIFARE_SetAccessBits(	byte *accessBitBuffer,	///< Pointer to byte 6, 7 and 8 in the sector trailer. Bytes [0..2] will be set.
									byte g0,				///< Access bits [C1 C2 C3] for block 0 (for sectors 0-31) or blocks 0-4 (for sectors 32-39)
									byte g1,				///< Access bits C1 C2 C3] for block 1 (for sectors 0-31) or blocks 5-9 (for sectors 32-39)
									byte g2,				///< Access bits C1 C2 C3] for block 2 (for sectors 0-31) or blocks 10-14 (for sectors 32-39)
									byte g3					///< Access bits C1 C2 C3] for the sector trailer, block 3 (for sectors 0-31) or block 15 (for sectors 32-39)
								) {
	byte c1 = ((g3 & 4) << 1) | ((g2 & 4) << 0) | ((g1 & 4) >> 1) | ((g0 & 4) >> 2);
	byte c2 = ((g3 & 2) << 2) | ((g2 & 2) << 1) | ((g1 & 2) << 0) | ((g0 & 2) >> 1);
	byte c3 = ((g3 & 1) << 3) | ((g2 & 1) << 2) | ((g1 & 1) << 1) | ((g0 & 1) << 0);
	
	accessBitBuffer[0] = (~c2 & 0xF) << 4 | (~c1 & 0xF);
	accessBitBuffer[1] =          c1 << 4 | (~c3 & 0xF);
	accessBitBuffer[2] =          c3 << 4 | c2;
} // End MIFARE_SetAccessBits()

per esempio il byte g3 controlla l'accesso ai dati Trailer e se non ho capito male C1 aggiunge 4, C2 aggiunge 2 e C3 aggiunge 1 (tipo il settaggio degli indirizzi con i dip switch..). ne deduco che se g3 è impostato a 3, abbiamo C2 e C3 HIGH e C1 LOW...
quindi questi sono i 3 bit presi dalla tabella sul datasheet? (ho paura di essermi risposto da solo...)

ehm.. perdonate il post a così poca distanza, ma confermo (per chi cercasse di capire la stessa cosa..) quanto detto sopra, e l'unica cosa a cui fare attenzione (era il mio ostacolo) è che per cambiare i permessi dobbiamo controllare con quale chiave autenticarsi prima.
lo dico perchè nell'esempio della libreria si autentica con keyA, poi cambia i permessi per aggiungere l'autenticazione con keyB, dopodichè conferma l'autenticazione con keyB.
Se però si vuole (come nel mio caso) ripristinare gli attributi di "fabbrica" a "001" per il trailer e "000" per i dati, non funziona... bisogna prima fare l'autenticazione con keyB.

Tutto ciò era per i posteri...

Ciao...ho aperto un topic di aiuto riguardo l'rfid rc522,potresti dare un'occhiata?
http://forum.arduino.cc/index.php?topic=305178.0

Grazie mille..

Ciao..stò leggendo il tuo sketch e lo trovo molto interessante,ho provato ad avviarlo per provare a scrivere le informazioni sul secondo blocco,ma mi dice che la carta risponde con un nak

PICC type: MIFARE 1KB
Writing new value block A(4) : the first of the sector TWO 
MIFARE_Write() failed: A MIFARE PICC responded with NAK.
Read block A(4) : the first of the sector TWO
Settore : 0 Valore :48
Settore : 1 Valore :4
Settore : 2 Valore :38
Settore : 3 Valore :238
Settore : 4 Valore :8
Settore : 5 Valore :226
Settore : 6 Valore :8
Settore : 7 Valore :243
Settore : 8 Valore :8
Settore : 9 Valore :227
Settore :10 Valore :0
Settore :11 Valore :0
Settore :12 Valore :3
Settore :13 Valore :0
Settore :14 Valore :243
Settore :15 Valore :4
Read block A(4) : the first of the sector TWO : no match - write don't work fine 
:-(

Perchè non accetta la scrittura? Mi puoi chiarire inoltre l'autenticazione con keyA,keyB?
Grazie per il tuo lavoro :smiley:
EDIT: Provando invece con la chiavetta blu in dotazione,la scrittura avviene.

Ciao ,ho bisogno di aiuto,ho comprato svariati rfid RC522 ma nessuno legge le schede ,ho controllato i collegamenti e sembrano fatti bene,aiutatemi.Se riuscite,postate il link di uno sketch funzionante e il link della libreria dell'Rfid,grazie Ho usato arduino mega e uno
.

@alienoide: Se almeno avessi letto l'intero thread, avresti visto che ... essendo il tuo primo post, devi presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e leggere con attenzione il REGOLAMENTO.

Guglielmo

Ciao guglielmo,ho letto le regole e mi sono presntato,scusa per tutto.Prof resto dare un occhi al mio problema grazie

Per poterti aiutare magari sarebbe il caso che ci dessi il link hai prodotti che hai comprato così da capire di che si tratta e che libreria usare con essi.

A corredo delle librerie, comunque, ci sono sempre esempi e, almeno quelli, ti devono funzionare, altrimenti due sono i casi ...

  1. usi la libreria e gli esempi sbagliati per il tuo modello di RFID
  2. Hai sbagliato tu i collegamenti

Il negoziante dove hai comprato gli RFID deve inoltre dirti con che libreria usarli.

Guglielmo

gpb01:
Il negoziante dove hai comprato gli RFID deve inoltre dirti con che libreria usarli.

"Deve" direi che un pochino esagerato, se si tratta di un prodotto specifico per Arduino ha l'obbligo morale/etico mettere i link della documentazione e le librerie, se si tratta di un prodotto generico non ha alcun obbligo salvo dare le informazioni minime indispensabili per trovare il datasheet.
Il vero problema è che molti venditori, per fare cassa, a qualunque prodotto aggiungono la dicitura "Arduino" così la gente lo compra pensando di poterlo usare facilmente, poi va incontro a scottanti delusioni perché si tratta di prodotti generici, senza esempi e librerie specifiche per Arduino, per i quali serve esperienza elettronica/informatica per poterli utilizzare, altrimenti sono solo dei "costosi" fermacarte. :slight_smile:

astrobeed:
"Deve" direi che un pochino esagerato ...

SI, è vero, ho volutamente un po' calcato la mano ...
... ma è, appunto, voluto, così la gente comincia a "rompere le OO" hai venditori i quali, forse (molto forse), cominceranno a capire che, assieme ai prodotti, un minimo di documentazione la devono mettere.

Lo so, è una "vana speranza" ... :confused:

Guglielmo

ciao ,ti nivio il link del sito dove l'ho comprato
http://www.ebay.it/itm/Lettore-RFID-RC522-Reader-con-Portachiavi-e-Card-per-Arduino-PIC-/252062326070?hash=item3ab015dd36:g:ThEAAOSw~gRV1IFK
qui invece ti kinko il linkl del video ,dove ho scaricato la libreria

Ok ... quindi nessuna documentazione specifica ...

Andiamo sul generico, hai già seguito la guida nel Playground ? ... sia per i collegamenti che per la libreria

Guglielmo

alienoide:
ciao ,ti nivio il link del sito dove l'ho comprato

Come si diceva sopra, il classico prodotto generico dove, per vendere, aggiungono la dicitura Arduino PIC lasciando intendere che si collega e funziona tutto subito. :slight_smile:

Lettore RFID RC522 Reader con Portachiavi e Card per Arduino PIC

Usa il chipset MFRC522, qui esempio e libreria per Arduino.