开云体育

Locked Re: RFID Connectivity #rfid


 

On Sun, Apr 30, 2023 at 05:38 PM, <stephenjohnson500@...> wrote:
MFRC522, Uno, Ethernet

Tom,

thanks for the latest sketch, which I call v6. Whatever you did fixed the problem, it now just detects the connected readers. I have tried v6 on two Uno/Ethernet combos and they both work.

However (there's always one of those isn't there!), a couple of curious observations. If the sketch is uploaded to just an Uno, it detects the reader(s), but doesn't read tags.. If the sketch is uploaded to an Uno with an Ethernet Shield attached, it detects the reader(s), but doesn't read any tags. If the Uno/Ethernet Shield are now connected to the network, it does work and read tags both with JMRIs network connection and on the Serial Monitor.

I don't yet have a separate power supply for the Uno, so can't check the Serial only with Arduino IDE running as it's two applications trying to use the same Com Port.

I sort of expected the sketch to work in Serial Mode if a) no shield was attached and b) if the shield was attached but not connected to the network. I think this was what was frustrating me yesterday. In the interests of 'one size fits all', it would have been good if the sketch could do this. If not, then we still have the 8 Reader Serial Only sketch to fall back on.

Steve,

Ah yes, the Swiss Army knife. LOL! Ok here you go:

It should now work as expected, with the following behavior:

If an Ethernet shield is not connected or the shield is not connected to the network, the sketch will operate in Serial mode and send tag information to the Serial Monitor.

If an Ethernet shield is connected and the shield is connected to the network, the sketch will operate in both Serial and Ethernet modes, sending tag information to the Serial Monitor and any connected Ethernet clients.

When the sketch is uploaded to an Arduino Nano, Uno or Mega, the LED will blink during startup to indicate the number of detected readers.

Please test the sketch and see if it works as intended in your setup.

