reading from multiple RFID readers from using one Arduino

Some of you may remember me from my old, incredibly botched code, found here: forum.arduino.cc/index.php?topic=603444.0
I started a different, more imperative project, so I left of on this for a while. I did not gain any new Arduino information, but I did learn how to use Imagej and ffmpeg, so that’s a plus :slight_smile: . I am currently using an Arduino mega2560 (through COM7), with Arduino IDE 1.8.8, on windows 7. I am using the ID-20LA Innovations RFID reader.

Coming back to this project has left me completely lost. I found an example script which may work better for my purposes than my old, broken code:

/*
 Software serial multiple serial test

 Receives from the two software serial ports,
 sends to the hardware serial port.

 In order to listen on a software port, you call port.listen().
 When using two software serial ports, you have to switch ports
 by listen()ing on each one in turn. Pick a logical time to switch
 ports, like the end of an expected transmission, or when the
 buffer is empty. This example switches ports when there is nothing
 more to read from a port

 The circuit:
 Two devices which communicate serially are needed.
 * First serial device's TX attached to digital pin 10(RX), RX to pin 11(TX)
 * Second serial device's TX attached to digital pin 8(RX), RX to pin 9(TX)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created 18 Apr. 2011
 modified 19 March 2016
 by Tom Igoe
 based on Mikal Hart's twoPortRXExample

 This example code is in the public domain.

 */

#include <SoftwareSerial.h>
// software serial #1: RX = digital pin 10, TX = digital pin 11
SoftwareSerial portOne(10, 11);

// software serial #2: RX = digital pin 8, TX = digital pin 9
// on the Mega, use other pins instead, since 8 and 9 don't work on the Mega
SoftwareSerial portTwo(8, 9);

void setup() {
 // Open serial communications and wait for port to open:
 Serial.begin(9600);
 while (!Serial) {
 ; // wait for serial port to connect. Needed for native USB port only
 }


 // Start each software serial port
 portOne.begin(9600);
 portTwo.begin(9600);
}

void loop() {
 // By default, the last intialized port is listening.
 // when you want to listen on a port, explicitly select it:
 portOne.listen();
 Serial.println("Data from port one:");
 // while there is data coming in, read it
 // and send to the hardware serial port:
 while (portOne.available() > 0) {
 char inByte = portOne.read();
 Serial.write(inByte);
 }

 // blank line to separate data from the two ports:
 Serial.println();

 // Now listen on the second port
 portTwo.listen();
 // while there is data coming in, read it
 // and send to the hardware serial port:
 Serial.println("Data from port two:");
 while (portTwo.available() > 0) {
 char inByte = portTwo.read();
 Serial.write(inByte);
 }

 // blank line to separate data from the two ports:
 Serial.println();
}

so I have a couple of questions.

  1. How would I go about expanding this code to include 8 or more RFID readers per arduino? Is that even possible?

  2. My old code included a reset pin for the RFID readers. Must I include that in this new script? If so, can I just do a copy&paste, including the void setup info, or must something new be written?

  3. Since I am using the mega, there is only certain pins that work, so 8 and 9 are out. I am opting for pins (50, 51). Since my RFID readers only transmit read tags, do I put the pins into the RX or TX pins? Is there anything that I put into the TX pin? Am I completely confusing the two?

  4. related to the above, the description switches around RX and TX multiple times, so I am unsure about where exactly each one goes. Is it possible to for someone to draw up a correct wiring diagram for me?

As of now, the code runs, and outputs the strings “Data from…” into the serial monitor. However, holding an RFID tag to the readers does not change the output at all. What am I missing?

The ATMega2560 has four hardware serial ports. You can connect at least 4 ID2s each to their own hardware serial line.

If you can be sure that no two readers will read a tag at the same time, then it might be feasible to use some OR/AND gates to OR/AND together the serial TX lines from a number of ID2s and feed it to a single RX line on the ATMega2560. As long as all of the other modules are quiet when one reads out a tag, you'll receive the read signal okay. But you won't know which one sent the signal.

In "magnetic emulation" mode, the ID2 generates a card-present signal along withe clock and data. You could wire the card-present signal to one of N input pins to know which reader is which, and muliplex together the clock and data into a single software receiver on the ATMega.

edit: I think the idle level on TTL Serial is "high" so an AND is needed

I appreciate the help, but that's a bit above my level. Know of any links to read up on this stuff?

EDIT: I did a little reading, and this does help me with one of the problems. However, the rest of the code doesn't work at all, and I don't have the knowledge necessary to fix it.

any and all help is welcome, as I am completely stuck in a rut.

Well, let’s start by using the 4 serial ports on your Arduino Mega. Have a look at this tutorial and use this approach to wire let’s say 3 ID2 units up using Serial1, Serial2, Serial3. By using only three at first, you can use the main Serial interface for debugging. Have a look at this tutorial: https://www.arduino.cc/en/Tutorial/MultiSerialMega

Once your code is working, you can use all four and if you still need debug output, put that on a software serial output.

If you want to try the approach of multiplexing TTL serial, then you’re going to need an AND gate – a 2-input AND gate like a 74LS0. You can connect the two ID2 TX lines to the two inputs of an AND gate and the output of that to the serial input of one of your serial ports and then experiment with how that works.

An AND gate us suitable because when the TTL serial signal is idle, it remains at a HIGH logic level. If one ID2 is idle, then the other will be transmitting a series of HIGH/LOW and the output of the AND gate will be the same sequence of HIGH/LOW to pass along the serial signal.

  1. How would I go about expanding this code to include 8 or more RFID readers per arduino? Is that even possible?

It is possible but is a bit tricky. See this Creating a new Serial | Using ATSAMD21 SERCOM for more SPI, I2C and Serial ports | Adafruit Learning System

or this one MAX3100 SPI/MICROWIRE-Compatible UART in QSOP-16 | Maxim Integrated