
XIAO ESP32S3 Plus V1.1 250724
Josephrp/meshtonic
Meshtonic H4M Companion — ESP32-S3 carrier for PortaPack H4M / Mayhem with multi-slot LoRa and standalone Meshtastic

Meshtonic H4M Companion — ESP32-S3 carrier for PortaPack H4M / Mayhem with multi-slot LoRa and standalone Meshtastic
Meshtonic h4m v2 is an open-source printed circuit board by Josephrp, from the Josephrp/meshtonic repository on GitHub. It is a 6-layer board of 71.1 × 168.4 mm with 118 parts on 136 nets, routed with 1,519 tracks and 372 vias.
It is built around the TPS63020DSJR, CN3170 and CC0805KRX7R9BB104, with the 19-217-R6C-AL1M2VY-3T among its other parts. Its parts include 44 resistors, 18 capacitors, 15 connectors, 8 diodes and 5 ICs. It belongs with the radio and wireless boards and the ESP32 boards of this library.
Meshtonic H4M Companion v2 is a custom carrier board and firmware stack for a Seeed XIAO ESP32-S3 Plus that docks to a HackRF + PortaPack H4M (Mayhem) and can also run as a standalone Meshtastic mesh node.
Repository: github.com/Josephrp/meshtonic (formerly Meteor-On-Mesh)
| Mode | Role |
|---|---|
| Docked (Mayhem MDK) | ESP32 is an I2C slave at 0x51 on the PortaPack MDK connector. Exposes GPS, sensors, web UI, and 1–4 LoRa radios to Mayhem; runs the on-device LoRa decoder EPApp. |
| Standalone (Meshtastic) | Flash the Meshtastic image instead. Board becomes a LoRa mesh node with GPS, TFT, and muxed sensors. |
The two ESP32 firmwares are mutually exclusive — flash one or the other depending on whether you are using the board docked or as a mesh node.
| Block | Parts |
|---|---|
| MCU | Seeed XIAO ESP32-S3 Plus (ESP32-S3, 16 MB flash, OPI PSRAM) |
| LoRa | Up to 4× Wio-SX1262 shields — shared SPI, per-radio CS on native GPIO, BUSY/DIO1/RST via MCP23017 @ 0x20 |
| Sensors | TCA9548A @ 0x70 mux: BMM150, BMP280, SHT3x, BMI160; AS5600 on the main I2C bus |
| GPS | NEO-6M (UART1) |
| Display / storage | ILI9341 240×320 SPI TFT, microSD |
| Host link | PortaPack H4M / MDK-compatible connector (I2C slave + power) |
| Power | USB / solar → CN3170 LiPo charge → TPS63020 3.3 V buck-boost |
Canonical pin map (silicon GPIO numbers for the XIAO Plus — Dn ≠ GPIOn above D5):
firmwares/pin_mapping.cpp and the variant PIN_AUDIT.md
Architecture notes for the docked LoRa path (MCP ISR → radio manager → decoder → web / PortaPack) live in static/diagrams.md.
3D-printable case STLs (65 × 140 mm footprint):
| Tree | Upstream | Meshtonic role |
|---|---|---|
firmwares/meshtastic/ | Meshtastic firmware (GPL-3.0) | Custom board env meshtonic-h4m-wio1 — WIO1-first standalone mesh |
firmwares/mayhem-mdk/ | ESP32-Portapack / Mayhem MDK (HTL) | Docked companion: HW_VARIANT_MESHTONIC_H4M, MCP + TCA drivers, multi-slot SX1262 manager, LoRa decoder EPApp, optional host LWD bridge |
firmwares/mayhem-firmware/ | PortaPack Mayhem (GPL-3.0) | Vendored Mayhem tree + PortaPack UI app under firmware/standalone/meshtonic_lora/ |
Shared first-party pin constants: firmwares/pin_mapping.cpp.
When Mayhem MDK is flashed with the Meshtonic H4M profile:
0xA012); ESP DSP + decode run on-device.Protocol and backend IDs: firmwares/mayhem-mdk/docs/PORTAPACK_LORADEC.md.
flowchart TD
Board["Meshtonic H4M (1-4 Wio SX1262)"] -->|MCP23017 + shared SPI| Radios["LoraRadio slots"]
Radios --> EPApp["EPAppLoraDecoder"]
EPApp --> Decode["Decode layer"]
Decode --> Packets["LoraPacket"]
Packets --> Web["Web / WS"]
Packets --> PP["PortaPack I2C @ 0x51"]
HostLWD["Host LWD optional"] -.-> Packetsmeshtonic/
├── pcb/ # KiCad project meshtonic_h4m_v2 (schematics, PCB, BOM, DFM)
├── firmwares/
│ ├── meshtastic/ # Meshtastic + meshtonic_h4m_wio1 variant
│ ├── mayhem-mdk/ # ESP32 Mayhem MDK + Meshtonic H4M profile
│ ├── mayhem-firmware/ # PortaPack Mayhem (+ meshtonic_lora PP app)
│ └── pin_mapping.cpp # Canonical H4M v2 GPIO / MCP map
├── case/ # Enclosure STLs
├── static/ # Photos, pinout / architecture diagrams, demos
└── README.mdLocal-only (gitignored) folders such as refs/ and backups/ may hold design plans and PCB snapshots on a developer machine; they are not part of the tracked tree.
| Firmware | Toolchain |
|---|---|
| Meshtastic | PlatformIO (CLI or IDE) |
| Mayhem MDK | ESP-IDF targeting esp32s3, or the Docker builders under firmwares/mayhem-mdk/docker/ |
| PortaPack app | Mayhem firmware build environment (see upstream Mayhem docs) |
Hardware bring-up checklist (I2C scan + radio):
@ 0x20, TCA9548A @ 0x70, AS5600 @ 0x36cd firmwares/meshtastic
pio run -e meshtonic-h4m-wio1
pio run -e meshtonic-h4m-wio1 -t upload
pio device monitor -b 115200boards/meshtonic_h4m_wio1.jsonvariants/esp32s3/diy/meshtonic_h4m_wio1/cd firmwares/mayhem-mdk/Source
idf.py set-target esp32s3
# Select Meshtonic H4M pins: HW_VARIANT_MESHTONIC_H4M in code,
# and/or choose "Meshtonic H4M" in the web pin-config UI after first boot
idf.py build
idf.py -p <PORT> flash monitorDocker alternative:
cd firmwares/mayhem-mdk/docker
# see build.ps1 / build-in-container.sh / docker-compose.ymlPin preset for Meshtonic H4M: GPS RX = GPIO 7, shared I2C master+slave on GPIO 5/6 (HW_VARIANT_MESHTONIC_H4M in pinconfig.h).
Optional host-side LoRa wideband decoder / bridge tooling: firmwares/mayhem-mdk/lora-wideband-decoder/.
PortaPack-side UI that talks to the ESP over Apps-over-I2C lives in:
firmwares/mayhem-firmware/firmware/standalone/meshtonic_lora/firmwares/mayhem-mdk/Source/extapps/meshtonic_lora_ui_example.cppBuild and install that app with your usual Mayhem standalone-app workflow, then launch it from the PortaPack App Manager (or rely on Meshtonic H4M auto-start of the ESP decoder).
KiCad 8 project: pcb/meshtonic_h4m_v2
| Sheet | Contents |
|---|---|
meshtonic_h4m_v2.kicad_sch | Root |
Power | CN3170 charge, TPS63020 3.3 V, battery / solar |
Xiao_Core | XIAO ESP32-S3 Plus |
LoRa | WIO1–4 sockets, MCP23017 radio GPIO |
Sensors | TCA9548A + environmental / IMU / mag |
Periferals | TFT, microSD, GPS, Grove, misc |
H4M_Connector / MDK_Interface | PortaPack dock |
Breakout_GPIO | Expansion |
Also: meshtonic_i2c-hub.kicad_* for the I2C hub side project.
| Artifact | Purpose |
|---|---|
pcb/meshtonic_h4m_v2.csv | Seeed Fusion–oriented PCBA BOM |
pcb/meshtonic_h4m_v2_excluded_from_pcba.csv | Hand-fit / DNP (WIO sockets, display, test points, …) |
pcb/_gen_seeed_bom.py | Regenerates the Seeed BOM + exclusion list |
pcb/dfm/ | Gerbers, drills, fab zip |
Hand-fit after PCBA: Wio-SX1262 modules (and their hybrid SMD+TH landings), display module, and any DNP connectors listed in the exclusion CSV.
Regenerate the Fusion BOM:
python pcb/_gen_seeed_bom.pyThis is an active hardware + firmware bring-up project.
meshtonic-h4m-wio1 env — single-radio focusDemo media: static/ (photos + short videos).
This is a multi-license monorepo. The root LICENSE is the index; full texts live under LICENSES/.
| Component | License |
|---|---|
pcb/, case/, firmwares/pin_mapping.cpp | CERN-OHL-P-2.0 |
README.md, static/ | CC-BY-4.0 |
firmwares/meshtastic/ | GPL-3.0 |
firmwares/mayhem-firmware/ | GPL-3.0 (see tree) |
firmwares/mayhem-mdk/ | Custom HTL — attribution, contribute improvements back, no commercial use (LICENSE) |
firmwares/mayhem-mdk/lora-wideband-decoder/ | See that subtree’s LICENSE |
pcb/libs/ | Upstream library licenses (unchanged) |
Meshtonic board support added inside a firmware tree follows that tree’s license unless a file says otherwise. Upstream copyrights remain with their respective authors.
static/diagrams.md · LoRa over I2C: docs/PORTAPACK_LORADEC.md| Qty | Value | Footprint | References |
|---|---|---|---|
| 32 | 10k | PCM_SparkFun-Resistor:R_0603_1608Metric | R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25 +16 |
| 7 | CERAMIC-100NF-50V-10%-X7R_0805_ | Capacitor_SMD:C_0805_2012Metric | C6, C7, C9, C11, C13, C15, C18 |
| 6 | 10uF | PCM_SparkFun-Capacitor:C_0603_1608Metric_Polar | C1, C2, C8, C10, C12, C14 |
| 6 | GROVE-CONNECTOR-DIP_4P-2.0_ | seeed:GROVE-HW4-2.0 | J1, J3, J4, J5, J6, J7 |
| 4 | 0.5mm | PCM_SparkFun-Connector:TestPoint-0.5mm | TP_H4M_3V1, TP_H4M_SCL1, TP_H4M_SDA1, TP_VBAT_H4M1 |
| 4 | WioSX1262_Shield_Socket | New_XIAO_Series_Footprints:XIAO-ESP32-S3-DIP | J_WIO1, J_WIO2, J_WIO3, J_WIO4 |
| 3 | 22uF | PCM_SparkFun-Capacitor:C_0603_1608Metric | C3, C4, C5 |
| 3 | 33 | PCM_SparkFun-Resistor:R_0402_1005Metric | R_H4M_SCL1, R_H4M_SDA1, R1 |
| 3 | 330 | PCM_SparkFun-Resistor:R_0603_1608Metric | R42, R43, R44 |
| 3 | Conn_01x02 | PCM_SparkFun-Connector:1x02_P2.54mm | J9, J10, J11 |
| 3 | LED-SMD-RED-DIFFUSED_0603_ | LED_SMD:LED_0603_1608Metric | D6, D7, D8 |
| 3 | Standoff | PCM_SparkFun-Hardware:Standoff_Reflow-M3.0 | ST1, ST2, ST3 |
| 2 | 100nF | Capacitor_SMD:C_0603_1608Metric | C16, C17 |
| 2 | 1N5819 | Diode_THT:D_DO-41_SOD81_P10.16mm_Horizontal | D2, D3 |
| 2 | 1k | PCM_SparkFun-Resistor:R_0603_1608Metric | R3, R7 |
| 2 | Green | PCM_SparkFun-LED:LED_1206_3216Metric_Green | D4, D5 |
| 1 | 0 | PCM_SparkFun-Resistor:R_0603_1608Metric | R8 |
| 1 | 0 | PCM_Resistor_SMD_AKL:R_0603_1608Metric | R34 |
| 1 | 1.5uH | PCM_SparkFun-Coil:0805 | L1 |
| 1 | 100k | PCM_SparkFun-Resistor:R_0603_1608Metric | R6 |
| 1 | 10k | PCM_Resistor_SMD_AKL:R_0603_1608Metric | R35 |
| 1 | 1k | PCM_SparkFun-Resistor:R_0402_1005Metric | R2 |
| 1 | 2.0k | PCM_SparkFun-Resistor:R_0402_1005Metric | R5 |
| 1 | 3V3_ISO | PCM_SparkFun-Connector:1x02_P2.54mm | JP_H4M_3V1 |
| 1 | 560k | PCM_SparkFun-Resistor:R_0402_1005Metric | R4 |
| 1 | AS5600_LANDING | Connector:GROVE-HW4-SMD-2.0 | J_AS1 |
| 1 | BMI160_LANDING | Connector:GROVE-HW4-SMD-2.0 | J_BMI1 |
| 1 | BMM150_LANDING | Connector:GROVE-HW4-SMD-2.0 | J_BMM1 |
| 1 | BMP280_LANDING | Connector:GROVE-HW4-SMD-2.0 | J_BMP1 |
| 1 | CN3170 | Package_SO:SOIC-8-1EP_3.9x4.9mm_P1.27mm_EP2.41x3.3mm_ThermalVias | U2 |
| 1 | DISP_SPI_9P | Connector_PinHeader_2.54mm:PinHeader_1x09_P2.54mm_Vertical | J_DISP1 |
| 1 | GROVE-CONNECTOR-DIP-90D_4P-2.0_ | seeed:GROVE-HW4-2.0-90D | J2 |
| 1 | GROVE-CONNECTOR-SMD_4+2P-2.0_ | Connector:GROVE-HW4-SMD-2.0 | J8 |
| 1 | H4M_2x6_MDK | Connector_PinHeader_2.54mm:PinHeader_2x06_P2.54mm_Horizontal | J15 |
| 1 | JST_2mm_LiPo | PCM_SparkFun-Connector:JST_1x02_P2.0mm_Horizontal_SMD | J12 |
| 1 | LOGO | Misc:notforsale | G*** |
| 1 | LOGO | Graphics:astronaut_small | G*** |
| 1 | LOGO | Graphics:seed_logo_small | G*** |
| 1 | MCP23017x-x-SS | Package_SO:SSOP-28_5.3x10.2mm_P0.65mm | U5 |
| 1 | Micro_SD_Card_passive_clk | seeed:MICRO-SD9+4P-SMD-16.1X14.5X1.85MM | J14 |
| 1 | Red | PCM_SparkFun-LED:LED_0402_1005Metric_Red | D1 |
| 1 | SHT31_LANDING | Connector:GROVE-HW4-SMD-2.0 | J_SHT1 |
| 1 | Screw_Terminal_01x02 | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J13 |
| 1 | Solar_Cells | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | SC1 |
| 1 | TCA9548APWR | Package_SO:TSSOP-24_4.4x7.8mm_P0.65mm | U4 |
| 1 | TPS63020DSJR | TPS63020:DSJ14_2P85X1P58 | U1 |
| 1 | TestPoint | PCM_SparkFun-Connector:TestPoint-0.5mm | TP1 |
| 1 | VBAT_ISO | PCM_SparkFun-Connector:1x02_P2.54mm | JP_VBAT_H4M1 |
| 1 | XIAO-S3-Plus | Seeed_Xiao:XIAO-ESP32-S3-Plus-SMD | U3 |

