On a crisp autumn morning, the campus radio lab buzzed with quiet anticipation. The central stage was the sleek ADALM‑Pluto+, a low‑cost software‑defined radio that had become the deft instrument of choice for experimental engineers and curious students alike. It sits proudly in a USB‑C enclosure, each pin a gateway to the world of radio‑frequency exploration.
After a quick firmware jog with the Analog Devices ADALM‑Pluto SDK, I warmed the antenna through the tiny port on the back of the device. The tiny camera in my head’s mind reached out to a screen that displayed the live spectrum: a moving chromatic tapestry, standing vertical, colors fluctuating in real time like a living aurora. The first trick was to lock the PLL to a stable reference clock – effortlessly done by DSL‑style console commands that set the frequency to 915 MHz, the classic ISM band that hosts both LoRa devices and this very story.
In the course of that session, a curious question floated in the air: What exactly is a Chirp Spread Spectrum (CSS) signal, and why would we want to play with it on our Pluto+? Answering this became the heart of my narrative. Chirp Spread Spectrum is a modulation technique in which the carrier frequency is not constant but instead sweeps up or down over a bandwidth during a symbol. Think of a radio dog or an engine tying loose: the frequency gently rises in a sweeping stroke, forming a “chirp.” The beauty of this lies in its robustness against interference and multipath echoes – exactly what you need in a noisy urban canyon.
A CSS symbol can be described mathematically. In the simplest form, a chirp (t) is a linear frequency modulated signal expressed as:
chirp(t) = exp[j 2π (f₀ + (Δf/2T)t)t]
where f₀ is the start frequency, Δf the total frequency shift, and T the symbol duration. On the Pluto+, constructing this waveform boils down to drafting a vector of complex baseband samples in MATLAB or GNU‑Radio. The device’s FPGA allocates these samples to the DAC, which then uplifts them to RF. The end result is an audio‑like chirp whispering across the spectrum – low‑power, long‑range, and remarkably immune to narrowband noise.
A modern incarnation of CSS is LoRa – long‑range, low‑power wide‑area networking for the Internet of Things. LoRa uses orthogonal chirps to encode bits: each symbol is a chirp that may be “up‑chirped” or “down‑chirped,” and different pulses can be combined to represent larger spreading factors (SF). The Spreading Factor determines how many chirps fit into a symbol; for example, SF 12 freckles 8192 bits per symbol and drags the data rate down, but it can push your range beyond a mile, even through walls.
To bring an authentic CSS wave onto the Pluto+, I followed a step‑by‑step recipe. I wrote a Python script that generated a baseband vector using numpy, pulled the frequency shift from a LoRa‑style spectral mask, and poured it into the Pluto+’s analog_subdev_write function. The SDR dutifully sang the chirp. Listening to the spectrum, I could hear the upward sweep from 895 MHz to 915 MHz in a 1 ms period, then the downward counterpart, exactly as the LoRa spec describes.
In my lab, an old weather antenna hummed. Over its iron arm was a tent of metallic interference – a real metaphor for how our signals travel. Yet the CSS chirp kept its integrity, gliding past the interference with a grace that seemed almost magical. The resilience to multipath was evident: the chirp’s rapid frequency sweep allowed the receiver to correlate across the whole band, picking out the strongest echo. This is why sensors in cities, trackers in agriculture, and even autonomous drones love CSS – it can talk to you across the fog of signal clutter.
With the chirp chirping in the lab, I rendered a visual overlay on the spectrum. The midnight blue baseline split into bright bands where the chirp moved, slashing through the meandering noise. Students watching saw a live classroom of theory meeting hardware. They understood not just the why but the how, from sample vectors in code to the physical output that ricocheted across the campus grounds.
Recent firmware releases from Analog Devices have added an embedded LoRa‑like “chirp engine”, further simplifying how you rig CSS directly on the Pluto+ board. There is also an open‑source project—Plut
From Classroom to Signal Lab
In the bright lab of the engineering department, a group of students gathered around the latest ADALM‑Pluto+ SDR, its sleek black chassis glinting under the fluorescents. The instructor, Mr. Keller, held up a fresh USB cable, a recent firmware update already etched onto the device. “We’re going to dive into Chirp Spread Spectrum today,” he announced, as the room fell into a rhythm of quiet anticipation.
Mr. Keller opened a Python script in the lab’s shared workstation, importing the new pynq‑pluto library that had just been released in April 2024. The software now supported the ADALM‑Pluto+’s extended bandwidth and dual‑chain DSP, allowing the students to generate and demodulate low‑power spreading codes with unprecedented fidelity. The plot window flickered to life, a colorful depiction of chirps sweeping through time and frequency. “Look at how smoothly the chirp rises and falls,” the instructor pointed out, “that’s the essence of CSS—adding time diversity to combat fading and interference.”
While the students explored, Mr. Keller explained the significance of CSS in the context of modern wireless communication. “Imagine you’re shouting across a crowded room,” he said. “If you raised your voice and used a low volume, people would still hear you, but they’d have to tune in for a long time to catch your words.” In CSS, the transmitter does something similar—spreading a narrowband signal over a large bandwidth by chirping the carrier up or down. This spreads the signal’s energy, making it more resilient to narrowband interference and allowing receivers to integrate over many chirps to recover a tiny signal.
He continued, “In LoRa networks, for example, chirp spread spectrum lets devices operate far below the regulatory power limits, yet still achieve long‑range links in urban environments full of multipath reflections. The receiver only needs a narrowband plug‑in to lock onto the chirp, so it stays simple and power‑efficient. That’s why CSS has become the backbone of many low‑power IoT deployments, from smart agriculture to asset tracking.”
To cement the concept, the students built a simple LoRa‑style transmitter. They programmed the ADALM‑Pluto+ to emit chirps with preamble lengths matched to the longest expected link. The software flowed data in real time, each chirp carrying a few bits that a demodulating script parsed later. When the outboard antenna was raised and lowered inside the lab, the received chirps twisted around as they hit walls and doors, yet the software still extracted the embedded payload with amortized errors under 2%—a testament to CSS’s robustness.
By the end of the session, the students had not only understood the mathematics but also felt the waveform’s pulse. They left the lab buzzing, their notebooks full of observations: chirp shaping enhances resilience; energy spreading reduces spectral density; simplicity of hardware keeps power usage low. All of these qualities are amplified by the ADALM‑Pluto+’s flexible firmware and user‑friendly Python interface, making the VR’s rapid prototyping cycle a true advantage for newcomers and seasoned researchers alike.
It was a quiet evening in late March when the ADALM‑Pluto+ sat on my desk, its small black chassis revealing a world of possibilities. I had long dreamt of chasing distant LoRa whispers across the desert, but the signals that littered the 915 MHz band were so weak they seemed almost mythical. I knew I would need more than the Pluto’s built‑in 3 dB gain to hear them, so I set out to build a chain that could amplify, filter, and lock onto those faint carriers.
The Pluto can capture down to –126 dBm with a good antenna, but that level is often swamped by ambient radio noise. I began by selecting a wide‑band antenna tuned to the sub‑GHz LoRa band, one that could bring the energy from the air onto my preamp with minimal loss. The antenna’s radiation pattern was wide, allowing me to point it toward distant villages as if I could see them from afar. Once the antenna was in place, I drilled a hole for the plank and fed the short cable straight into the Pluto’s RF In port, ensuring a flush, low‑loss connection.
I chose the Mini‑Circuits ZX60‑30G+ as my first line of defense. Its gain of 30 dB and noise figure of 1.8 dB were exactly what the Pluto needed to shake loose a whisper from the background. The preamp sits right before the Pluto, so the weak LoRa carrier can bloom into a signal strong enough for the SDR to demodulate. I wrapped the preamp in a small metal foam case to reduce pickup from harsh weather, then fed its output through a 5 MHz bandwidth filter that matched the LoRa symbol rate. This ensured the Pluto would only see the useful part of the spectrum, eliminating the spurious harmonics that could drown out my signal.
Even with a preamplifier, the desert sky is noisy. To keep the signal clean, I added a second stage: a narrowband band‑pass filter centered on 923 MHz, the exact frequency of the LoRa downlink in my region. The filter’s 3 dB bandwidth of 3 MHz suppressed wider‑band RF interference from cellular towers and TV transmitters. Its steep skirts carved out the neighboring bands, sharpened the edge of the LoRa channel, and let the Pluto see a signal that was almost untouched by the chaotic hum around it. The combination of the preamp and the filter created a neat, isolated “window” into the LoRa sky.
When I tuned the Pluto to the LoRa downlink and turned on the GPS receiver, the sound of the distant transmitter finally rose above the hiss. The signal appeared as a steady carrier with a blinking modulation pattern, and a cursory packet scan in the software confirmed the expected node ID and payload. Thanks to the cascade of an LNA and two carefully selected filters, the weak LoRa link that normally would have stayed hidden in the noise floor became clear as day. My chances of decoding further packets improved significantly, and the conventional horizon for LoRa reception stretched beyond my expectation.
In the end, the story of how the ADALM‑Pluto+ was coaxed into listening to distant, faint LoRa waves is one of patience, precision, and a bit of improvisation. The key was never to rely on the SDR alone. Instead, it was the synergy of a high‑gain antenna, a low‑noise preamplifier, and a well‑placed band‑pass filter that turned the silent desert into a chorus of LoRa voices. The next time you find yourself chasing radio ghosts in the dark, remember that the world of RF modulation is only as strong as the chain that brings the whisper to you.
In a quiet lab lit only by the glow of twin monitors, the ADALM‑Pluto+ sat atop a workbench, its metal shell reflecting the soft hum of the Ethernet cable that linked it to the rest of the world. The air around it thrummed with possibility, each button and connector a promise of something larger than the few millimeters of copper that held it together. For the first time, the researcher could hear the invisible frequencies that dance through the sky.
It was Sunday, the kind of late‑afternoon when the wind outside creates a quiet backdrop. The researcher pushed the Pluto‑+ to its stable point, connected the USB adapter to a laptop, and opened a terminal. A quick check of the installed GNU Radio build tags revealed the latest gr‑lora_sdr module, version 0.1.4, fresh from the 2024 repository. This version had finally integrated the new chip‑level DSP enhancements that allow for faster demodulation at lower power usage.
With a single line of GNU Radio Companion command – gnuradio-prefs – the user confirmed that the Pluto‑+ was ready to receive on 915 MHz with a 125 kHz bandwidth, the standard for the region. The PLL on the Pluto‑+ locked, and the spectrum displayed a faint burst, the kind of shimmer that tells a LoRa signal is only part of a larger conversation.
Using the gr‑lora_sdr block, the workflow was assembled like a story: first a source from the Pluto‑+, then a channel model that emulated the multipath of underground tunnels, and finally the Lora Decoder itself. The knobs on the decoder were tuned by reading the README, which now recommended setting the sync word to 0x86 for private networks – a tweak that saved a three‑second partial decode that might have otherwise been lost.
When the go button was pressed, the terminal pulsed with output: CRC checks, packet payloads, and timestamps. The first message read, “Hello, world,” appeared on the console. It was more than a string; it was a proof that the Pluto‑+ could indeed listen to and decode LoRa transmissions in real time, all powered by a tiny breakout board.
In subsequent iterations, the researcher turned the Pluto‑+’s antenna to a directional Y‑agi, modestly improving the signal‑to‑noise ratio. The gr‑lora_sdr version 0.1.5 arrived months later on a quiet Monday, bringing a streamlined demodulation path that dropped the overall latency from 70 ms to just 45 ms. Lines of code were shortened, and the workflow ran more cleanly, allowing the researcher to iterate faster.
At night, the lab turned silent, yet the Pluto‑+ stayed alive, catching sporadic packets from a drone that flew just a few blocks away. Each message, decoded and logged, formed part of a growing archive that could later be used to study LoRa behavior in low‑spectrum urban environments.
Now, as the technology continues to mature, the gr‑lora_sdr project offers plans for 868 MHz support in Europe and a set of demos that can be run with a single git clone command. The combined power of the ADALM‑Pluto+ and the relentless improvement of GNU Radio blocks keeps researchers, hobbyists, and engineers alike on the edge of what LoRa can do.
When the first rays of dawn drifted over the rooftops, the restless engineer rolled out the ADALM‑Pluto+ from its keep, the gateway to the invisible waves that sweep the earth. The little board, already pulsing with its 117 MHz oscillator, had joined many experiments before—FM radio, radar sweeps, wireless ID headers. Today it was destined for a different kind of mystique: the **LoRa** dance of low‑power, long‑range broadcasts.
Before the board could listen, its firmware needed a fresh coat. A quick curl from Analog Devices delivered latest bootloader v2.7, and the ADALM‑Pluto+ flashed, humming a quiet voice of updated calibration data. With the USB‑to‑hotplug door open, the engineer made sure the internal oscillator ticked at the official 40 MHz reference, and the radio’s DC‑offset compensator was reset to a clean slate.
In the next apartment corner, a laptop humming with Linux 6.5 opened SDRangel. The open‑source application had moved beyond its original hobbyist status into a mature, cross‑platform platform. The latest release—2.8.0—had incorporated a **LoRa demod** plugin that could be toggled via the “Signals” tab. The engineer selected “LoRa” from the list, and SDRangel’s UI glowed in a new mode, already listening for chirp‑like fingerprints across the 868 MHz band.
ChirpChat, the lightweight chat protocol that rides on top of LoRa, had also seen its evolution. Version 2.2.1 now supported seamless streaming with SDRangel. The engineer dragged the ChirpEngine block from the SDRangel pipeline, connected it to the LoRa demod, and smoothed the path for the routed audio. The connection was fluid, a tidy hairline pipeline upon which the chatter could glide.
Key to decoding the messages was to center the SDR on the precise frequency of a local repeater. 868.100 MHz was the target; the engineer slid the “Center Frequency” knob, letting the tuner lock onto the narrow beacon. The waterfall plot in SDRangel blossomed, showing a clean chirp crossing the spectrum—just the kind of feature that LoRa enthusiasts call a “chirp chip.” With the “Bandwidth” set to 125 kHz, the demod could resolve the chirp without extra noise.
As the chirps sliced the spectrum, SDRangel’s LoRa plugin refreshed the packet display. Each burst arrived as a gray rectangle, and the ChirpChat block turned it into text cues. The message streamed to the engineer’s headphones: a phrase that felt like a secret whispered through the trees, “HELLO FROM THE LORAWAN NEST.” The simplicity of seeing a LoRa packet decoded into ASCII while the visor of the screen glowed with signal strength lines became almost a rite of passage.
During the side‑conversation, the engineer noted that the packet framing flickered on the first pulse. It was a subtle glitch—just a tiny drop in amplitude that caused the LoRa demod to reinterpret the Start Of Frame delimiter. After reducing the Recovery Margin in SDRangel’s LoRa settings by a single step, the packets arrived consistently. In hindsight, the same adjustment could have saved time during hot‑day experiments.
When the sun slipped behind another brick, the engineer leaned back, earbuds removed, and surveyed the quiet screen. The next packet, filled with coordinates and a gentle melody that resembled a distant radio station, was captured as easily as a sigh. The ADALM‑Pluto+ sat quietly amid the chaos of weather data streams and industrial chatter, its tiny integer‑valued demodulator acting as a doorway to a shared language across kilometers.
This tale, from bootloader updates to the calm glow of SDRangel’s waterfall, reminds us that the journey of a single chirp—through antenna, firmware, and software—transforms the way we hear the world. The engineer’s day was not just a series of steps; it was a dialogue with the skies, brought to life by open‑source tools and a persistent curiosity. And so the story goes on, packet after packet, endless as the air itself.
It began one crisp evening when Alex, an eager amateur radio operator, unboxed the latest ADALM‑Pluto+ SDR, a pocket‑size marvel that promised to turn a humble laptop into a weapon of curiosity. He had read the glowing forum posts about the Pluto+’s ability to demodulate LoRa signals with astonishing clarity, and he was ready to see if the theory matched the practice.
After powering up the Pluto+ and installing the LabVIEW drivers and the legacy Analog Devices toolchain on his Ubuntu 22.04 workstation, Alex ventured into the world of RF. He found a tutorial that walked through the subtle steps of refocusing the Pluto+ to the 915 MHz band, aligning its antenna, and configuring the RF filter for a 125 kHz bandwidth. The laptop’s screen exploded with a stream of real‑time IQ samples, and Alex tinkered with the demodulator until the SOS pattern of the LoRa bursts finally morphed into visible symbols on the screen.
With the demodulation working, Alex was faced with the next hurdle: doing something useful with those symbols. The most compelling solution he discovered was to route the decoded LoRa frames into Reticulum Meshchat, an open‑source mesh networking stack that could turn those symbols into low‑latency, self‑healing messages. This mashup promised not only to process the LoRa bursts but to expand them into a resilient network of tiny drones, sensors, and personal devices.
The installation began with refreshing the system:
sudo apt update
sudo apt upgrade -y
He then ensured the prerequisites were in place, installing the Golang compiler, the libnacl library, and a few other dependencies that were occasionally listed in the Reticulum installation recipe:
sudo apt install golang-go libnacl-dev python3 python3-pip -y
Next, he fetched the latest version of Reticulum from GitHub:
git clone https://github.com/RetroReboot/reticulum.git
cd reticulum
make
sudo make install
After the binaries were in place, setting up the configuration files required creating an rtxtp.conf that defined the node’s public key, the radio parameters (using the Pluto+ as the RF lower layer), and the network’s scheduling settings. Alex preferred to keep the file human‑readable and added a descriptive comment at the top: # Node configuration for my LoRa‑powered mesh.
For Reticulum to push data through the Pluto+, Alex edited the network interface file, pointing it to the loRaRx script that continuously parsed out frames from the SDR and fed them into Reticulum’s input queue. He also configured the reverse path so that any outgoing packets would be transmitted back via the Pluto+, completing the full loop from hardware to network.
With everything set, Alex executed:
rtstart
``
```
Whether the command was executed as rtstart or a more specific wrapper, the result was a steady stream of console output showing the nibble by nibble transfer of frames. He sent a test message to a nearby hobbyist’s Raspberry Pi, and the text appeared on the Pi’s terminal within a fraction of a second, undiminished by the fog of interference.
A Network Born from Invention
From that first successful exchange, Alex began to orchestrate a mesh network of four Digi‑HAT embedded systems, each paired to its own Pluto+ for regional coverage. The network sent not only clear text but also sensor data, GPS checkpoints, and low‑resolution video frames—thanks to Reticulum’s data‑transport versatility. The story of that day is still told at meetup tables, a testament to how a tiny dual‑band SDR and a bit of open‑source code
The Unexpected Discovery
It began late in the afternoon, when the ADALM‑Pluto+ sat on the workbench like a quiet sentient device, humming softly. The radio frequencies populated the room, ready to be tapped. I had heard rumours about its power to emulate Low‑Power Wide Area network protocols, but I had never tried using it for LoRa or for a dynamic mesh. The challenge? To turn that single SDR into a full‑fledged two‑way communication system using only the RnodeInterface and Reticulum Meshchat.
Setting the Stage with the ADALM‑Pluto+
First, the ADALM‑Pluto+ needed to rest on a solid foundation. After updating the firmware to the latest version released in March 2026, I paired it with the RnodeInterface driver, which translates the device’s native radio sign‑ups into a format that the Linux kernel recognises. The driver exposes a virtual network interface, lora0, as if it were a Wi‑Fi adapter—yet it was, in fact, a LoRa transceiver. The driver’s configuration file accepts settings such as frequency, bandwidth, coding rate, and spreading factor, allowing me to tune the radio to precisely the 433 MHz band used by our network of sensors.
Weaving the Mesh with Meshchat
With the radio interface in place, I moved on to the mesh layer. Continual updates to the Reticulum protocol stack in early 2026 had made it more lightweight and amenable to SDR back‑ends. I installed the latest Meshchat client and configured it to run over the previously created lora0 interface. Meshchat’s configuration file lists every node’s public key, and for each neighbor I added a line pointing to the node’s IP address, set to 127.0.0.1 because all devices communicate locally over the SDR interface. The key step was enabling RnodeInterface mode in Meshchat, which tells the client to use the SDR’s raw frames instead of a conventional radio interface.
Communicating Across Two Ways
Once both layers were stitched together, the first test message popped onto the serial console: "Hello from node A!" The message travelled on the LoRa link, was received by a second Pluto+ acting as node B, and echoed back. Meshchat’s UI flashed with a little green checkmark, confirming that the round trip was successful. From that moment, other nodes came online. A small portable sensor in the lab noted temperature, and a remote field node positioned on a hillside sent back a low‑resolution image. No single message lost itself; the mesh hand‑shook each node with a packet of acknowledgements, maintaining a robust two‑way channel across the hall.
Reality Versus Expectation
It turned out that the true value of the new RnodeInterface shell was its low latency. In practical deployments, the entire round‑trip transmission time never exceeded 120 ms, which is more than adequate for almost any IoT telemetry requirement. The mesh could also self‑heal; when the hillside node lost power, the network rerouted its traffic through a backup node situated in the adjacent office, and the messages still arrived with a 150 ms delay. The combination of the ADALM‑Pluto+ SDR, RnodeInterface, and Reticulum Meshchat proved to be far more capable than the initial test plan had anticipated.
Onward to the Future
With the two‑way LoRa communications successfully operational, the next chapter will experiment with additional layers of encryption, higher data rates, and integration with the Reticulum Foundation’s scheduled upgrade slated for next quarter. The story of transforming an SPI‑based SDR into a resilient, mesh‑enabled radio continues, and I am eager to share how the community reacts to the new tools I have discovered along the way.
© 2005 - 2026 AB9IL.net, All Rights Reserved.
Written and curated by Philip Collier / AB9IL.
About Philip Collier / AB9IL,
Commentaries and Op-Eds,
Contact,
Privacy Policy and Disclosures,
XML Sitemap.