Welcome to Pubmote!
Pubmote is a feature-rich, ESP-NOW based remote control for VESC based onewheels. Pubmote connects to a VESC Express receiver running the Float Accessories package, which provides a feature-rich platform and easy configuration experience.
Tip
Want an easy way to update firmware or flash a new device? Head over to the firmware tool at https://pubmote.com
Suggestions for additional hardware targets are welcomed. For new projects, we recommend using a custom PCB or dev-board the following features:
- Buzzer
- PMU with I2C comms. SY6970 and AXP2101 are currently supported.
- GPIO with RTC supported pins
Current implementations:
-
WaveShare 1.43in Amoled display (see: example build)
- ZiNc Snowmote 2 by ZiNc
- ZiNc Leaf Blaster remix case by ZiNc
- Leaf Blaster case by Markoblaster
-
NO LONGER SUPPORTED: The "Cowmote" from ExcessRaccoon uses the LilyGo T-Display S3 Amoled (1.43in) (see: example build)
- SnowMote case by ZiNc
- Finger Blaster case by Markoblaster
- Building your own
- Trampa VESC Express Module
- AvaSpark RGB Mini
- CustomWheel VESC Express Module
- And many others...
- Not sure where to get started with a Pubmote build? Check out an example build like the Leaf Blaster!
- For instructions on first-time setup, pairing, and usage, see the quick start guide.
Create an issue on GitHub or post in the Pubmote channel within the PubWheel Discord server
- VS Code or other code editor
- PlatformIO
No Rust toolchain is required. Slint is consumed as a prebuilt release pinned by
SLINT_PREBUILT_TAG in platformio.ini, so pio run needs nothing but Python and PlatformIO.
The UI uses arc properties that only exist in our Slint fork, so the language server bundled
with the VS Code Slint extension rejects them with Unknown property arc-center-x and no
preview opens. The Sync Slint LSP task in .vscode/tasks.json points it at the fork's
language server on every folder open (trusted folders only). By hand:
python scripts/sync_slint_lsp.py # --help for --local, --print-setting, --restoreIt fetches the slint-lsp matching the pinned tag - so the preview and the firmware can never
be on different versions of Slint - caches it in the gitignored .slint/, and writes
slint.lspBinaryPath into .vscode/settings.json. Reload the window afterwards.
Important
.vscode/settings.json is generated and gitignored - every run rewrites it from the tracked
.vscode/settings.shared.json. Project-wide settings go in that file; personal ones go in
your VS Code user settings.
The preview draws arcs through the MoveTo/ArcTo fallback rather than the MCU fast path, so
it is good for shape and layout and tells you nothing about how the panel will rasterise them.
Renderer and language changes live in the fork at techfoundrynz/slint, not here. Going through a release to try one is about ten minutes a turn, so build the library locally instead:
python scripts/use_local_slint.pyThis needs the Xtensa Rust toolchain (espup) and a checkout
of the fork. It stages only the library, so cut a real release once the C++ API or the .slint
language changes - the script's docstring has the rest of the caveats.