Smol Slime
Smol Slimes, also known as nRF Trackers, uses a protocol called Enhanced ShockBurst (ESB) on Nordic Semiconductor nRF52 and nRF54L series System-on-Chip (SoC). These are very power-efficient trackers, requiring a much smaller battery that can last for days to weeks compared to traditional ESP (WiFi) SlimeVR Trackers. A Receiver, or dongle, is required to bridge communication between trackers and the SlimeVR Server. This method does not work with Quest Standalone without using a computer for OSC.
Disclaimer: This project is highly experimental. These devices may be incompatible with newer versions of SlimeVR Server and may require frequent firmware updates. Nothing is final yet; this includes hardware, firmware, protocols used, etc.
Interested, have questions, or issues with this project? Chat with us in #smol-slimes on SlimeVR Discord!
Table of Contents
- π‘ Receiver Hardware
- π Tracker Hardware
- Schematics
- Software
- Firmware
- Protocols
- Troubleshooting
- Links
- Community projects
π‘ Receiver Hardware
It is important to use boards with a good antenna to maintain signal integrity and range. Hardware with PCB antennas are generally the best option to use as a receiver.
USB Dongles
These dongles have a fairly optimized PCB antenna. If you have issues with signal integrity, it is recommended to use a USB extension cable.
Dongle | Description |
---|---|
eByte Dongle (E104-BT5040U) | Cheapest option with a PCB antenna. It is available on AliExpress, with free shipping. Also available on Alibaba by Chengdu Ebyte Electronic Technology Co., Ltd. - E104-BT5040U is fully compatible with the Nordic Semiconductor nRF52840 Dongle. - E104-BT5040UA is not compatible. It is only capable of capturing BLE4.2 and BLE5.0 protocol packets. |
Nordic Semiconductor nRF52840 Dongle (PCA10059) | Official Nordic development hardware. It is available on Digikey or Mouser. |
Microcontroller Boards
These boards use antenna designs that are not optimized for range. If you are using the same boards for both trackers and receiver, they will likely perform poorly without modification.
Board | Description | |
---|---|---|
SuperMini nRF52840 | Cheapest option overall. It is a clone of the nice!nano board. It is available on AliExpress with compatible with nice!nano or Pro Micro branding.If you want to improve signal strength, you can replace the built-in antenna with a 31 mm wire. This creates a basic monopole antenna. | |
Seeed Studio XIAO nRF52840 | Compact board, available on Seeed Studio. |
π Tracker Hardware
Before you start, decide on how many trackers you may need.
Trackers are required to have a battery and an inertial measurement unit (IMU). A magnetometer is optional.
Buttons and slide switches are recommended but not required. Buttons can be added to control the tracker, and a slide switch can be used to physically disconnect a tracker's battery.
Microcontroller Boards
Board | Description |
---|---|
SuperMini nRF52840 | Cheapest option overall. It is a clone of the nice!nano board. It is available on AliExpress with compatible with nice!nano or Pro Micro branding. |
Seeed Studio XIAO nRF52840 | Compact board, available on Seeed Studio. |
Inertial Measurement Units
- BMI270
- ICM-42688-P
- ICM-42688-V
- ICM-45686
- ISM330BX
- ISM330DHCX
- LSM6DSO
- LSM6DSR
- LSM6DSV
- LSM6DSV16B
Magnetometers
- AK09940
- BMM150*
- BMM350*
- IIS2MDC
- IST8306
- IST8308
- LIS2MDL
- LIS3MDL*
- MMC5983MA
*Sensor driver has not been tested.
Sensor Modules
IMU Modules
Some of the supported sensor modules are described on the IMU Comparison page. Note that most common sensor modules are not supported.
IMU + Magnetometer Modules
Meia, a member of the SlimeVR Discord, produces and sells sensor modules with an onboard magnetometer. They are compatible with common sensor modules, and the form factor is suitable for stacked builds.
IMU + Magnetometer | Product Page |
---|---|
ICM-45686 + IST8306 | store.kouno.xyz |
LSM6DSR + IST8306 | store.kouno.xyz |
Buttons
Push buttons/momentary switches are used to control the tracker. Multiple button configurations are supported. A tracker can have either a reset button, a user button, or both.
The reset button is suitable for all functionality. If a user button is available, it will be used instead.
If a button is not available, tweezers can be used to short the pins for initial tracker setup.
Switches
A slide switch can be used to physically disconnect a battery. Some boards have a high standby power draw and will require a switch.
If a switch is not used, a tracker can enter deep sleep by holding down the user button.
Batteries
Most boards will support a 3.7V Li-ion/LiPo battery. Usually, batteries have a maximum charge rate of 1C, or a 1 hour charge rate. Do not use a battery if the charge rating will be exceeded.
To extend the lifespan of the battery, a much lower charge rate close to 0.5C is recommended.
Board | Default charge rate | Minimum battery capacity | Recommended battery capacity |
---|---|---|---|
SuperMini nRF52840 | 100mA | 100mAh | 180-300mAh |
Seeed Studio XIAO nRF52840 | 50mA | 50mAh | 80-300mAh |
Schematics
Default SuperMini Build | Stacked π₯ͺ SuperMini Build1 |
---|---|
![]() | ![]() |
Requires special firmware that provides power from the GPIO pins. YouTube Tutorial
Software
- Git Client
- nRF Connect for Desktop
- Programmer (Inside nRF Connect; needed for Nordic and eByte Dongles only)
- Serial Terminal (Inside nRF Connect; recommended to send commands to your Receiver/Trackers)
- Toolchain Manager (Inside nRF Connect; needed for building firmware for receiver and tracker)
- 2.9.0 (Inside Toolchain Manager) Don't use a newer version!
- Visual Studio Code
- nRF Connect for VS (Install within VS Code Extension tab)
- SlimeVR Server
- 0.13.2 or later version
Firmware
The recommended method of getting the firmware is in the pre-compiled section if you don't need custom config or pin defines.
Cloning Repositories
- Open Command Prompt (Type
cmd
in Start Menu). - Change to a directory you want the repositories to clone to. (Use "cd" followed by space and then a full path to a folder or drive.)
- Cloning SlimeNRF Receiver Repository.
git clone --single-branch --recurse-submodules -b master https://github.com/SlimeVR/SlimeVR-Tracker-nRF-Receiver.git
- Cloning SlimeNRF Tracker Repository.
git clone --single-branch --recurse-submodules -b master https://github.com/SlimeVR/SlimeVR-Tracker-nRF.git
Note: It is recommended to clone to a filepath without whitespaces and/or unicode characters. You may encounters errors when building the firmware.
Building firmware
- Launch VS Code using nRF Connect's Toolchain Manager.
- Open the folder to one of the repositories.
- Make any pin changes or necessary adjustments to
boards\MANUFACTURER\BOARD_NAME.dts
. - Click on the nRF Connect tab on the left side of your screen (about half way down).
- Under "Applications" , click on "+ Add build configuration."
- Select preset from "Board Target".
- Scroll down and click on the "Build Configuration" button.
Note: For trackers, settings are found in "nRF Kconfig GUI" under "Actions" and expand the "SlimeNRF" section.
Changing board defines
Board defines can be found in \boards\
for overlays (Boards within the Zephyr library) and custom boards are found in boards\MANUFACTURER\BOARD_NAME.dts
.
- Navigate to the board's .dts file.
- I2C (SCL/SDA) can be changed to other pins. Make sure you are using "High Frequency" pins and that you change the pins for both lines.
- SW0 can be enabled by uncommenting (removing the
//
) from lines below the description commment. You can select the lines and press Ctrl / if you are using VS Code. Re-define the gpio pin if necessary. - INT (int0-gpios) can be re-defined under the Zephyr user section.
- CLK (clk-gpios) can be uncommented and re-defined if you are using an IMU with an external clock/crystal oscillator such as the ICM-42688 or ICM-45686.
Adjusting settings in the Kconfig
- Go to the nRF Connect tab of VS Code.
- Build the desired board once.
- A section called Actions should appear on the left navigation board.
- Select your built board under Applications, then scroll down to the Actions.
- Double click nRF Kconfig GUI.
- Scroll down to the SlimeNRF section.
- Enable/Disable or adjust any configs needed.
- Click the "Apply" button", then click the "Save to file" button.
- If prompted which file to save to, select prj.conf.
- Click on the "Pristine Build" button next to Build in the Actions section.
Pre-Compiled firmware for default pins
Latest builds (Automated)
Type | Device | Clock (ICM) | Sleep (WOM) | SW0 Disabled | SW0 Enabled |
---|---|---|---|---|---|
π‘ Receiver | Nordic/eByte | N/A | N/A | Link | N/A |
π‘ Receiver | SuperMini | N/A | N/A | Link | N/A |
π‘ Receiver | XIAO | N/A | N/A | Link | N/A |
π Tracker | SuperMini | Disabled | Enabled | Link | Link |
π Tracker | SuperMini | Disabled | Disabled | Link | Link |
π Tracker | SuperMini | Enabled | Enabled | Link | Link |
π Tracker | SuperMini | Enabled | Disabled | Link | Link |
π Tracker | SuperMini (Stacked π₯ͺ) | Enabled | Enabled | Link | Link |
π Tracker | SuperMini (Stacked π₯ͺ) | Enabled | Disabled | Link | Link |
π Tracker | XIAO | Disabled | Enabled | Link | Link |
π Tracker | XIAO | Disabled | Disabled | Link | Link |
π Tracker | XIAO | Enabled | Enabled | Link | Link |
π Tracker | XIAO | Enabled | Disabled | Link | Link |
π Tracker | R3 | Enabled | Enabled | Link | N/A |
π Tracker | R3 | Enabled | Disabled | Link | N/A |
π Tracker | SlimeVR Mini (Prototype 1) | Enabled | Enabled | Link | N/A |
π Tracker | SlimeVR Mini (Prototype 1) | Enabled | Disabled | Link | N/A |
π Tracker | SlimeVR Mini (Prototype 2) | Enabled | Enabled | Link | N/A |
π Tracker | SlimeVR Mini (Prototype 2) | Enabled | Disabled | Link | N/A |
Previous builds
Previous builds can be found here: https://github.com/Shine-Bright-Meow/SlimeNRF-Firmware-CI/actions
- Click on a successful workflow run β for a date period.
- Scroll down to the Artifacts section.
- Download desired device firmware.
- Extract zip file.
Updating Adafruit Bootloader (SuperMini / XIAO)
- You can download them here. https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases
- For SuperMini, download
update-nice_nano_bootloader-x.x.x_nosd.uf2
. For XIAO, downloadupdate-xiao_nrf52840_ble_sense_bootloader-x.x.x_nosd.uf2
. (The proper non-Sense version doesn't update the bootloader.) - Plug the device into your computer via data USB cable.
- The device should start off in DFU mode when new without a bootloader. The LED should be fading on and off.
- If device's LED is not fading on and off, press the reset button twice (or short RST/GND pins) twice within 0.5s. If device with existing SlimeNRF firmware, reset 4 times.
- Navigate to your Downloads folder and copy the uf2 file.
- Navigate to the Mass Storage Drive (ex. NICENANO/XIAO-SENSE) from ThisPC.
- Paste the file into there, and the window should close and the device will reboot.
Flashing firmware to device
Update the bootloader to your SuperMini and XIAO boards before flashing firmware; there is a very high chance that you will brick your device otherwise. eByte and Nordic dongles don't fall in this category.
Dongles (eByte/Nordic)
- Open "Programmer" in nRF Connect.
- Press the reset button, and the LED should start fading on and off, putting the device in DFU Mode. For eByte, it is the right button. For Nordic, it is a side button (not the round white button).
- On the top left corner, select your Device.
- Click on "Add File".
- Navigate to your local Receiver repository, then select file in
build\REPOSITORY_NAME\zephyr\zephyr.hex
. - Click the "Write button".
SuperMini and other Devices with Adafruit Bootloader as Receiver/Tracker:
- Plug the device into your computer via data USB cable.
- The device should start off in DFU mode when new without a bootloader. The LED should be fading on and off.
- If device's LED is not fading on and off, press the reset button twice (or short RST/GND pins) twice within 0.5s. If device with existing SlimeNRF firmware, reset 4 times.
- Navigate to your local Receiver or Tracker repository, then go to
build\REPOSITORY_NAME\zephyr\
. - Copy zephyr.uf2 file.
- Navigate to the Mass Storage Drive (ex. NICENANO/XIAO-SENSE) from ThisPC.
- Paste the file into there and the window should close and device will reboot.
Pairing Mode
Tracker
Method 1: Console
- Open nRF Connect for Desktop.
- Open Serial Terminal from nRF Connect.
- Ensure your tracker is connected to your computer via cable.
- On the top left corner, select your tracker under Devices.
- Click the "Connect to Port" button.
- Type
pair
into the console.
Method 2: Button
- Press the Reset (or short RST/GND pins) or Function button (if you have SW0 defined) 3 times.
Device's LED should blink once every sec.
Receiver
- Open nRF Connect for Desktop.
- Open Serial Terminal from nRF Connect.
- Ensure your tracker is connected to your computer via cable.
- On the top left corner, select your dongle under Devices.
- Click the "Connect to Port" button.
- Type
pair
into the console.
Device's LED should blink once every sec.
Once trackers are paired, the LED should stop blinking once per sec. To exit pairing mode on Receiver, type reboot
in the console or press the left button once on eByte Dongle or the white button once on Nordic Dongle.
Calibration
Basic
Method 1: Console
- Open nRF Connect for Desktop.
- Open Serial Terminal from nRF Connect.
- Ensure your tracker is connected to your computer via cable.
- On the top left corner, select your tracker under Devices.
- Click the "Connect to Port" button.
- Type
calibrate
into the console while tracker is on a flat surface. - Wait for the logs to reboot and print out again.
Method 2: Button
- Press your Reset or SW0 (Functional) button twice and leave the tracker still on a flat surface for a few seconds.
6-Side
- Make sure the power switch is on. (So the tracker can run on battery when unplugged.)
- Open nRF Connect for Desktop.
- Open Serial Terminal from nRF Connect.
- Ensure your tracker is connected to your computer via cable.
- On the top left corner, select your tracker under Devices.
- Click the "Connect to Port" button.
- Enter
6-side
command in console. (At the moment, there is no button press combination to start this calibration.) - Follow the console log on rotating sides on a flat surface. Leave the cable side for last.
- When prompted for the last side, unplug your USB cable and place the side with the USB port onto the flat surface.
- Wait a bit until calibration is complete.
Updating firmware
- If your Receiver needs firmware updated, do this first.
- Open nRF Connect's Serial Terminal.
- Select your Receiver from the Device list.
- Click the "Connect to Port" button.
- Enter
clear
to unpair all of your trackers from the Receiver. The Receiver will automatically enter pairing mode. - Connect a tracker to your computer via USB cable and make sure the power switch is on. (So the tracker can run on battery when unplugged for 6-Side calibration.)
- Select your tracker from the Device List.
- Click the "Connect to Port" button.
- Enter
dfu
to go into DFU Mode. - Copy the UF2 file onto your tracker.
- Enter
6-side
to start 6-Side calibration. - After 6-Side calibration, enter
calibrate
to calibrate the ZRO. - Enter
pair
to enter pairing mode. - Wait for the tracker to pair to the Receiver, and then disconnect.
- Repeat process for all trackers.
- Select your Receiver from the Device list.
- Click the "Connect to Port" button.
- Enter
reboot
to exit pairing mode.
Console Commands
Receiver
info
- Get device informationlist
- Get paired devicesreboot
- Soft reset the devicepair
- Enter pairing modeclear
- Clear stored devicesdfu
- Enter DFU bootloader (only available if your device has one)uptime
- Get device uptimemeow
- Meow!
Tracker
info
- Get device informationreboot
- Soft reset the devicecalibrate
- Calibrate sensor ZRO6-side
- Calibrate 6-side accelerometerpair
- Enter pairing modedfu
- Enter DFU bootloader (only available if your device has one)uptime
- Get device uptimemeow
- Meow!
Button
- Reset - 1 Press
- Calibration - 2 Presses
- Pairing Mode - 3 Presses
- DFU Bootloader - 4 Presses
- Deep Sleep - Press and Hold
LED Codes
- 1 short blink per second - Pairing mode.
- 1 long blink per second - Low battery.
- 2, 3, 4 long blinks every 5 seconds - Error.
- 2 blinks - Sensor error.
- 3 blinks - Connection error.
- 4 blinks - Hardware error.
- Fade on and off - DFU mode.
- Very short blink - Normal operation or wake on motion.
- While plugged in: Pulsing - Charging.
- While plugged in: Solid - Fully charged.
Protocols
This section provides advanced information about the communication protocol and is not required for building your own smol slimes.
HID Protocol
The HID Protocol is not final and is subject to change with upcoming versions of the SlimeVR Server.
Tracker -> Server
type |id |packet data |
0 |id |proto |batt |batt_v |temp |brd_id |mcu_id |imu_id |mag_id |fw_date |major |minor |patch |rssi | info
1 |id |q0 |q1 |q2 |q3 |a0 |a1 |a2 | full precision quat
2 |id |batt |batt_v |temp |q_buf |a0 |a1 |a2 |rssi | reduced precision quat
3 |id |svr_stat|status |resv |rssi | status
Tracker <-> Receiver
type |id |packet data |
64 |id |addr |resv | pairing data from tracker
65 |id |addr |addr_rcv |channel |resv | pairing data to tracker
66 |id |addr |time | timing data to tracker (why addr?)
67 |id |addr |cmd_data | some command to tracker? (need to be part of timing?)
Tracker <-> Server
type |id |packet data |
128 |id |addr |cmd_data | some command to tracker? (field too large?)
128 |id |addr |ack | acknowledge?
Receiver <-> Server
type |id |packet data |
192 |id |resv | 192+ should be some interaction b/w receiver and server
254 |resv | filler, this packet is ignored by the server
255 |id |addr |resv | tracker id association
Troubleshooting
Check Console Logs
- Open nRF Connect for Desktop.
- Open Serial Terminal from nRF Connect.
- Ensure your tracker is connected to your computer via cable.
- On the top left corner, select your tracker under Devices.
- Click the "Connect to Port" button.
SWD Debugging
- Instructions for the Raspberry Pi, Raspberry Pi Pico, ST-Link V2, and other debuggers will be added in the future. Resource: https://github.com/joric/nrfmicro/wiki/Bootloader
J-Link, nRF52/nRF52840 Development Kit, and OB-ARM Debugger
- Install J-Link Software and Documentation Pack: https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack
- Download Bootloader HEX File for your device (SuperMini -
nice_nano_bootloader-x.x.x_sxxx_x.x.x.hex
, XIAO -xiao_nrf52840_ble_sense_bootloader-x.x.x_sxxx_x.x.x.hex
): https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases - Connect Debugger to SWD IO, CLK, and GND Pins. (It is safer to power up your device by plugging into USB instead of using the VDD pin)
Flashing/Fixing bricked bootloader
- Open "J-Flash Lite."
- Target Device: NRF52840_XXAA
- Target Interface: SWD
- Speed: 4000
- Click the "OK" button.
- Click on the "..." button and select downloaded HEX file.
- Click the "Program Device" button.
RTT/Debugging
- Open "RTT Viewer."
- Connection to J-Link: USB
- Specify Target Device: NRF52840_XXAA
- Force go on connect: Checked
- Target Interface & Speed: SWD / 4000 hKz
- RTT Control Block: Auto Detect
- Click the "OK" button.
Recommended Hardware/Tools
OB-ARM Debugger: https://www.aliexpress.us/item/3256806507382540.html
Pogo Pin Test Clip (1.5mm Pitch, 4P, Single Row): https://www.aliexpress.us/item/3256805646654844.html
Note: The clip is for SuperMini only. There are cheaper clips out there, but they don't break out the pins from 1.5mm pitch to 2.54mm pitch for dupont wires.
Links
Discord
SlimeVR Discord: https://discord.gg/SlimeVR
Firmware Source Code
Community projects
Firmware
Name | Author | Description | Links |
---|---|---|---|
Stacked-SmolSlime | LyallUlric | Fork of main branch with firmware tailored for stacked SuperMini trackers. | Github |
Hardware
Name | Author | USB | PCB | Battery | Links |
---|---|---|---|---|---|
Aed-Slimes | Aed | Yes | Yes | LIR2450 | Github |
Gremlin | ManicQuinn | Yes | N/A | 401230 110mAh | Github |
Marzipan | Colanns | Yes | Yes | 401230 110mAh or 501230 170mAh | Github |
SlimeNRF-Fuimini | fui | Yes | Yes | 100mAh | Github |
SlimeNRF R1/R2 | sctanf | No | Yes | 602030 300mAh | Github |
SlimeNRF R3 | sctanf | Yes | Yes | Unspecified | Oshwlab |
Created by Shine Bright β¨ and Depact