Josephrp/meshtonic
Meshtonic H4M Companion — ESP32-S3 carrier for PortaPack H4M / Mayhem with multi-slot LoRa and standalone Meshtastic


shubhisgonnastealyourcode/FT-32-esp32-s3-dev-board-
Custom ESP32-S3 Development Board with Header Pins for Display and RGB LED

MaverickUK/HDDSynth
Recreate the sound of mechanical spinning HDDs on retro PCs that use a solid state drive

tor1kk/bms-buck-boost
Battery Management System (BMS) with Buck-Boost Converter

Alacrity-Education/AirBoxV2
The AirBox V2 Station is an open source air quality monitoring station based on the Sensirion SEN66 sensor. It measures particulate matter, CO2, VOC and NOx, runs on a solar charged lithium cell, and reports over Wi-Fi.

FallenBuillder/rfid-nfc-manager
This repository consists of schematics, PCB layouts, code and 3D models for a rfid,nfc manager.


jayis1/hacker-devices
Full-cycle hardware designs for security research devices — each device is a subfolder with its own README, schematics, PCB layout, and software stack
It measures 71.1 × 168.4 mm and has 6 copper layers, 1.6 mm thick.
118 parts, built around the TPS63020DSJR, CN3170, CC0805KRX7R9BB104 and 19-217-R6C-AL1M2VY-3T. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the Josephrp/meshtonic repository on GitHub, at the commit this page was made from: the board is pcb/meshtonic_h4m_v2.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Josephrp before reusing the design.