I’m working on a dual-hull USV that uses vectored steering, where both hulls can pivot outward or inward to steer the vessel. Each hull has a high-torque servo for steering and a thruster for propulsion.
I’ve noticed that the Pixhawk servo output range (1000–2000 µs) doesn’t seem to allow the full physical range of motion needed — the servos are capable of wider movement (about 500–2500 µs). This limits the steering angle, making it difficult to achieve full vectored control.
My questions are:
Is there a way to extend the Pixhawk PWM output range beyond 1000–2000 µs (e.g., 800–2200 µs or 500–2500 µs)?
If not, what’s the recommended workaround for full-range vectored steering — e.g., scaling in firmware, mixing parameters, or handling steering via an external controller (like a PCA9685 + Raspberry Pi)?
Would modifying SERVOx_MIN and SERVOx_MAX parameters achieve this safely, or does the firmware still clamp signals internally?
Any advice or shared experience with vectored USVs or differential thrust steering setups would be much appreciated.
I tested this using a Python script to manually send PWM signals from 800 to 2200 µs while in Manual mode. What I noticed is that the servo output stops updating beyond 1900 µs, and it also completely stops responding below 1100 µs. It seems like the Pixhawk is clamping the signal within the 1000–2000 µs range, even though the servos can handle a wider range.
edit:
I’m using a 180 Degree servo with a gear ratio of 2:1 so the angle is halfed, if the servos don’t go all the way to 180 , then the halfed output is almost unusuable.
i already did , i went to full parameter list and changed it to 800 to 2200.
They stop responding at 1100 and 1900.
edit: I removed the motors and tested them using the PCA9685 and the output was good from 0 to 180.
when i connect the Pixhawk it stops somewhere at 90
For my test, I connected the Pixhawk directly to my PC and wrote a Python script that sends PWM signals based on keyboard input. Pressing “Q” increases the PWM by 10 µs, and pressing “E” decreases it by 10 µs. The script also prints the current PWM value (e.g. 1500) so I can track exactly what’s being sent in real time.
I set the Pixhawk to Manual mode and observed how the servo responded as I adjusted the PWM from 800–1500–2200 µs. The servo moves normally between roughly 1100 and 1900 µs, but beyond that range it stops responding, which makes me think the Pixhawk might be clamping the signal internally.
Regarding the RC calibration — I haven’t calibrated it yet since I’m not using a traditional transmitter or receiver for this setup. The PWM signals are generated directly from the Python script, so the goal was just to check whether the Pixhawk passes through the full PWM range or enforces limits even without an RC input.
my end game is to make the USV autonomous, the test with keyboards is just to see if the boat have enough range to make turns.
So at the end i’m going to use a camera to guide the USV autonomously.
Without seeing a code snippet, it’s impossible to rule out your test method as causal.
Try increasing the servo range to 500-2500 and see if you get different/better results.
RC overrides outside the RC1_MIN to RC1_MAX range will have no (valid) effect, as MANUAL mode simply scales your RC input to servo output across a linear range (or with some expo if MANUAL_STEER_EXPO is used). So it follows that you saw no effect when sending RC overrides outside the 1100-1900 range. But you should see the servo swinging from SERVOx_MIN to SERVOx_MAX across the full RC input range (monitor Mission Planner’s SERVO page to see that in real time).
RC overrides should also be sent repeatedly at a rate of 1Hz or faster, else they will expire, and the servo will return to the trim position (or as commanded by an actual RC input).
It’s fine to use the parameter list to change the values outside their “normal” ranges.
Monitor that servo page while running your test.
And again, override values outside RCx_MIN to RCx_MAX are invalid. You should be testing overrides from 1100-1900 based on the existing RC calibration params. Again, they are scaled for output.
I got it work , it was a software issue and the Pixhawk needed some rebooting. Also it turns out the PWM i printed on the screen is not the same as the raw PWM
from the image PWM is 2500 but the printed one from my scrip says 1960. All in all ,i managed to get it to turn the full 180.
Note: The steering and the Throttle are switched ,(I don’t know why but they work that way.)
Could you guide me? I want to install a PixHack on a small boat so that it can be controlled autonomously. I would like to know what servomotor I can use for a boat of about 12 tons and what type of steering to include to be able to control it through the PixHack.