Long Range Embedded Systems — Part 2
I’m prepared and now it’s time to test the embedded systems. The challengers are:
Semtech SX1276 Modules
I’ve rounded up 4 representative Semtech SX1276-based modules.
The Pycom LoPy is an embedded module that is based on an ESP32 chipset. It includes Bluetooth (3.0), Wi-Fi, and LoRa. The fully-shielded module comes with a very good custom version of MicroPython preinstalled. The 1.0 LoPy is too memory-constrained although newer Pycom modules (some of which have the same LoRa hardware) are not. It uses an SX1276 chipset internally and a U.Fl antenna connector. They support the +20dBm high power port only. Software is open-source. Hardware is closed-source.
The inAir9B is a Semtech SX1276-based module with shielding. Modtronix (based in Australia) claims excellent RF performance and high-quality components for their open-source module. MicrocontrollerShop is a U.S. distributor. Note that the U.Fl version is only available from Australia, and oddly MicrocontrollerShop solder their pins in upside-down (but you can get it unsoldered). The inAir9B supports the +20dBm high power port only.
I also have some inAir9 modules (lower power) with SMA connectors in the same configuration.
The Heltec LoRa is available very inexpensively via Aliexpress and Amazon. It’s an ESP32-based design with a 0.96" OLED display, a LoRa interface, and WiFi/Bluetooth. All packed into a chip-module. Looking at the implementation it’s hard to imagine RF performance is any good. There’s no shielding, the chip is under the display, and there are very few passive filtering components. One might speculate the SX1276 is a clone, but that’s just speculation.
Hope RFM95-based Modules
I have two distinct RFM95 implementations. The modules are the same so I’d expect similar characteristics. I also have two modules I bought via Digi-Key and sold by RF Solutions that will go into boards soon. We’ll see if they’re all the same.
HopeRF licenses the technology from Semtech and do not use an SX1276. The unshielded close-source RFM95W module is virtually identical to some of the SX127x modules and it is pin- and software-compatible.
I have three RFM95W-based modules to test.
Adafruit Feather M0-LoRa
Two are Adafruit Feather M0-Loras — an M0 with an RFM95W module. One has a wire antenna and one has a U.Fl (with an SMA adapter).
This Feather is a very simple design and the RMF95 output is wire or U.Fl.
Adafruit LoRa RF Featherwing
The Adafruit LoRa Featherwing is an add-on wing for Feathers with an RFM95W module and a switch on it. I’ve soldered on an SMA adapter.
Frequency Accuracy Test
Accurate frequency calibration is critical for reliable LoRa communications. Semtech suggests a misalignment error ≥25% of the LoRa bandwidth will cause total packet failure. In my testing the 25% seems optimistic. Let’s assume 15%.
If you want to really stretch your range and run at (not-recommended) 32.5KHz that’s a maximum misalignment between the two systems of about 5KHz (5PPM at 915MHz)!
When you add in temperature drift issues… factory calibration is important.
Although the inAir9x modules are not precise on frequency, their error is consistent on the low side and so they’ll work ok together (each generation in particular is well-matched with the other) — not so well with other folks. The Heltecs are hit and miss. The RFM95W modules do well here.
[Update]: I have purchased a GPSDO (a very high resolution clock) to calibrate the LimeSDR mini frequency. According to the GPSDO (which is accurate to about 1Hz) the mini error at 915MHz is about 5Hz. So, the values printed above are very accurate.
More interestingly, what we see here I think are production runs of components (with the exception of Heltec and I don’t remember their provenance). Proving that if you want two to talk to each other buy them at the same time.
The Pycom wasn’t usable in this test because it only supports a bandwidth of ≥125KHz — way too high to be useful for this deviation testing in my system.
To test the transmit performance, I created a simple Gnu Radio script that does a moving average on the actual voltage levels. In log form this is power output and in non-log form this is a very accurate voltage meter.
To test the transmitters, I’m running at a bandwidth of 7800Hz. Power is +14dBm for both low and high power systems. The plot looks like this when sending a 915MHz packet every 2 seconds or so.
For this test I connect them to a cable with two attenuators for a 50dB reduction and this feeds into my LimeSDR mini receiver. There are no antenna effects to worry about and the readings are rock-solid consistent (see the photo above).
This test is finding (more than anything) how good the impedance match is to the transmitter. Assuming the chips themselves are as-specified the only difference should be impedance match. To ensure that the SDR input impedance is more-or-less irrelevant the 50dB of couplers reduces any impedance issues at the receiver while ensuring the receiver is not overloaded.
Adafruit RFM95W FeatherWing -- 832
InAir9B SMA -- 811 (-0.2dB)
RFM95W Private(2) -- 805 (-0.3dB)
InAir9B U.Fl -- 800 (-0.3dB)
RFM95W Private -- 770 (-0.6dB
InAir9 -- 740 (-1.0dB)
Heltec Lora -- 495 (-4.5dB)
None of these differences are significant except for the Heltec — which looks mismatched.
The InAir9 is the only tested module that uses the lower power output and I’m running it at the highest power level which may cause compression. The Adafruit FeatherWing has the easiest test setup (it is shown in the circuit photo). The Wing is far from any other signals — unlike the other test setups where the boards are embedded in a larger circuit.
The attenuators I’m using were not expensive. At DC the impedance I manually tested at both ends of the 30dB attenuator was 51 ohms so…
For receiver testing the best equipment would be a good two-port vector network analyzer. Since I don’t have one I connected the Adafruit FeatherWing via cable to the antenna of each unit. The Wing sent constantly while I checked RSSI values for the receiver.
I only tested 4 different units because unfortunately RSSI is an integer value and much lower resolution than my SDR. I used the Adafruit FeatherWing to transmit.
Receiver Signal Level
inAir9 = -43 dB
inAir9B = -42 dB
RFM95W = -43 dB
Heltec Lora = -60 dB
The inAir9B seemed to have a 1dB better match but given how low resolution the reading is, it’s hard to know how much actual difference there was. Most relevant is that all three implementations are very close. The Heltec Lora was 20dB down from the others, not a good result.