...performance optimized by direct rmt symbol processing - no queue |
||
|---|---|---|
| .github/workflows | ||
| examples | ||
| img | ||
| .gitattributes | ||
| .gitignore | ||
| DShotCommandManager.cpp | ||
| DShotCommandManager.h | ||
| DShotRMT.code-workspace | ||
| DShotRMT.cpp | ||
| DShotRMT.h | ||
| LICENSE | ||
| README.md | ||
| dshot_commands.h | ||
| keywords.txt | ||
| library.properties | ||
README.md
DShotRMT - ESP32 Library (Rewrite for ESP-IDF 5)
A modern, robust C++ library for generating DShot signals on the ESP32 using the new ESP-IDF 5 RMT encoder API (rmt_tx.h / rmt_rx.h).
Supports all standard DShot modes (150, 300, 600, 1200) and features continuous frame transmission with configurable timing.
Now with BiDirectional DShot support and advanced command management!
The legacy version (using the old
rmt.hAPI) is still available in theoldAPIbranch.
🚀 Features
- All DShot Modes: DSHOT150, DSHOT300 (default), DSHOT600, DSHOT1200
- BiDirectional DShot: Full support for RPM telemetry feedback
- Advanced Command Manager: High-level API for ESC configuration and control
- Command Sequences: Predefined initialization and calibration sequences
- Hardware-Timed Signals: Independent, precise signal generation using ESP32 RMT peripheral
- Configurable Timing: Ensures ESCs can reliably detect frame boundaries
- Error Handling: Comprehensive result reporting with success/failure status
- Simple API: Easy integration into your Arduino or ESP-IDF project
📦 Installation
Arduino IDE
- Search "Arduino Library Manager" for "DShotRMT"
or
- Clone this repository or download as ZIP
- Place in your Arduino libraries folder (
~/Arduino/libraries/DShotRMT/) - Restart Arduino IDE
PlatformIO
Add to your platformio.ini:
lib_deps =
https://github.com/derdoktor667/DShotRMT.git
Manual Installation
git clone https://github.com/derdoktor667/DShotRMT.git
⚡ Quick Start
Basic Usage (DShotRMT)
#include <DShotRMT.h>
// Create motor instance (GPIO 17, DSHOT300, non-bidirectional)
DShotRMT motor(17, DSHOT300, false);
void setup() {
Serial.begin(115200);
// Initialize the motor
dshot_result_t result = motor.begin();
if (result.success) {
Serial.println("Motor initialized successfully");
} else {
Serial.printf("Motor init failed: %s\n", result.msg);
}
}
void loop() {
// Send throttle value (48-2047)
dshot_result_t result = motor.sendThrottle(1000);
if (!result.success) {
Serial.printf("Throttle command failed: %s\n", result.msg);
}
}
Bidirectional DShot (RPM Telemetry)
#include <DShotRMT.h>
// Enable bidirectional mode for telemetry
DShotRMT motor(17, DSHOT300, true);
void setup() {
Serial.begin(115200);
motor.begin();
}
void loop() {
// Send throttle
motor.sendThrottle(1000);
// Get telemetry data
dshot_telemetry_result_t telemetry = motor.getTelemetry(14); // 14 magnets
if (telemetry.success) {
Serial.printf("eRPM: %u, Motor RPM: %u\n",
telemetry.erpm,
telemetry.motor_rpm);
}
}
📚 Examples
The library includes comprehensive examples:
1. Basic DShot Control (dshot300.ino)
- Simple throttle control
- Command execution
- Serial interface for testing
- Telemetry reading (if bidirectional enabled)
2. Advanced Command Management (command_manager.ino)
Interactive ESC control with full menu system:
=== DShot Command Manager Menu ===
1 - Stop Motor
2 - Activate Beacon 1
3 - Set Normal Spin Direction
4 - Set Reversed Spin Direction
5 - Get ESC Info
6 - Turn LED 0 ON
7 - Turn LED 0 OFF
0 - Emergency Stop
Advanced Commands:
cmd <number> - Send DShot command (0-47)
throttle <value> - Set throttle (48-2047)
repeat cmd <num> count <count> - Repeat command
🔧 Hardware Configuration
Supported DShot Modes
| Mode | Bitrate | Bit Time | Frame Time | Use Case |
|---|---|---|---|---|
| DSHOT150 | 150 kbit/s | 6.67 µs | ~107 µs | Long wires, EMI-prone |
| DSHOT300 | 300 kbit/s | 3.33 µs | ~53 µs | Standard (recommended) |
| DSHOT600 | 600 kbit/s | 1.67 µs | ~27 µs | High performance |
| DSHOT1200 | 1200 kbit/s | 0.83 µs | ~13 µs | Racing applications |
GPIO Configuration
// Using GPIO number
DShotRMT motor(17, DSHOT300);
// Using GPIO enum
DShotRMT motor(GPIO_NUM_17, DSHOT300);
// With bidirectional support
DShotRMT motor(17, DSHOT300, true);
🎯 DShot Commands
| Command | Value | Description | Usage |
|---|---|---|---|
| MOTOR_STOP | 0 | Stop motor | Always available |
| BEACON1 - 5 | 1 - 5 | Motor beeping | Motor identification |
| ESC_INFO | 6 | Request ESC info | Get ESC version/settings |
| SPIN_DIRECTION_1/2 | 7 - 8 | Set spin direction | Motor configuration |
| 3D_MODE_OFF/ON | 9 - 10 | 3D mode control | Bidirectional flight |
| SAVE_SETTINGS | 12 | Save to EEPROM | Permanent configuration |
| EXTENDED_TELEMETRY_ENABLE/DISABLE | 13 - 14 | Telemetry control | Data transmission |
| SPIN_DIRECTION_NORMAL/REVERSED | 20 - 21 | Spin direction | Alias commands |
| LED0-3_ON/OFF | 22 - 29 | LED control | BLHeli32 only |
| AUDIO_STREAM_MODE | 30 | Audio mode toggle | KISS ESCs |
| SILENT_MODE | 31 | Silent mode toggle | KISS ESCs |
📚 DShot Protocol Details
Packet Structure
Each DShot frame consists of 16 bits:
- 11 bits: Throttle/command value (0-2047)
- 1 bit: Telemetry request flag
- 4 bits: CRC checksum
Checksum Calculation
// Standard DShot CRC
uint16_t crc = (data ^ (data >> 4) ^ (data >> 8)) & 0x0F;
// Bidirectional DShot (inverted CRC)
uint16_t crc = (~(data ^ (data >> 4) ^ (data >> 8))) & 0x0F;
Bidirectional DShot
- Inverted Logic: High/low levels are inverted
- GCR Encoding: Telemetry uses Group Code Recording
- 21-bit Response: 1 start + 16 data + 4 CRC bits
- eRPM Data: Electrical RPM transmitted back to controller
🛠️ ESP32 RMT Peripheral
The library utilizes the ESP32's RMT (Remote Control) peripheral for precise signal generation:
Advantages
- Hardware Timing: No CPU intervention during transmission
- Concurrent Operation: Multiple channels can run simultaneously
- DMA Support: Efficient memory-to-peripheral transfers
📖 References & Documentation
DShot Protocol
ESP32 Documentation
🤝 Contributing
We welcome contributions! Please:
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Submit a pull request
Development Guidelines
- Follow existing code style
- Add documentation for new features
- Include examples where appropriate
- Test with real hardware when possible
Reporting Issues
When reporting issues, please include:
- ESP32 board type and version
- Arduino/ESP-IDF version
- ESC type and firmware
- Complete error messages
- Minimal reproduction code
📄 License
MIT License – see LICENSE
👤 Author
Wastl Kraus
- GitHub: @derdoktor667
- Website: wir-sind-die-matrix.de