// Import Libraries
#include <SPI.h>? ? ? ? ? ?// SPI library for communicating with the MFRC522 reader
#include <MFRC522.h>? ? ? ?// MFRC522 library for reading RFID cards
#include <Ethernet.h>? ? ? // Ethernet library for the Ethernet shield
?
// Ethernet configuration
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
unsigned int serverPort = 8888;? // Replace with the desired port number
EthernetServer server(serverPort);
?
// Define the SS (Slave Select) and RST (Reset) pins for each reader
#if defined(ARDUINO_AVR_UNO) || defined(ARDUINO_AVR_NANO)
const uint8_t ssPins[] = {5, 6, 7, A0, A1, A2};
const uint8_t rstPins[] = {4, 8, 9, A3, A4, A5};
const uint8_t readerAssignment[] = {1, 2, 3, 4, 5, 6}; // Assign reader numbers based on SS and RST pins
#elif defined(ARDUINO_AVR_MEGA2560)
const uint8_t ssPins[] = {5, 6, 7, 8, 9, A0, A1, A2};
const uint8_t rstPins[] = {22, 23, 24, 25, 26, 27, 28, 29};
const uint8_t readerAssignment[] = {1, 2, 3, 4, 5, 6, 7, 8}; // Assign reader numbers based on SS and RST pins
#endif
?
const int numReaders = sizeof(ssPins) / sizeof(ssPins[0]);
const char readerID[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
?
struct RFIDReader {
? char id;
? uint8_t ssPin;
? uint8_t rstPin;
? MFRC522 mfrc522;
? byte nuid[7];
?
? RFIDReader() : id(0), ssPin(0), rstPin(0), mfrc522(MFRC522(0, 0)) {}
};
?
RFIDReader readers[numReaders];
EthernetClient client;
bool isEthernetConnected = false;
?
void setup() {
? Serial.begin(9600);
? SPI.begin();
? pinMode(10, OUTPUT);
? digitalWrite(10, HIGH);
?
? // Set pin 53 as OUTPUT for the Arduino Mega 2560
? #if defined(ARDUINO_AVR_MEGA2560)
? ? pinMode(53, OUTPUT);
? #endif
?
? pinMode(4, OUTPUT);
? digitalWrite(4, HIGH);
?
? if (Ethernet.begin(mac) == 1) {
? ? isEthernetConnected = true;
? ? delay(1000);
? } else {
? ? Serial.println("Ethernet shield not connected or network not available");
? ? isEthernetConnected = false;
? }
?
? for (uint8_t i = 0; i < numReaders; i++) {
? ? readers[i].ssPin = ssPins[i];
? ? readers[i].rstPin = rstPins[i];
? ? readers[i].id = readerID[readerAssignment[i] - 1]; // Assign the reader ID based on readerAssignment array
? ? readers[i].mfrc522 = MFRC522(readers[i].ssPin, readers[i].rstPin);
? ? readers[i].mfrc522.PCD_Init();
? ? readers[i].mfrc522.PCD_SetAntennaGain(readers[i].mfrc522.RxGain_max);
?
? ? // Print debugging information
? ? Serial.print("Reader ");
? ? Serial.print(readers[i].id);
? ? Serial.print(" detected on SS pin ");
? ? Serial.println(readers[i].ssPin);
? }
?
? if (isEthernetConnected) {
? ? server.begin();
? }
?
? // Blink the LED to indicate the number of detected readers
? pinMode(LED_BUILTIN, OUTPUT);
? for (int i = 0; i < numReaders; i++) {
? ? digitalWrite(LED_BUILTIN, HIGH);
? ? delay(300);
? ? digitalWrite(LED_BUILTIN, LOW);
? ? delay(300);
? }
}
?
void loop() {
? if (isEthernetConnected) {
? ? if (!client.connected()) {
? ? ? client.stop();
? ? ? client = server.accept();
? ? ? if (client) {
? ? ? ? Serial.println("Client connected");
? ? ? }
? ? }
? }
?
? for (uint8_t i = 0; i < numReaders; i++) {
? ? if (readers[i].mfrc522.PICC_IsNewCardPresent() && readers[i].mfrc522.PICC_ReadCardSerial()) {
? ? ? for (uint8_t j = 0; j < readers[i].mfrc522.uid.size; j++) {
? ? ? ? readers[i].nuid[j] = readers[i].mfrc522.uid.uidByte[j];
? ? ? }
?
? ? ? byte checksum = readers[i].nuid[0];
? ? ? for (uint8_t j = 1; j < 5; j++) {
? ? ? ? checksum ^= readers[i].nuid[j];
? ? ? }
?
? ? ? // Send output to Serial connection
? ? ? Serial.write(readers[i].id);
?
? ? ? if (isEthernetConnected && client.connected()) {
? ? ? ? // Send output to Ethernet client
? ? ? ? client.write(readers[i].id);
? ? ? }
?
? ? ? for (uint8_t j = 0; j < 5; j++) {
? ? ? ? // Send output to Serial connection
? ? ? ? Serial.print(readers[i].nuid[j] < 0x10 ? "0" : "");
? ? ? ? Serial.print(readers[i].nuid[j], HEX);
?
? ? ? ? if (isEthernetConnected && client.connected()) {
? ? ? ? ? // Send output to Ethernet client
? ? ? ? ? client.print(readers[i].nuid[j] < 0x10 ? "0" : "");
? ? ? ? ? client.print(readers[i].nuid[j], HEX);
? ? ? ? }
? ? ? }
?
? ? ? // Send output to Serial connection
? ? ? Serial.print(checksum < 0x10 ? "0" : "");
? ? ? Serial.print(checksum, HEX);
?
? ? ? if (isEthernetConnected && client.connected()) {
? ? ? ? // Send output to Ethernet client
? ? ? ? client.print(checksum < 0x10 ? "0" : "");
? ? ? ? client.print(checksum, HEX);
? ? ? }
?
? ? ? // Send output to Serial connection
? ? ? Serial.write(0x0D);
? ? ? Serial.write(0x0A);
? ? ? Serial.write('>');
?
? ? ? if (isEthernetConnected && client.connected()) {
? ? ? ? // Send output to Ethernet client
? ? ? ? client.write(0x0D); // CR
? ? ? ? client.write(0x0A); // LF
? ? ? ? client.write('>');? // ETX replaced by '>'
? ? ? }
?
? ? ? readers[i].mfrc522.PICC_HaltA();
? ? ? readers[i].mfrc522.PCD_StopCrypto1();
? ? }
? }
}


Tom

Join [email protected] to automatically receive all group messages.