Multiplexing NFC Antennas
A demo project for demonstrating how multiple NFC antennas can easily be driven and multiplexed by a MFRC522 controller and a microcontroller


The cost of a single NFC reader chip such as the MFRC522 - which both I have used in my other projects and is the entry point for many hobbyists - is acceptable in small numbers, but starts to get expensive if you want to have NFC sensing on multiple areas in your projects. And you start to wonder why you can't just have one reader chip and switch between multiple antennas instead. At least that's what I thought. And if you're like me, you start looking around online to see how other people did it. And what you end up finding is lots of people posting on forums asking how to do it, with lots of replies to them on how difficult it is and lots of RF-jargon thrown in. It seems to have had a discouraging effect as there's few actual hobbyist projects that showcase antenna multiplexing. What we're left with it is application notes from vendors that focus on proper 50 ohms lines and matching networks and using expensive RF switches. Which also can feel a bit discouraging, as it becomes expensive and complicated to tailor to your own projects. There's very few quick and easy solutions that's easily adaptable, and very few guides on the topic as well. And that is my motivation for making this demo project - basically showing how easy it can be if you're aware of what you're trading away for the easy of use.
Next I decided to make an interface that works with a Arduino Uno as that's still the starting point for most hobbyists. And if you're skilled enough to use other microcontrollers, you're probably skilled enough to make the necessary adjustments to this project to make it work for you. I also decided to keep using the MFRC522 as the Arduino library and HW interface will likely be the most familiar ones for the majority of hobbyists out there.
Next is deciding the actual multiplexing. To keep the simplicity going, I'm going to use Analog Multiplexers with as low on-channel resistance as I find relatively affordable. When inserting the analog multiplexers right after the matching network, they either completely shut off access to an antenna, or it adds a small resistance between the antenna and the matching network. We remember this blog post where damping resistors are discussed and recognize that the on resistance introduced by the analog multiplexer acts in a similar manner. The impedance matching network implements the impedance transformation from the load impedance to the source impedance, and for a loss-free transformation, all components should be reactive elements. Adding a resisitance introduces in fact a component that has power loss. The drawback of introducing a large value of resistance is that a larger portion of the available power that the NFC chip sends to the antenna is instead used up in the resistance, and the remaining power that reaches the antenna is so reduced that the effective reading distance is greatly reduced. The resistance the analog multiplexer introduces (again, similar to introducing a damping resistor) forms a voltage divider with the impedance of the antenna. The larger the damping resistor is, compared to the impedance of the antenna, the smaller the fraction of power that is delivered to the antenna.
It becomes a cost tradeoff, where lower resistance analog multiplexers are more expensive, but we don't want to choose one that is so expensive that it becomes as expensive (or more expensive) than just throwing in another MFRC522 chip instead. So one analog multiplexer with, say four channels, should be cheaper than four MFRC522 chips and the circuitry needed for them. As typical damping resistors in NFC designs are often 2-4 ohms - that is a good place to start looking. After browsing the JLCPCB Assembly library I found the Analog Devices ADG704BRMZ-REEL7 that provides worst-case of 4 ohm on-channel resistance at room temperature, given a 5V supply voltage. It costs $1.11 at the time of this posts - compared to $3.59 for the MFRC522 chip. It has up to -60dB Off Isolation and 200Mhz bandwidth, which I believe to be sufficient. The capacitive loading also seems to be acceptably low, as a few multiples of ~50 pF probably won't affect the impedance matching network noticeably. Having an Enable/Not-Enable option means many of these could be used as a way to multiplex even more antennas with just adding one more digital signal for each block of four antennas.
It is single channel input with four switchable outputs, so we need two of them in parallell for the differential output of the MFRC522. For this demo project, it's three more antennas for basically only $2.2 more. I'm using four of them in the design, instead of just two, to show how multiple multiplexers is used, providing a starting point for other people that might want to use even more. That gives eight antennas and I've decided to arrange them in a 2x4 grid. Now we're at 7 more antennas for only $4.4 more. Much better than seven more individual readers which would have costed us $3.59 times 7, totaling $25.13!
That gives a starting point for the schematic. We need the MFRC522 chip and control signals for it, as well as the analog multiplexers and control signals for them. Since we're interfacing with a Arduino Uno, and Uno's are 5V devices, we need to divide down the SPI signals from the Uno to the MFRC522 chip. The choices are either a level shifter chip or discrete circuitry. For the utmost simplicity I've just used reistor dividers here as it works with the default low speed SPI signals. If I were to make another project, I'd probably go for a more robust solution that would work well also with faster SPI, but as this is just for demonstrating the multiplexing, it's not really needed in this design. And finally few additional LEDs for showing the state of the multiplexer control signals, along with some WS2812 adresseable RGB LEDs arranged in the same grid as the antennas to better visually demonstrate antenna NFC tag occupancy. The schematic then looks like this:
The PCB design uses a 2-layer stack up where the area not occupied by the antennas employs GND pours on top and bottom layers, and 5V and 3V3 is routed with thick traces on top layer. Signal Routing is done on primarily Top and sparingly on Bottom layer, to keep the ground plane as continuous as possible. The area the antennas occupy are free of any copper except a few signal traces. The antennas are designed in a rectangle shape to provide enough space for routing traces in between the antennas. The width of the antenna tracks and number of turns and spacing between turns is the main factors to use for tuning the impedance of the antenna.
The test is basically hooking up everything and seeing that the multiplexing action work.


I did a second test to time the execution of one full loop and the effect of having/not having a tag present.The code can be found at the bottom of this post. The results showed the following reading speeds/times:
No Tags present: 203 ms
1x Tag present: 307 ms --> 104 ms added for reading tag
2x Tags present: 412 ms --> 105 ms added for reading tag
3x Tags present: 517 ms --> 105 ms added for reading tag
4x Tags present: 621 ms --> 104 ms added for reading tag
5x Tags present: 729 ms --> 108 ms added for reading tag
6x Tags present: 833 ms --> 104 ms added for reading tag
... Ran out of tags - didn't test for 7x and 8x
Giving a accumulated switching time for swithing through all the antennas, and timing out when looking for (and not finding) a tag on each tile, of 203 ms. Thats about 25 ms. each tile. The time spent on a tile if a tag is found goes up from approx. 25 ms. to approx. 130 ms. (25 ms + 105 ms) due to communication with the Tag for reading out the basic ID information. So there's a baseline time for looping over all antennas that is approx 203 ms., and an added time of approx. 105 ms. for each tag present on the antenna matrix. The variance seen through multiple tests is between a minimum of 103 ms and maximum of 110 ms - with 104 ms and 105 ms occuring about 90% - 95% of the time.
Code for occupancy testing:


Code for timing testing:
I wrote some quick code that looped over all 8x antennas and used the on-board WS2812 RGB LED Matrix to show which tile is occupied by which tag-ID and which is not. The tags used are marked with different colors and the tag-ID's are hardcoded in the code with corresponding color, enabling the on-board WS2812 RGB LED Matrix to indicate the occupancy of the individual tags. The code can be found at the bottom of this post
Circuithings
It's all about circuit things.
contact@circuithings.com
© 2025. All rights reserved.
Contact
