Hello,
I mounted my WAS (Delphi) like this:
I mounted it directly on the hydraulic cylinder because I was thinking that whatever the type of my steering, the displacement of the cylinder rod will be symetric if I turn left or right (the rod will get in or get out from the same distance).
In fact, I was totally wrong. The maximum rod course is 20.5cm (full turn left or right). But when I drive straight forward, the rod of the left and right cylinder are 13cm out. It means that, when I full turn left or right :
- The rod of the inner turn cylinder is 13cm retraced
- The rod of the outer turn cylinder is out of 7,5cm
Consequence, du to this Ackermann configuration, the max rotation angle of my WAS is different when I full steer left or right. As my WAS is mounted on the right wheel, the rotation angle is bigger when I drive full right.
I thinks, for following an A-B line it’s not a problem, has I think the max angle set point will be something like +/- 10°.
But the difficulty will comes with U turn. Actually, with this configuration, I have to turn full right and setup the count per degre to obtain my max steering angle (40° on my Fiat 115-90). But consequently when I full turn left, Arduino measure a steering angle of somthing like 30° instead of 40°.
So to avoid any trouble, I the autosteer configuration I will have to limit the max steering angle at 30°. So the tractor will have a turn radius different in a left or right uturn and in one side I loose some maneuverability of my tractors.
Does anyone have encounter the same difficulty with the same type of steering and has some advises or solutions, to compensate this asymmetry du to Ackermann steering ?
I look at the Arduino code to try to anderstand how the steering angle is calculated and how it’s use for driving the motor and to see if I could find a solution.
I saw that the steer angle is calculated with the following code:
//DETERMINE ACTUAL STEERING POSITION
steeringPosition = (steeringPosition - steerSettings.steeringPositionZero); //read the steering position sensor
//convert position to steer angle. 32 counts per degree of steer pot position in my case
// ***** make sure that negative steer angle makes a left turn and positive value is a right turn *****
#if WAS_Invert
steerAngleActual = (float)(steeringPosition) / steerSettings.steerSensorCounts;
#else
steerAngleActual = (float)(steeringPosition) / -steerSettings.steerSensorCounts;
#endif
I saw that steerSettings.steeringPositionZero is define in the struc type « storage » call steerSettings, initialised with the value SteerPosZero (define in the setup zone) and after updated with the « Wheel Angle Sensor Zero » compensation received from AOG through USB/RS232.
steerSettings.steerSensorCounts is also define in the same struc type, initialised at 30 (with AS1115) and after updated with the « Count per Degree » value comming from AOG.
If I draw the line angle=f(counts) with a standard steer, we have something like this:
To calculate the angle, the arduino code center the curve on zero, so the line is somthing like y=a*x with the slop « a » that correspond to the « Count per degree »:
But in case of my Ackermann steering, because of the assymetrical rotation, the previous line does’nt work for one side of the line (max count and min count aren’t symetrical compared to steerPositionZero), as illustrated in the following graph:
In fact, the line angle=f(count) has a different slope depending if we are left or right side of steerPositionZero: the Count Per Degree is different.
So, a solution what I was thinking is to use a different counts per degree if we are left or right of the steerPositionZero.
If we define in the Struct type Storage steerSetting :
- steerSensorCountsLeft (count per degree for left turn)
- steerSensorCountsRight (count per degree fot right turn)
The code could become:
//DETERMINE ACTUAL STEERING POSITION
steeringPosition = (steeringPosition - steerSettings.steeringPositionZero); //read the steering position sensor
//convert position to steer angle. 32 counts per degree of steer pot position in my case
// ***** make sure that negative steer angle makes a left turn and positive value is a right turn *****
if (steering Position >= 0) {
#if WAS_Invert
steerAngleActual = (float)(steeringPosition) / steerSettings.steerSensorCountsRight;
#else
steerAngleActual = (float)(steeringPosition) / -steerSettings.steerSensorCountsRight;
#endif
}
else {
#if WAS_Invert
steerAngleActual = (float)(steeringPosition) / steerSettings.steerSensorCountsLeft;
#else
steerAngleActual = (float)(steeringPosition) / -steerSettings.steerSensorCountsLeft;
#endif
}
After the steerAngleActual is used by the PID and motordrive fuction to drive the motor.
Do you think it could work ? Or it’s a bad idea that will lead to disaster ? I would like to have your opinion before making a try.
I think I have enough knowledge to edit the Arduino code to add this function to make a try. But I haven’t enough knowledge to edit AOG to define inside 2 adjustable parameters steerSensorCountsLeft & steerSensorCountsRight and send it to USB. So I could make the try only by manually define the values in the Arduino code.
Thank for your advises, or any other proven solution that work with Ackermann steering.
Math