Blame

2f506a Peter van Dijk 2026-01-28 19:04:41 1
# Nebra Outdoor
f3238b Peter van Dijk 2026-01-28 19:05:57 2
e3ce59 Peter van Dijk 2026-01-29 20:16:55 3
## wio sx1262 board on 'hat' header, for pymc_repeater or meshtasticd/meshcored
120e05 Peter van Dijk 2026-01-28 20:01:07 4
5
[![Wio sx1262 (from esp+wio kit) connected to Nebra pin header](./nebra-pinheader-sx1262-photo.jpg?thumbnail=250)](./nebra-pinheader-sx1262-photo.jpg)
6
[![pinout note for sx1262 on nebra pin header](./nebra-pinheader-sx1262-pinout-note.jpg?thumbnail=250)](./nebra-pinheader-sx1262-pinout-note.jpg)
0dbaa3 Bram van de Burgt 2026-01-30 18:34:56 7
[![Wiring diagram](./JPEG_image-462F-9A3F-2D-0.jpeg?thumbnail=250)](./JPEG_image-462F-9A3F-2D-0.jpeg)
3b35c1 Bram van de Burgt 2026-01-30 18:43:05 8
[![Wio sx1262 connected to Nebra pin header, with USB cable for wifi](./IMG_6183.jpg?thumbnail=250)](./IMG_6183.jpg)
9
120e05 Peter van Dijk 2026-01-28 20:01:07 10
11
This pinout is inspired by/compatible with the [Zebra Hat](https://github.com/wehooper4/Meshtastic-Hardware/tree/main/ZebraHAT). The Zebra Hat is different from other LoRa hats because it considers the limited number of actually connected pins in the Nebra miner. By being compatible with that board, after connecting all the wires, [pyMC_Repeater](https://github.com/rightup/pyMC_Repeater) just works when picking the Zebra Hat board type.
12
13
Full pinout description (you can use [pinout.xyz](https://pinout.xyz/pinout/spi) instead of the second photo above):
14
769cae Peter van Dijk 2026-01-28 20:08:32 15
| SX1262 pin | Nebra/Pi GPIO number | Nebra/Pi pin name | Nebra/Pi pin number |
16
| -------- | -------- | -------- | -------- |
17
| GND | - | Ground | 9 or [some other ground pin](https://pinout.xyz/pinout/ground) |
18
| RST | 17 | GPIO 17 | 11 |
19
| BUSY | 27 | GPIO 27 | 13 |
20
| DIO1 | 22 | GPIO 22 | 15 |
21
| 3V3 | - | 3v3 Power | 17 or 1 |
22
| MOSI | 10 | SPI0 MOSI | 19 |
23
| MISO | 9 | SPI0 MISO | 21 |
24
| SCK | 23 | SPI0 SCLK | 23 |
25
| NSS | 24 | GPIO 24 | 18 |
26
27
If you use 17 and 9 for 3V3 and GND, all pins are in a single straight line except for the NSS one on GPIO24.
28
SX1262 RF_SW, VIN, and pins like D5, D6, D7, do not need to be connected.
120e05 Peter van Dijk 2026-01-28 20:01:07 29
132341 Bram van de Burgt 2026-01-30 18:32:53 30
During pyMC_Repeater install, select the first radio config, then in `/etc/pymc_repeater/config.yaml` set this config and restart the service:
31
```
32
sx1262:
33
# SPI bus and chip select
34
bus_id: 0
35
cs_id: 0
36
# GPIO pins (BCM numbering)
37
cs_pin: 24
38
reset_pin: 17
39
busy_pin: 27
40
irq_pin: 22
41
# TX/RX enable pins (-1 to disable)
42
txen_pin: -1
43
rxen_pin: -1
44
# LED pins for TX/RX indication (-1 to disable)
45
txled_pin: -1
46
rxled_pin: -1
47
use_dio3_tcxo: true
48
tx_power: 18
49
# Waveshare hardware flag
50
is_waveshare: false
51
```
f2707f Bram van de Burgt 2026-01-30 19:05:01 52
[Source](https://github.com/wehooper4/Meshtastic-Hardware/blob/main/ZebraHAT/readme.md#meshcore-usage)
132341 Bram van de Burgt 2026-01-30 18:32:53 53
f2707f Bram van de Burgt 2026-01-30 19:05:01 54
In `/etc/pymc_repeater/config.yaml` you can add this to make the repeater only monitor but not forward on startup:
55
```
56
repeater:
57
mode: monitor
58
```
132341 Bram van de Burgt 2026-01-30 18:32:53 59
e3ce59 Peter van Dijk 2026-01-29 20:16:55 60
This setup also [works](https://github.com/meshcore-dev/MeshCore/pull/1137#issuecomment-3819952554) with [meshcored](https://github.com/meshcore-dev/MeshCore/pull/1137) with this `meshcored.ini` snippet:
61
62
```
63
lora_irq_pin = 22
64
lora_reset_pin = 17
65
lora_nss_pin = 24
66
lora_busy_pin = 27
67
```
68
f3238b Peter van Dijk 2026-01-28 19:05:57 69
# unsorted notes, to be sorted
70
71
via https://helium.nebra.com/datasheets/hotspots/outdoor/Nebra%20Outdoor%20Hotspot%20Datasheet.pdf
72
73
has two:
74
75
> Lora Module Connector - Designed for use with select M-PCIE LoRa Concentrators, these only have wired up SPI, plus GPS PPS from the GPS Module
76
77
it also has one slot with just USB wired up (and the SIM and ....)
78
79
But now I wonder if we can replace the entire Pi CM(3) daughterboard with some esp or nrf plus semtech 1262 kit to even avoid the power draw of a pi - depending on use case, of course. Answer: we can remove the cm3 and still get all power pins.
80
81
https://github.com/wehooper4/Meshtastic-Hardware/tree/main/NebraHat
82
83
https://github.com/wirenboard/atecc-util
84
85
https://github.com/pinztrek/nebra-hnt-meshtasticd - mentioned waveshare board might be https://www.waveshare.com/sx1262-868m-lora-hat.htm, also https://m.youtube.com/watch?v=hJv9Xv6PUJ4 plus https://www.youtube.com/watch?v=OrHVr8An9Io
86
87
https://meshtastic.org/blog/a-major-solution-to-a-miner-problem/
88
89
### usb hub (bt/wifi) daughter board
90
91
appears to get usb over an actual usb cable from a usb port on the mainboard. the 40 pin header only appears to have a few pins connected:
92
93
* 1 (3v3), going to ECC1 and other things
94
* 22 (gpio25, going to LED1)
95
* 17? going to a button
96
* two more low-numbered pins going to ECC1, probably 2 (I2C1 SDA) and 3 (I2C1 SCL)
97
98
### exar ethernet/i2c/gpio
99
100
```
101
Bus 001 Device 005: ID 04e2:1300 Exar Corp. XR2280x 10/100 Ethernet
102
Bus 001 Device 006: ID 04e2:1100 Exar Corp. XR2280x I2C Controller
103
Bus 001 Device 007: ID 04e2:1200 Exar Corp. XR2280x GPIO Controller
104
```
105
106
107
108
### power draw
109
110
each section here is an incremental change from the previous one
111
112
#### stock miner, BT dongle removed, heltec v3 plugged in
113
114
5-7W
115
116
```
117
peter@tabantha:~ $ lsusb -t
118
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=dwc_otg/1p, 480M
119
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
120
|__ Port 001: Dev 003, If 0, Class=Hub, Driver=hub/7p, 480M
121
|__ Port 001: Dev 005, If 0, Class=Communications, Driver=cdc_ether, 480M
122
|__ Port 001: Dev 005, If 1, Class=CDC Data, Driver=cdc_ether, 480M
123
|__ Port 006: Dev 006, If 0, Class=Human Interface Device, Driver=usbhid, 480M
124
|__ Port 007: Dev 008, If 0, Class=Human Interface Device, Driver=usbhid, 480M
125
|__ Port 003: Dev 004, If 0, Class=Hub, Driver=hub/4p, 480M
126
|__ Port 001: Dev 007, If 0, Class=Vendor Specific Class, Driver=rtl8xxxu, 480M
127
|__ Port 002: Dev 009, If 0, Class=Vendor Specific Class, Driver=cp210x, 12M
128
```
129
130
#### remove wifi
131
132
4W
133
134
```
135
peter@tabantha:~ $ lsusb -t
136
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=dwc_otg/1p, 480M
137
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
138
|__ Port 001: Dev 003, If 0, Class=Hub, Driver=hub/7p, 480M
139
|__ Port 001: Dev 005, If 0, Class=Communications, Driver=cdc_ether, 480M
140
|__ Port 001: Dev 005, If 1, Class=CDC Data, Driver=cdc_ether, 480M
141
|__ Port 006: Dev 006, If 0, Class=Human Interface Device, Driver=usbhid, 480M
142
|__ Port 007: Dev 008, If 0, Class=Human Interface Device, Driver=usbhid, 480M
143
|__ Port 003: Dev 004, If 0, Class=Hub, Driver=hub/4p, 480M
144
|__ Port 002: Dev 007, If 0, Class=Vendor Specific Class, Driver=cp210x, 12M
145
```
146
147
#### remove heltec
148
149
4-5W
150
151
```
152
peter@tabantha:~ $ lsusb -t
153
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=dwc_otg/1p, 480M
154
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
155
|__ Port 001: Dev 003, If 0, Class=Hub, Driver=hub/7p, 480M
156
|__ Port 001: Dev 005, If 0, Class=Communications, Driver=cdc_ether, 480M
157
|__ Port 001: Dev 005, If 1, Class=CDC Data, Driver=cdc_ether, 480M
158
|__ Port 006: Dev 006, If 0, Class=Human Interface Device, Driver=usbhid, 480M
159
|__ Port 007: Dev 008, If 0, Class=Human Interface Device, Driver=usbhid, 480M
160
|__ Port 003: Dev 004, If 0, Class=Hub, Driver=hub/4p, 480M
161
```
162
163
#### remove usb daughterboard (the one with bt/wifi labels on it) from pin header
164
165
3.5-6W
166
167
```
168
peter@tabantha:~ $ lsusb -t
169
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=dwc_otg/1p, 480M
170
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
171
|__ Port 001: Dev 003, If 0, Class=Hub, Driver=hub/7p, 480M
172
|__ Port 001: Dev 005, If 0, Class=Communications, Driver=cdc_ether, 480M
173
|__ Port 001: Dev 005, If 1, Class=CDC Data, Driver=cdc_ether, 480M
174
|__ Port 006: Dev 006, If 0, Class=Human Interface Device, Driver=usbhid, 480M
175
|__ Port 007: Dev 007, If 0, Class=Human Interface Device, Driver=usbhid, 480M
176
|__ Port 003: Dev 004, If 0, Class=Hub, Driver=hub/4p, 480M
177
```
178
179
#### also remove it from usb socket
180
181
```
182
peter@tabantha:~ $ lsusb -t
183
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=dwc_otg/1p, 480M
184
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
185
|__ Port 001: Dev 003, If 0, Class=Hub, Driver=hub/7p, 480M
186
|__ Port 001: Dev 005, If 0, Class=Communications, Driver=cdc_ether, 480M
187
|__ Port 001: Dev 005, If 1, Class=CDC Data, Driver=cdc_ether, 480M
188
|__ Port 006: Dev 006, If 0, Class=Human Interface Device, Driver=usbhid, 480M
189
|__ Port 007: Dev 007, If 0, Class=Human Interface Device, Driver=usbhid, 480M
190
191
```
192
193
#### pop cm3 out of socket
194
195
1.5-3W
196
197
#### connect usb daughterboard back (just on usb, not pin header), with heltec connected to it
198
199
3.5W (the heltec works)
200
201
#### remove everything that is unpluggable
202
203
unifi refuses to measure
204
205
#### plug heltec in mainboard usb socket
206
207
heltec works.
208
209
unifi refuses to measure
210
211
#### insert minipcie usb adapter board from aliexpress, move heltec to it
212
213
heltec works. no unifi measurement.
214
215
#### put back cm3 carrier with cm3 module and eMMC key
216
217
4W
218
219
heltec works, serial to it works.
220
221
```
222
peter@tabantha:~ $ lsusb -t
223
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=dwc_otg/1p, 480M
224
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
225
|__ Port 001: Dev 003, If 0, Class=Hub, Driver=hub/7p, 480M
226
|__ Port 001: Dev 005, If 0, Class=Communications, Driver=cdc_ether, 480M
227
|__ Port 001: Dev 005, If 1, Class=CDC Data, Driver=cdc_ether, 480M
228
|__ Port 006: Dev 006, If 0, Class=Human Interface Device, Driver=usbhid, 480M
229
|__ Port 007: Dev 007, If 0, Class=Human Interface Device, Driver=usbhid, 480M
230
|__ Port 002: Dev 004, If 0, Class=Vendor Specific Class, Driver=cp210x, 12M
231
```
032010 Peter van Dijk 2026-01-28 23:19:46 232
233
# nebra miner minipcie pin count
234
235
[Nebra](https://github.com/NebraLtd/nebra-lora-hardware/blob/master/Smart-Outdoor-Mainboard-V1/HARDWARE/Pi%20Supply%20Smart%20LoRa%20Gateway%20Schematic.pdf) gives us, per minipcie slot, SCLK+MISO+MOSI+CE+RST. [lora-pipe config.h](https://github.com/folkertvanheusden/lora-pipe/blob/master/config.h) suggests we want SCLK+MISO+MOSI (+CE but maybe we can get away without it)+DIO1(interrupt)+RST. We also need BUSY, for a total of 7 pins. If we hardware CE to always be on, we free up one pin, giving us exactly enough to put DIO0+RST on? Turns out this is "not legal". One more pin if we can abuse GPS_PPS but I don't think we can (or if we can, it would still be shared between the two lora minipcie slots).
236
237
From `hpux735` on the meshcore discord: how about an i2c port expander? 5 pins fits SCLK/MISO/MOSI and all of I2C. You'd have to poll the IRQ. (Or maybe if I'm polling anyway, who needs the IRQ).
238
239
From `Mike's Allotment` on the meshcore discord: UART module instead of SPI?
240
241
Full pin list:
242
243
* SCLK
244
* MISO
245
* MOSI
246
* CE
247
* IRQ
248
* BUSY
249
* RST
250
251
Wired pins on Nebra:
252
253
* SCLK
254
* MISO
255
* MOSI
256
* CE
257
* RST
258
259
What if CE, when disasserted, makes BUSY readable on the RST pin, and when asserted, makes RST writable on the RST pin? I wonder what RST with CE asserted means.
260
261
MISO is inactive when CE is off, and CE is always off if BUSY is on.
262
263
What if KISS (TNC) over SPI, or UART bitbang, with a simple MCU.
264
265
What if SPI but something is interposing/reading along to pick up a special frame that means RESET. Then we can reuse the RST pin for BUSY. IRQ was always optional.
266
267
https://github.com/thekakester/Arduino-LoRa-Sx1262/blob/main/src/LoraSx1262.cpp#L230 -suggests- that BUSY can be inferred from GetStatus. This seems to be right for "Transmission is done" but I'm unsure it works for all busy reasons.
268
269
https://www.haraldkreuzer.net/en/news/LoRa-with-the-ESP32-and-Semtech-SX1262 is a very good page that tells us that TxDone and RxDone can be polled instead of IRQed.