I have a arduino module with antena + mfrc 522 on pcb. Also I build with a microcontroller pic 18f67 an unit drive for mfrc522 in spi mode. But I don’t find an example of source code to activate antenna(tx1, tx2). Can help you with this(but not with arduino!)? Thanks in advance.
Not bumping this thread due to a problem on my end, just wanted to say that thanks to this thread and @peekay123’s library, I was able to get this ebay kit up and running on a Photon in about 4 minutes!
Any future Googlers looking for a quick start, here’s a summary of this thread:
Wiring:
-Function- Photon Pin MRFC522 Pin
Reset ANY (D2) RST
SPI SS ANY (A2) SDA
SPI MOSI A5 MOSI
SPI MISO A4 MISO
SPI SCK A3 SCK
Code:
This will publish an event to the Particle cloud with the ID of whatever device you scan - kind of a RFID hello world, as it doesn’t really do much beyond let you catalog the cards and fobs you have, and ensure you’ve wired it up right. Make sure you add the MFRC522 library through the IDE, I’m not sure how it works if you just paste this with the include statement.
// This #include statement was automatically added by the Particle IDE.
#include <MFRC522.h>
#define SS_PIN A2
#define RST_PIN A1
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup() {
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
mfrc522.PCD_Init();
}
void loop() {
// Look for new cards, if nothing found, quit
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards, if nothing found, quit
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
String cardID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
cardID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
cardID += String(mfrc522.uid.uidByte[i], HEX);
}
Particle.publish("rfid_scan", cardID, 60, PRIVATE);
mfrc522.PICC_HaltA();
}
Now for some RFID fun! Thanks everyone!
This is a great thread and this post really helped me make some progress with my RFID reader project. I’m able to read the tags provided with the RC522 and send the code to my API via a web hook. I’m having a slight issue though and for some reason the reader stops reading after a few minutes. Power cycling the photon resolves the issue and I added some visual confirmation around the Particle.publish by turning on an LED using D0 on the Photon followed by a 1 second delay and then turning it off. The reader is powered by 3 volts power and ground pulled to the left rail with power (D0) and ground for the LED pulled from the Photon. The pins are exactly as they are listed. Does anyone have any ideas on what might by causing this?
Here is my code:
// This #include statement was automatically added by the Particle IDE.
#include <MFRC522.h>
#define SS_PIN A2
#define RST_PIN A1
int led1 = D0;
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup() {
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
mfrc522.PCD_Init();
pinMode(led1, OUTPUT);
}
void loop() {
digitalWrite(led1, LOW);
// Look for new cards, if nothing found, quit
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards, if nothing found, quit
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
String cardID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
cardID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
cardID += String(mfrc522.uid.uidByte[i], HEX);
}
digitalWrite(led1, HIGH);
Particle.publish("MenuItems", cardID, 60, PRIVATE);
mfrc522.PICC_HaltA();
delay(1000);
}
The first thing I’d (always) do is to get rid of all that String
manipulation stuff and use C strings (char[]
)
Instead of
String cardID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
cardID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
cardID += String(mfrc522.uid.uidByte[i], HEX);
}
I’d go for something like
char cardID[32] = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
snprintf(cardID, sizeof(cardID), "%s%02x", cardID, mfrc522.uid.uidByte[i]);
}
// or
char cardID[32] = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
char hex[4];
snprintf(hex, sizeof(hex), "%02x", mfrc522.uid.uidByte[i]);
strncat(cardID, hex, sizeof(cardID));
}
Just out of curiosity, why do you avoid the String class?
@dougal, the String class uses dynamic memory allocation (on the heap). Using a lot of String operations can cause heap fragmentation and cause difficult to trace crashes. On small systems like Particle, there is no garbage collection like on larger systems.
Hello,
i am trying to use the RC522 and the Library with an Particle Electron but without success.
I don´t get any error messages or compiler Errors but the reader doesn’t work.
Is the pinout of the electron different to the photon pinout?
With the Library and an photon, everything is working fine.
Thanks for your help!!!
Regards
Stivi
How are you powering the Electron and the RFID reader?
The most obvious difference is that the Electron only supplies ~3.7V via Vin if not powered via USB but only the LiPo.
Hi,
im powering the Reader and Electron via USB and the LED of the Reader is on…i don´t think its a power problem…
I am using the following pins:
A2 SDA
A3 SCA
A4 MISO
A5 MOSI
D3 RST
and 3V3 and GND
@Stivi, the LED is not a good indicator of power. Can you describe exactly the wiring for the reader. That is, exactly which pins of the Electron you are connecting to which pins of the reader.
What exact board are you using?
If you are using SPI, you should connect SS, SCK, MISO and MOSI
SDA and SCA are for I2C, which are on D0 and D1.
Hence I’m not too positive that this wiring should have worked on the Photon either
And if so, leading us down a wrong track isn’t very helpful
@Stivi, you may want to refer to an earlier post on how to wire and use the board:
Hi,
thanks for the ideas…
I am using the following pins:
A2 SDA
A3 SCA
A4 MISO
A5 MOSI
D3 RST
and 3V3 and GND
and the Code:
// This #include statement was automatically added by the Particle IDE.
STARTUP(cellular_credentials_set("internet.t-mobile","t-mobile" ,"tm" , NULL));
// This #include statement was automatically added by the Particle IDE.
// This #include statement was automatically added by the Particle IDE.
#include <MFRC522.h>
#define SS_PIN A2
#define RST_PIN D3
int led1 = D7;
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
Serial.println("Hello!");
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
Particle.keepAlive(1 * 45 );
pinMode(led1, OUTPUT);
mfrc522.PCD_Init();
}
void loop() {
digitalWrite(led1, LOW);
// Look for new cards, if nothing found, quit
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards, if nothing found, quit
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
String cardID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
cardID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
cardID += String(mfrc522.uid.uidByte[i], HEX);
}
digitalWrite(led1, HIGH);
Particle.publish("rfid_scan", cardID, 60, PRIVATE);
Serial.println(cardID);
mfrc522.PICC_HaltA();
delay(1000);
}
The same code, without
STARTUP(cellular_credentials_set("internet.t-mobile","t-mobile" ,"tm" , NULL));
and
Particle.keepAlive(1 * 45 );
is working on a photon fine (with the same connections to the reader…)
Thanks…
This is the working Setup with Photon:
// This #include statement was automatically added by the Particle IDE.
//STARTUP(cellular_credentials_set("internet.t-mobile","t-mobile" ,"tm" , NULL));
// This #include statement was automatically added by the Particle IDE.
// This #include statement was automatically added by the Particle IDE.
#include <MFRC522.h>
#define SS_PIN A2
#define RST_PIN D3
int led1 = D7;
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
Serial.println("Hello!");
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
//Particle.keepAlive(1 * 45 );
pinMode(led1, OUTPUT);
mfrc522.PCD_Init();
}
void loop() {
digitalWrite(led1, LOW);
// Look for new cards, if nothing found, quit
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards, if nothing found, quit
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
String cardID = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
cardID += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
cardID += String(mfrc522.uid.uidByte[i], HEX);
}
digitalWrite(led1, HIGH);
Particle.publish("rfid_scan", cardID, 60, PRIVATE);
Serial.println(cardID);
mfrc522.PICC_HaltA();
delay(1000);
}
Thanks…
@Stivi, you forgot to mention that you have your Electron plugged into an Asset Tracker Shield
This does change things quite a bit and also counts as leading us on
Asset Tracker Shield already uses A2 as SPI SS for the accelerometer
https://github.com/spark/shields/blob/master/electron-shields/asset-tracker/pdfs/asset-tracker-sch.pdf
You need to select a free pin and assign that as new SS for the RFID reader in your code.
OMG!!! You are right!!
It was my fault!! I defined A1 for SS and now it`s working fine!!!
Sorry about the missing info with the asset tracker.
Thanks a lot!! Have a good day!
Hi all,
I am looking for some help using a Rfid-Rc522 bought on ebay :
I would like to copy this kind of key :
When I use the Rfid library on the Arduino program (windows 7 64bits) I get an error message (rfid_read_personnal_data exemple) :
Card UID: 84 80 98 0B
PICC type: MIFARE 1KB
PCD_Authenticate() failed: Timeout in communication.
PCD_Authenticate() failed: Timeout in communication.
PCD_Authenticate() failed: Timeout in communication.
PCD_Authenticate() failed: Timeout in communication.
PCD_Authenticate() failed: Timeout in communication.
PCD_Authenticate() failed: Timeout in communication.
PCD_Authenticate() failed: Timeout in communication.
PCD_Authenticate() failed: Timeout in communication.
When I use the AddicoreRfid exemple I get this :
For key A :
RFID tag detected
Tag Type: Mifare One (S50)
The tag's number is: 132 , 128 , 152 , 11
Read Checksum: 151
Calculated Checksum: 151
For key B :
RFID tag detected
Tag Type: Mifare One (S50)
The tag's number is: 22 , 222 , 104 , 142
Read Checksum: 46
Calculated Checksum: 46
These readings make me think that my hardware is ok and that my problem comes from libraries.
I have tried the AdafruitPN532 but it says there is a compilation error.
What I am supposed to do?
I have read many posts about this issue and I have tried many libraries and versions of the Arduino program but without success. I really need to copy my key for my son.
Any help will be appreciated...
Are you using a Particle device or compound?
Hi,
No I don’t think so.