Hi everyone,
I’m building a very large 3D printer (3x3m build volume) and using multiple ODrive Pros to control the motors via CAN from an ESP32 main controller. Due to the machine’s size, CAN is essentially my only option for reliable communication.
Current Setup:
- ESP32 as main controller, calculating speed and position from gcode and transmitting via CAN
- Each ODrive Pro running standard firmware
- Controllers set to
INPUT_MODE_TRAP_TRAJ
- ESP32 sends a target position to each ODrive, then waits for all ODrives to report they’re within tolerance of that position before sending the next target
The Problem: I’m concerned about timing precision and synchronization between axes. My current approach of “move, wait for all axes to arrive, then move again” seems imprecise and leads to:
- Stuttering motion as axes wait for the slowest one
- Loss of smooth velocity profiles
- Issues with axes starting and arriving at slightly different times
My Questions:
- Is this “wait for position” approach fundamentally wrong for coordinated motion? Should I be streaming positions at a fixed rate instead? Does the ODrive CAN implementation have a preferred way of achieving this?
- Is
INPUT_MODE_TRAP_TRAJ
the right mode for this application, or should I be using something else? - If I switch to streaming positions, what update rate should I target for CAN commands? (50-100Hz?)
- Are there any ODrive Pro features I should be leveraging that are specifically designed for synchronized multi-axis systems?
- Has anyone successfully built a similar ODrive CAN system with good synchronization?
I’m using standard ODrive Pro firmware and would prefer not to go down the custom firmware route if possible.
Any advice, best practices, or examples of similar implementations would be greatly appreciated!
Thanks in advance!