DJI-Remote is an open-source firmware for the M5Stack Basic V2.7 together with the M5Stack Module GPS V2.0.
It connects via Bluetooth to up to three DJI Osmo Action and Osmo 360 cameras at the same time and shows all important information in a compact way on the display.
A quick glance is enough to see whether all cameras are actually doing what they should – ideal for motovlogs with multiple perspectives.
The complete firmware for DJI-Remote is available as an open-source project on GitHub.
Before I built the iOS app, there was a completely different approach: a standalone remote control based on a Raspberry Pi Zero with a small touch display.
Technically this was possible, but for use on a motorcycle the setup was too big, too fragile and overall too fiddly.
So I first went down the iOS app route. With the Osmo-GPS-Controller-Demo in mind, the idea came back to implement everything with an ESP32 – smaller, more robust, more power-efficient and much closer to my original vision of a dedicated remote.
This is exactly where DJI-Remote comes in: a small, specialized remote that does exactly what I need on the bike – without a smartphone in between.
When looking for concrete examples of a DJI remote based on an ESP32, I came across the community project M5StickCPlus2_Remote_For_DJI_Osmo .
This project made me aware of the M5Stack ecosystem. From there, it was only a small step to the M5Stack Basic V2.7 with its larger display and GPS module – and that’s exactly what DJI-Remote is built on today.
If you just want to flash DJI-Remote without setting up ESP-IDF, use the precompiled firmware ZIP from the GitHub releases.
The ZIP contains all binaries (bootloader.bin, partition-table.bin, dji_camera_bluetooth_control.bin) plus simple flash scripts for macOS and Windows.
esptool binary into the extracted flash folder (next to the scripts and .bin files)./dev/cu.usbserial-XXXX on macOS, COM5 on Windows).chmod +x flash_mac.sh), then run ./flash_mac.sh <port>.flash_win.bat <COM-Port>.Tested with esptool 5.1.0; newer versions should work as well.
Tip: use a good USB cable and, on macOS, prefer /dev/cu.* ports if flashing fails.
More technical details can be found in the GitHub repository in the files manual.md and implementation.md.