Yes 👍 — you can often convert the UART version of the Waveshare LoRa HAT into a direct SPI SX1262 board by bypassing the onboard microcontroller. This effectively turns the board into a normal SX1262 radio that works with software like pyMC_Repeater.
I’ll walk you through the concept and the typical modification.
The board we’re talking about is the
Waveshare SX1262 868M LoRa HAT.
The microcontroller translates serial commands into SX1262 SPI commands.
But the SX1262 itself already exposes SPI pins, and the microcontroller is simply sitting between the Pi and the radio.
So the goal is to change it to:
Raspberry Pi │ │ SPI ▼ SX1262
This bypasses the firmware entirely.
2️⃣ Signals the SX1262 needs
The SX1262 requires these lines:
Signal | Purpose
-- | --
MOSI | SPI data from Pi
MISO | SPI data to Pi
SCK | SPI clock
NSS (CS) | chip select
BUSY | radio busy indicator
DIO1 | interrupt line
RESET | reset line
GND | ground
3V3 | power
This makes a big difference for mesh systems.
<html>
3️⃣ What the UART board adds
On the UART HAT, the connections usually look like:
SX1262 <→ SPI <→ MCU <→ UART <→ Raspberry Pi
The MCU controls:
NSS
BUSY
DIO1
RESET
So to convert it, you must connect the SX1262 pins directly to the Pi GPIO header instead of the MCU.
4️⃣ Typical modification method
Most Waveshare LoRa HATs have exposed test pads or vias.
You typically do this:
Step 1 — locate SX1262 SPI pins
On the PCB you’ll find pads labeled something like:
MOSI MISO SCK NSS BUSY DIO1 RESET
Sometimes they are labelled:
SPI_MOSI SPI_MISO SPI_CLK NSS
Step 2 — disconnect MCU SPI lines
You must isolate the MCU so it doesn’t fight the Pi on the SPI bus.
Two common methods:
Option A (cleanest)
Remove the series resistors between MCU and SX1262.
I’ll show you where to modify the board and what signals to wire, based on the typical layout of the Waveshare UART HAT. The board we’re talking about is the Waveshare SX1262 868M LoRa HAT.
First it helps to understand what is actually on that board.
According to the hardware description, the HAT includes:
the SX1262 LoRa radio
a UART interface
a USB-UART chip (CP2102)
a logic buffer (74HC125)
the Raspberry Pi 40-pin connector
So the UART design looks roughly like this:
Raspberry Pi │ │ UART ▼ CP2102 / MCU / logic │ │ SPI ▼ SX1262 radio
The SX1262 itself normally communicates via SPI (MOSI, MISO, SCK, CS) and uses BUSY, RESET, and DIO1 interrupt pins for control.
That means the chip is already wired for SPI internally — we just need to access those signals.
Now the software communicates directly with the SX1262 chip.
5️⃣ What performance improvement to expect
Typical difference:
feature | UART board | SPI mod
-- | -- | --
latency | 10-80 ms | ~2 ms
RSSI accuracy | limited | accurate
PHY control | none | full
mesh reliability | medium | high
This is why most LoRa mesh systems use SPI radios.
6️⃣ Important warning
On many Waveshare boards the resistors are 0402 size, extremely small.
Recommended tools:
fine soldering tip
flux
microscope or magnifier
tweezers
But electrically the modification is simple.
</html>
<html>
<body>
<!--StartFragment--><p data-start="0" data-end="202">I’ll show you <strong data-start="14" data-end="68">where to modify the board and what signals to wire</strong>, based on the typical layout of the Waveshare UART HAT. The board we’re talking about is the<br data-start="161" data-end="164">
<span class="hover:entity-accent entity-underline inline cursor-pointer align-baseline"><span class="whitespace-normal">Waveshare SX1262 868M LoRa HAT</span></span>.</p>
<p data-start="204" data-end="264">First it helps to understand what is actually on that board.</p>
<p data-start="266" data-end="322">According to the hardware description, the HAT includes:</p>
<ul data-start="324" data-end="512">
<li data-section-id="15a24yk" data-start="324" data-end="351">
<p data-start="326" data-end="351">the <strong data-start="330" data-end="351">SX1262 LoRa radio</strong></p>
</li>
<li data-section-id="fkvj5q" data-start="352" data-end="374">
<p data-start="354" data-end="374">a <strong data-start="356" data-end="374">UART interface</strong></p>
</li>
<li data-section-id="17l1csz" data-start="375" data-end="405">
<p data-start="377" data-end="405">a <strong data-start="379" data-end="405">USB-UART chip (CP2102)</strong></p>
</li>
<li data-section-id="83eg7s" data-start="406" data-end="438">
<p data-start="408" data-end="438">a <strong data-start="410" data-end="436">logic buffer (74HC125)</strong></p>
</li>
<li data-section-id="jc7fty" data-start="439" data-end="512">
<p data-start="441" data-end="512">the Raspberry Pi 40-pin connector <span class="" data-state="closed"></span></p>
</li>
</ul>
<p data-start="514" data-end="557">So the UART design looks roughly like this:</p>
<pre class="overflow-visible! px-0!" data-start="559" data-end="670"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div><div class="pt-3"><div class="relative z-0 flex max-w-full"><div id="code-block-viewer" dir="ltr" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span>Raspberry Pi</span><br><span> │</span><br><span> │ UART</span><br><span> ▼</span><br><span>CP2102 / MCU / logic</span><br><span> │</span><br><span> │ SPI</span><br><span> ▼</span><br><span>SX1262 radio</span></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div></pre>
<p data-start="672" data-end="846">The SX1262 itself normally communicates via <strong data-start="716" data-end="745">SPI (MOSI, MISO, SCK, CS)</strong> and uses <strong data-start="755" data-end="795">BUSY, RESET, and DIO1 interrupt pins</strong> for control. <span class="" data-state="closed"></span></p>
<p data-start="848" data-end="943">That means the chip is already wired for SPI internally — we just need to access those signals.</p>
<hr data-start="945" data-end="948">
<h1 data-section-id="1oxqv52" data-start="950" data-end="989">1️⃣ What the board usually looks like</h1>
<p data-start="991" data-end="1022">Typical layout of the UART HAT:</p>
<pre class="overflow-visible! px-0!" data-start="1024" data-end="1372"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div><div class="pt-3"><div class="relative z-0 flex max-w-full"><div id="code-block-viewer" dir="ltr" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span> ┌───────────────────────────┐</span><br><span> │ ANTENNA │</span><br><span> │ │ │</span><br><span> │ SX1262 │</span><br><span> │ │ SPI │</span><br><span> │ 74HC125 buffer │</span><br><span> │ │ │</span><br><span> │ CP2102 UART │</span><br><span> │ │ │</span><br><span> │ Raspberry Pi GPIO │</span><br><span> └───────────────────────────┘</span></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div></pre>
<p data-start="1374" data-end="1400">The key parts to identify:</p>
<ol data-start="1402" data-end="1549">
<li data-section-id="1xh9g7" data-start="1402" data-end="1440">
<p data-start="1405" data-end="1440"><strong data-start="1405" data-end="1422">SX1262 module</strong> (metal RF shield)</p>
</li>
<li data-section-id="amj91x" data-start="1441" data-end="1467">
<p data-start="1444" data-end="1467"><strong data-start="1444" data-end="1455">74HC125</strong> buffer chip</p>
</li>
<li data-section-id="1wmhnz7" data-start="1468" data-end="1495">
<p data-start="1471" data-end="1495"><strong data-start="1471" data-end="1481">CP2102</strong> USB-UART chip</p>
</li>
<li data-section-id="q12lnz" data-start="1496" data-end="1549">
<p data-start="1499" data-end="1549">small <strong data-start="1505" data-end="1549">0402 resistors between SX1262 and buffer</strong></p>
</li>
</ol>
<p data-start="1551" data-end="1585">Those resistors are the SPI lines.</p>
<hr data-start="1587" data-end="1590">
<h1 data-section-id="7kaaeb" data-start="1592" data-end="1624">2️⃣ Signals you need to access</h1>
<p data-start="1626" data-end="1651">The SX1262 pins you want:</p>
<div class="TyagGW_tableContainer"><div tabindex="-1" class="group TyagGW_tableWrapper flex flex-col-reverse w-fit">
SX1262 signal | Connect to Pi
-- | --
MOSI | GPIO10
MISO | GPIO9
SCK | GPIO11
NSS (CS) | GPIO8
BUSY | GPIO20
DIO1 | GPIO16
RESET | GPIO18
</div></div>
<p data-start="3503" data-end="3557">This is why most LoRa mesh systems use <strong data-start="3542" data-end="3556">SPI radios</strong>.</p>
<!--StartFragment--><h1 data-section-id="1dqntce" data-start="1872" data-end="1910">3️⃣ The actual hardware modification</h1>
<p data-start="1912" data-end="1938">There are <strong data-start="1922" data-end="1937">three steps</strong>.</p>
<hr data-start="1940" data-end="1943">
<h2 data-section-id="1q6i7o8" data-start="1945" data-end="1983">Step A — isolate the UART circuitry</h2>
<p data-start="1985" data-end="2025">Locate the <strong data-start="1996" data-end="2016">series resistors</strong> between:</p>
<pre class="overflow-visible! px-0!" data-start="2027" data-end="2051"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div><div class="pt-3"><div class="relative z-0 flex max-w-full"><div id="code-block-viewer" dir="ltr" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span>74HC125 ↔ SX1262</span></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div></pre>
<p data-start="2053" data-end="2076">They usually look like:</p>
<pre class="overflow-visible! px-0!" data-start="2078" data-end="2100"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div><div class="pt-3"><div class="relative z-0 flex max-w-full"><div id="code-block-viewer" dir="ltr" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span>R3 R4 R5 R6</span></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div></pre>
<p data-start="2102" data-end="2122">These correspond to:</p>
<pre class="overflow-visible! px-0!" data-start="2124" data-end="2149"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div><div class="pt-3"><div class="relative z-0 flex max-w-full"><div id="code-block-viewer" dir="ltr" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span>MOSI</span><br><span>MISO</span><br><span>SCK</span><br><span>NSS</span></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div></pre>
<p data-start="2151" data-end="2181">Remove them or cut the traces.</p>
<p data-start="2183" data-end="2230">This disconnects the UART logic from the radio.</p>
<hr data-start="2232" data-end="2235">
<h2 data-section-id="2m7uh0" data-start="2237" data-end="2271">Step B — expose the SX1262 pins</h2>
<p data-start="2273" data-end="2336">Near the SX1262 module you will usually find <strong data-start="2318" data-end="2331">test pads</strong> for:</p>
<pre class="overflow-visible! px-0!" data-start="2338" data-end="2379"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div><div class="pt-3"><div class="relative z-0 flex max-w-full"><div id="code-block-viewer" dir="ltr" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span>MOSI</span><br><span>MISO</span><br><span>SCK</span><br><span>NSS</span><br><span>BUSY</span><br><span>DIO1</span><br><span>RESET</span></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div></pre>
<p data-start="2381" data-end="2469">If they are not labeled, they often appear as <strong data-start="2427" data-end="2446">small gold pads</strong> near the module edges.</p>
<p data-start="2471" data-end="2507">You solder thin wires to those pads.</p>
<hr data-start="2509" data-end="2512">
<h2 data-section-id="pvh8po" data-start="2514" data-end="2550">Step C — wire to the Raspberry Pi</h2>
<p data-start="2552" data-end="2570">Connect like this:</p>
<pre class="overflow-visible! px-0!" data-start="2572" data-end="2605"><div class="relative w-full mt-4 mb-1"><div class=""><div class="relative"><div class="h-full min-h-0 min-w-0"><div class="h-full min-h-0 min-w-0"><div class="border border-token-border-light border-radius-3xl corner-superellipse/1.1 rounded-3xl"><div class="h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback"><div class="pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1"></div><div class="pt-3"><div class="relative z-0 flex max-w-full"><div id="code-block-viewer" dir="ltr" class="q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch ͼ5 ͼj"><div class="cm-scroller"><div class="cm-content q9tKkq_readonly"><span>SX1262 pad → Raspberry Pi</span></div></div></div></div></div></div></div></div></div><div class=""><div class=""></div></div></div></div></div></pre>
<div class="TyagGW_tableContainer"><div tabindex="-1" class="group TyagGW_tableWrapper flex flex-col-reverse w-fit">
Radio | Pi pin
-- | --
MOSI | GPIO10
MISO | GPIO9
SCK | GPIO11
NSS | GPIO8
BUSY | GPIO20
DIO1 | GPIO16
RESET | GPIO18
GND | GND
3V3 | 3V3
</div></div>
<p data-start="3503" data-end="3557">This is why most LoRa mesh systems use <strong data-start="3542" data-end="3556">SPI radios</strong>.</p><!--EndFragment-->
4️⃣ Software configuration after the mod
Enable SPI:
sudo raspi-config
Interface Options → SPI → Enable
Check:
ls /dev/spidev*
Expected:
/dev/spidev0.0
Then configure your radio in your project (for example in pyMC):
{
"radio_type": "sx1262",
"spi_bus": 0,
"cs_pin": 8,
"reset_pin": 18,
"busy_pin": 20,
"irq_pin": 16
}
Now the software communicates directly with the SX1262 chip.
<hr data-start="3559" data-end="3562">
<!--StartFragment--><h1 data-section-id="1c23u1t" data-start="3257" data-end="3301">5️⃣ What performance improvement to expect</h1>
<p data-start="3303" data-end="3322">Typical difference:</p>
<div class="TyagGW_tableContainer"><div tabindex="-1" class="group TyagGW_tableWrapper flex flex-col-reverse w-fit">
feature | UART board | SPI mod
-- | -- | --
latency | 10-80 ms | ~2 ms
RSSI accuracy | limited | accurate
PHY control | none | full
mesh reliability | medium | high
</div></div>
<p data-start="3503" data-end="3557">This is why most LoRa mesh systems use <strong data-start="3542" data-end="3556">SPI radios</strong>.</p>
<!--EndFragment-->
<h1 data-section-id="1pokhu8" data-start="3564" data-end="3587">6️⃣ Important warning</h1>
<p data-start="3589" data-end="3663">On many Waveshare boards the resistors are <strong data-start="3632" data-end="3645">0402 size</strong>, extremely small.</p>
<p data-start="3665" data-end="3683">Recommended tools:</p>
<ul data-start="3685" data-end="3749">
<li data-section-id="dr731e" data-start="3685" data-end="3705">
<p data-start="3687" data-end="3705">fine soldering tip</p>
</li>
<li data-section-id="1j3hq33" data-start="3706" data-end="3712">
<p data-start="3708" data-end="3712">flux</p>
</li>
<li data-section-id="4izm9d" data-start="3713" data-end="3738">
<p data-start="3715" data-end="3738">microscope or magnifier</p>
</li>
<li data-section-id="y0bj6d" data-start="3739" data-end="3749">
<p data-start="3741" data-end="3749">tweezers</p>
</li>
</ul>
<p data-start="3751" data-end="3795">But electrically the modification is simple.</p>
<!--EndFragment-->
</body>
</html>
<!-- github-comment-id:4014651265 -->
Near the 74HC125 chip you will see 4 small resistors in a row.
These correspond to:
MOSI
MISO
SCK
NSS
They are usually labelled something like:
R1
R2
R3
R4
Those resistors connect:
74HC125 → SX1262
What to do
Remove those resistors or cut their traces.
This disconnects the UART circuitry from the radio so the Pi can control it directly.
Step 2 — find the SX1262 SPI pads
Near the SX1262 module you will usually see test pads or vias for the SPI signals.
Typical pads:
MOSI
MISO
SCK
NSS
BUSY
DIO1
RESET
These may appear as small gold circles near the module edge.
Solder thin wires to those pads.
Step 3 — wire them to the Raspberry Pi
Connect like this:
SX1262 signal Raspberry PI
MOSI GPIO10
MISO GPIO9
SCK GPIO11
NSS GPIO8
BUSY GPIO20
DIO1 GPIO16
RESET GPIO18
3V3 3V3
GND GND
These are the standard pins used by most SX1262 drivers.
Now the Pi talks directly to the SX1262 radio chip.
What improvement you get
Compared to UART mode:
Feature
UART
SPI
Latency
10-80 ms
~2 ms
RSSI
unreliable
accurate
Packet control
limited
full
Mesh routing
unstable
stable
Important warning
The resistors on this board are 0402 size (very small).
Recommended tools:
fine soldering tip
flux
tweezers
magnification
But electrically the modification is straightforward.
Great — here is a real board photo and explanation of the parts you need to modify on the
Waveshare SX1262 868M LoRa HAT.
Board overview
https://cdn.mauser.pt/large/product_image/2026/42/3ef7f2dd1577fe2a6fc1332c31c4a661_sx1262-868m-lora-hat-4_3.jpg
https://www.waveshare.com/img/devkit/accBoard/SX1262-868M-LoRa-HAT/SX1262-LoRa-HAT-intro.jpg
https://thinkrobotics.com/cdn/shop/files/sx1262-868m-lora-hat-2_5_535x.jpg?v=1717127669
Main components on the board
From the annotated board image:
SX1262 LoRa module – the RF radio under the metal shield
74HC125 level shifter / buffer – connects logic signals between chips
CP2102 USB-UART chip – converts USB/UART for configuration
Raspberry Pi GPIO header – connection to the Pi
USB port – serial debugging
UART header – external serial control
SMA antenna connector
The board is designed as a UART LoRa modem, not a raw SPI radio.
The UART firmware inside handles LoRa communication and routing.
Where to modify the board
The key path we want to bypass is:
SX1262
│
│ SPI
▼
74HC125 buffer
│
▼
UART/USB logic
│
▼
Raspberry Pi
We want:
Raspberry Pi
│ SPI
▼
SX1262
Step 1 — locate the SPI resistor network
Near the 74HC125 chip you will see 4 small resistors in a row.
These correspond to:
MOSI
MISO
SCK
NSS
They are usually labelled something like:
R1
R2
R3
R4
Those resistors connect:
74HC125 → SX1262
What to do
Remove those resistors or cut their traces.
This disconnects the UART circuitry from the radio so the Pi can control it directly.
Step 2 — find the SX1262 SPI pads
Near the SX1262 module you will usually see test pads or vias for the SPI signals.
Typical pads:
MOSI
MISO
SCK
NSS
BUSY
DIO1
RESET
These may appear as small gold circles near the module edge.
Solder thin wires to those pads.
Step 3 — wire them to the Raspberry Pi
Connect like this:
SX1262 signal Raspberry PI
MOSI GPIO10
MISO GPIO9
SCK GPIO11
NSS GPIO8
BUSY GPIO20
DIO1 GPIO16
RESET GPIO18
3V3 3V3
GND GND
These are the standard pins used by most SX1262 drivers.
Step 4 — enable SPI on the Pi
Run:
sudo raspi-config
Enable:
Interface Options → SPI
Check:
ls /dev/spidev*
You should see:
/dev/spidev0.0
Step 5 — configure your software
Example config for pyMC:
{
"radio_type": "sx1262",
"spi_bus": 0,
"cs_pin": 8,
"reset_pin": 18,
"busy_pin": 20,
"irq_pin": 16
}
Now the Pi talks directly to the SX1262 radio chip.
What improvement you get
Compared to UART mode:
| Feature | UART | SPI |
| -------------- | ---------- | -------- |
| Latency | 10-80 ms | ~2 ms |
| RSSI | unreliable | accurate |
| Packet control | limited | full |
| Mesh routing | unstable | stable |
Important warning
The resistors on this board are 0402 size (very small).
Recommended tools:
fine soldering tip
flux
tweezers
magnification
But electrically the modification is straightforward.
<!-- github-comment-id:4014729146 -->
Yes or there, it's not something I would add currently as it would be very problematic with the guess work of SNR etc but definitely worth a read.
Yes or there, it's not something I would add currently as it would be very problematic with the guess work of SNR etc but definitely worth a read.
<!-- github-comment-id:4034860096 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
This one was foobared... NExt is ok
Yes 👍 — you can often convert the UART version of the Waveshare LoRa HAT into a direct SPI SX1262 board by bypassing the onboard microcontroller. This effectively turns the board into a normal SX1262 radio that works with software like pyMC_Repeater.
I’ll walk you through the concept and the typical modification.
The board we’re talking about is the
Waveshare SX1262 868M LoRa HAT.
1️⃣ Why the modification works
The UART HAT internally looks like this:
The microcontroller translates serial commands into SX1262 SPI commands.
But the SX1262 itself already exposes SPI pins, and the microcontroller is simply sitting between the Pi and the radio.
So the goal is to change it to:
This bypasses the firmware entirely.
2️⃣ Signals the SX1262 needs
The SX1262 requires these lines:
This makes a big difference for mesh systems.
<html>
3️⃣ What the UART board adds
On the UART HAT, the connections usually look like:
The MCU controls:
NSS
BUSY
DIO1
RESET
So to convert it, you must connect the SX1262 pins directly to the Pi GPIO header instead of the MCU.
4️⃣ Typical modification method
Most Waveshare LoRa HATs have exposed test pads or vias.
You typically do this:
Step 1 — locate SX1262 SPI pins
On the PCB you’ll find pads labeled something like:
Sometimes they are labelled:
Step 2 — disconnect MCU SPI lines
You must isolate the MCU so it doesn’t fight the Pi on the SPI bus.
Two common methods:
Option A (cleanest)
Remove the series resistors between MCU and SX1262.
Option B (easier)
Cut the SPI traces.
Typical resistors look like:
between MCU and radio.
Step 3 — wire SX1262 to Raspberry Pi
Example wiring:
These are the same pins used by the SPI version of the board.
<html>5️⃣ Raspberry Pi configuration
Enable SPI:
Verify:
You should see:
6️⃣ Then pyMC works normally
Once wired like a real SX1262 radio you can run:
Now pyMC talks directly to the SX1262, exactly like the supported SPI HAT.
7️⃣ Performance improvement
Compared to UART mode:
This makes a big difference for mesh systems.
8️⃣ One important risk
Some Waveshare UART boards use very tiny 0402 resistors to isolate the SPI lines.
Removing them requires:
fine soldering tip
tweezers
magnification
But electrically the modification is simple.
✅ Good news: most Waveshare boards actually share the same PCB for UART and SPI versions, which means the SX1262 pins are usually easy to access.
</html>I’ll show you where to modify the board and what signals to wire, based on the typical layout of the Waveshare UART HAT. The board we’re talking about is the
Waveshare SX1262 868M LoRa HAT.
First it helps to understand what is actually on that board.
According to the hardware description, the HAT includes:
the SX1262 LoRa radio
a UART interface
a USB-UART chip (CP2102)
a logic buffer (74HC125)
the Raspberry Pi 40-pin connector
So the UART design looks roughly like this:
The SX1262 itself normally communicates via SPI (MOSI, MISO, SCK, CS) and uses BUSY, RESET, and DIO1 interrupt pins for control.
That means the chip is already wired for SPI internally — we just need to access those signals.
1️⃣ What the board usually looks like
Typical layout of the UART HAT:
The key parts to identify:
SX1262 module (metal RF shield)
74HC125 buffer chip
CP2102 USB-UART chip
small 0402 resistors between SX1262 and buffer
Those resistors are the SPI lines.
2️⃣ Signals you need to access
The SX1262 pins you want:
This is why most LoRa mesh systems use SPI radios.
3️⃣ The actual hardware modification
There are three steps.
Step A — isolate the UART circuitry
Locate the series resistors between:
They usually look like:
These correspond to:
Remove them or cut the traces.
This disconnects the UART logic from the radio.
Step B — expose the SX1262 pins
Near the SX1262 module you will usually find test pads for:
If they are not labeled, they often appear as small gold pads near the module edges.
You solder thin wires to those pads.
Step C — wire to the Raspberry Pi
Connect like this:
This is why most LoRa mesh systems use SPI radios.
4️⃣ Software configuration after the modEnable SPI:
sudo raspi-config
Interface Options → SPI → Enable
Check:
ls /dev/spidev*
Expected:
/dev/spidev0.0
Then configure your radio in your project (for example in pyMC):
{
"radio_type": "sx1262",
"spi_bus": 0,
"cs_pin": 8,
"reset_pin": 18,
"busy_pin": 20,
"irq_pin": 16
}
Now the software communicates directly with the SX1262 chip.
5️⃣ What performance improvement to expect
Typical difference:
This is why most LoRa mesh systems use SPI radios.
6️⃣ Important warning
On many Waveshare boards the resistors are 0402 size, extremely small.
Recommended tools:
fine soldering tip
flux
microscope or magnifier
tweezers
But electrically the modification is simple.
</html>Great — here is a real board photo and explanation of the parts you need to modify on the
Waveshare SX1262 868M LoRa HAT.
Board overview
https://cdn.mauser.pt/large/product_image/2026/42/3ef7f2dd1577fe2a6fc1332c31c4a661_sx1262-868m-lora-hat-4_3.jpg
https://www.waveshare.com/img/devkit/accBoard/SX1262-868M-LoRa-HAT/SX1262-LoRa-HAT-intro.jpg
https://thinkrobotics.com/cdn/shop/files/sx1262-868m-lora-hat-2_5_535x.jpg?v=1717127669
Main components on the board
From the annotated board image:
SX1262 LoRa module – the RF radio under the metal shield
74HC125 level shifter / buffer – connects logic signals between chips
CP2102 USB-UART chip – converts USB/UART for configuration
Raspberry Pi GPIO header – connection to the Pi
USB port – serial debugging
UART header – external serial control
SMA antenna connector
The board is designed as a UART LoRa modem, not a raw SPI radio.
The UART firmware inside handles LoRa communication and routing.
Where to modify the board
The key path we want to bypass is:
SX1262
│
│ SPI
▼
74HC125 buffer
│
▼
UART/USB logic
│
▼
Raspberry Pi
We want:
Raspberry Pi
│ SPI
▼
SX1262
Step 1 — locate the SPI resistor network
Near the 74HC125 chip you will see 4 small resistors in a row.
These correspond to:
MOSI
MISO
SCK
NSS
They are usually labelled something like:
R1
R2
R3
R4
Those resistors connect:
74HC125 → SX1262
What to do
Remove those resistors or cut their traces.
This disconnects the UART circuitry from the radio so the Pi can control it directly.
Step 2 — find the SX1262 SPI pads
Near the SX1262 module you will usually see test pads or vias for the SPI signals.
Typical pads:
MOSI
MISO
SCK
NSS
BUSY
DIO1
RESET
These may appear as small gold circles near the module edge.
Solder thin wires to those pads.
Step 3 — wire them to the Raspberry Pi
Connect like this:
SX1262 signal Raspberry PI
MOSI GPIO10
MISO GPIO9
SCK GPIO11
NSS GPIO8
BUSY GPIO20
DIO1 GPIO16
RESET GPIO18
3V3 3V3
GND GND
These are the standard pins used by most SX1262 drivers.
Step 4 — enable SPI on the Pi
Run:
sudo raspi-config
Enable:
Interface Options → SPI
Check:
ls /dev/spidev*
You should see:
/dev/spidev0.0
Step 5 — configure your software
Example config for pyMC:
{
"radio_type": "sx1262",
"spi_bus": 0,
"cs_pin": 8,
"reset_pin": 18,
"busy_pin": 20,
"irq_pin": 16
}
Now the Pi talks directly to the SX1262 radio chip.
What improvement you get
Compared to UART mode:
Important warning
The resistors on this board are 0402 size (very small).
Recommended tools:
fine soldering tip
flux
tweezers
magnification
But electrically the modification is straightforward.
I feel these series of issues would be better suited as a blog post than GitHub issues.
HI, do you mean discussions? Should I create them there?
Yes or there, it's not something I would add currently as it would be very problematic with the guess work of SNR etc but definitely worth a read.