Wireless control over a long distance with the LoRa modem
Long Range
WiFi is convenient for devices that are in the same house. If you want to extend the distance, give LoRa a call.
Tell LoRa I love her… – Ricky Valence
Some variants of the Raspberry Pi come equipped with WiFi, which make them suitable for wireless data gathering and control applications in certain circumstances. However, the range of WiFi is limited, and it generally requires a WiFi-enabled router issuing IP addresses. Beyond WiFi, a number of standards exist for long range wireless communications in the 868MHz and 915MHz license-free bands that are more suitable for embedded applications. One of these license-free bands is LoRa [1], which is widely used and supported by several silicon implementations. The silicon itself is usually packaged onto modules, which are available for sale in the $20 region. These modules are often further mounted on standard PCBs and offered as development kits by the silicon manufacturers and others. This article describes how to build LoRa into a Raspberry-Pi-based telemetry system and outlines the design of a low-cost HAT for the Pi with an integrated PCB antenna (which you can build for less than $10).
Introducing LoRa
The name LoRa is derived from "Long Range," and long range is indeed one of the system's defining characteristics. One group of users claims to have achieved a 476-mile range with a transmit power of just 25mW [2]. LoRa is also low power. In the license-free ISM bands where LoRa operates [3] [4], maximum power is limited by law. But low power is often also mandated by the need for battery operation or dependence on solar energy at a remote location. So it is this combination of low power and long range that makes LoRa attractive for telemetry applications. Extreme range figures like 476 miles should be examined with a critical eye. These results are typically achieved at high altitudes with line of sight between transmitter and receiver and other optimum conditions. However, in an urban environment, ranges of up to a mile are possible with low cost, compact hardware.
All this performance comes at a price of course, as in general, the laws of physics limit range based on transmitted power, distance, signal-to-noise ratio at the receiver, and bandwidth. The more bandwidth, the more data you can transmit in a given time, and bandwidth is a limited resource. The license-free channel most used in the USA is the 915MHz band, with a bandwidth of 26MHz. This bandwidth is divided into channels, and LoRa can be configured to use channel widths of between 125kHz and 500kHz. LoRa uses spread-spectrum techniques to improve noise immunity (and thus signal-to-noise ratio), and, as a result, those longest range setups using a 125kHz channel width may be limited to data rates of a few bits per second, once packet synchronization, channel usage limits, addressing, and error detection are factored in. (Further information on LoRa modulation is available online [5].) These rates are no good for streaming live audio but are perfect for background data gathering and control. After all, to control a relay state, you simply need to deliver one bit. Similarly, the water level in a tank or reservoir, for example to an accuracy of 1 percent, can easily be expressed in an 8-bit packet. See Wikipedia for some more interesting LoRa application examples [6].
First Steps
To get started with LoRa, I purchased a pair of complete modules manufactured by Semtech. This company holds patents on the LoRa standard, manufactures silicon, and sells development PCBs, as well as accessories. However, Semtech licenses to members of the LoRa alliance, so you will find plenty of alternatives. The module I chose was the SX1272RF1BAS [7], which is available from many distributors. The module is equipped with a 16-pin and a 10-pin header (Figure 1). The modem chip is controlled over a four-wire SPI interface, which is supported by the Raspberry Pi, and it is very easy to connect this module without requiring a soldering iron! The downside is that the modules cost about three times the price of the Raspberry Pi, and, of course, they come with no control or other I/O capabilities. I used some jumper wires designed to push onto the Pi's pins to connect to the modules, using the diagram in Figure 2, which was derived from the datasheets for the Raspberry Pi and the SX1272RF1BAS module.
With two Raspberry Pis connected to two modules, as well as antennas connected and powered up, it is time to fire up some software. Martin Giess's excellent SX1272 test suite [8] is a great place to start. Log onto each Pi and run the following command to download the test suite:
git clone https://github.com/mngiess/lora-sx1272-test.git
Follow the excellent instructions for reference. (Make sure you have the relevant build tools installed for your chosen distro – see the box entitled "Build Tools.") You should end up with a transmitter and receiver application on each Pi. This software expects to find the SX1272RF1BAS module on SPI bus 0, with CS0, and that's how the modules are wired.
Build Tools
On Linux systems with apt
as the repo tool, installing the required build tools is as simple as:
sudo apt-get install build-essential
On Arch Linux systems, enter:
sudo pacman -Sy base_devel
Run the transmitter on one Pi and the receiver on the other. If all goes well, you should see messages on the console of each Pi showing messages being sent by the transmitter and acknowledged by the receiver. That's it. You're up and running with LoRa! Don't forget, because these programs access hardware, they have to run as root.
Hardware Design
The next step is to create a plugin or HAT for the Raspberry Pi. An initial search of the distributors turned up a number of LoRa modules in the price range of $15 to $20. These modules include the SX1272 (or similar) chip, an RF switch (for switching the antenna from RX to TX), and a few passive components. It is not uncommon to find these modules, which are around the size of a large postage stamp, soldered onto a larger PCB to form part of a larger system. But the SX1272 and the antenna switch (PE4259) are available for less than $5. I needed to design a PCB anyway to interface to the Pi, so the module solution seemed overpriced. Certainly, it removes a lot of the uncertainty from the design of the RF part (from the chip to the antenna), but Semtech's website is full of resources, including complete PCB layouts for many of their modules and a lot of technical discussion on good RF layout practice and antenna matching. On top of that, they provide a reference design for a PCB-based antenna.
The resulting compact HAT design has the antenna protruding over the HDMI connector on the Pi, and the RF circuitry itself takes up less than half the HAT PCB area, leaving plenty of space for application-specific circuitry, such as relays or sensor interfaces. This arrangement has the advantage that the whole system can be placed inside a waterproof box for deployment outdoors with no concerns over weatherproofing of the antenna or its cables. It is also much more robust, an advantage in mobile applications. In terms of I/O, the current design simply has two LEDs, as I intended to use external switches and relays in my demonstrator system. I chose to have a local 3.3V power supply derived from the Pi's 5V supply for the modem chip to try to avoid any digital noise from the Pi interfering with the RF signals. The design was implemented using KiCad, an excellent open-source schematic capture and PCB design package that runs on Linux.
The PCB layout is very straightforward (Figure 3), sticking as closely as possible to the RF layout from the SX1272 reference design [9] and the antenna reference design [10]. I increased the physical size of the passive components from 0402 to 0603 to help ease hand-soldering. As I said earlier, the design leaves room for plenty of other circuitry, so it would be easy to modify the existing design to add application-specific circuitry. The one caveat is that the ground plane on the underside of the board forms an integral part of the antenna, so it is a good idea not to pierce it with too many long tracks. The resulting PCB can be assembled by (steady) hand in about half an hour (Figure 4).
Buy this article as PDF
(incl. VAT)