Go Down

Topic: [ Guida ] Leggere Scrivere su RFID-RC522 Read Write (Read 20850 times) previous topic - next topic

empty_skull

Link libreria : https://github.com/miguelbalboa/rfid

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 ... )
Code: [Select]

byte value1Block[] = { 1,2,3,4,  5,6,7,8, 9,10,11,12,  13,14,15,16,   valueBlockA,~valueBlockA,valueBlockA,~valueBlockA };


2) leggere e comparare i vari blocchi scritti sulla carta
Code: [Select]

 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 !!


nid69ita

my name is IGOR, not AIGOR

empty_skull

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

15pablo84

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

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

gpb01

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

Guglielmo
Search is Your friend ... or I am Your enemy !

nid69ita

@Pablo, benvenuto.  :)
Ti invitiamo a presentarti qui: http://forum.arduino.cc/index.php?topic=113640.0
e a leggere il regolamento: http://forum.arduino.cc/index.php?topic=149082.0
- qui una serie di schede by xxxPighi per i collegamenti vari: http://forum.arduino.cc/index.php?topic=146152.0
- qui le pinout delle varie schede by xxxPighi: http://forum.arduino.cc/index.php?topic=151646.0
- qui una serie di link utili: http://forum.arduino.cc/index.php?topic=126861.0

P.S. scusa @Guglielmo se posto qualcosa di simile al tuo, volevo dare anche alcuni link utili nel forum.  :D
my name is IGOR, not AIGOR

gpb01

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 ...  :smiley-roll:

Guglielmo

P.S. : Inoltre il consiglio di "presentarsi" e di leggere il "regolamento" ... erano i primo due punti del mio post ...
Search is Your friend ... or I am Your enemy !

dab77

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:
Code: [Select]
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:
Code: [Select]
// 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:
Code: [Select]
/**
* 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...)

dab77

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...

minimanimo

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..

minimanimo

#10
Mar 07, 2015, 07:33 pm Last Edit: Mar 07, 2015, 07:40 pm by minimanimo
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
Code: [Select]
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 :D
EDIT: Provando invece con la chiavetta blu in dotazione,la scrittura avviene.

alienoide

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
.

gpb01

@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

Search is Your friend ... or I am Your enemy !

alienoide

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

gpb01

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
Search is Your friend ... or I am Your enemy !

Go Up