I should apply a gamma curve to the analog axes read from Classic controller to make the response of the stick more subtle near the center and more steep close to the edges.
Classic controller analog sticks provide position information with a low resolution. Left stick provides 64 steps and Right stick provides 32.
Both axes are combined using the following equations:
index = LeftJoy + (RightJoy * 2) - 32; if (index > 63) index = 63; if (index < 0 ) index = 0 ;
The variable index shoulld assume a value between 0 and 63.
When both sticks are in center position the resulting will be 32, right in the middle of the scale.
Either stick can be pushed or pulled to make the index value swing from 0 to 63. If both sticks are moved in the same direction the resulting value will reach the maximum (or minimum) on the middle of their course (not exactly in the middle because of the gamma curve). On the other hand, when both sticks are thoroughly moved in opposite directions the resulting will be again the middle of the scale.
Whole code to process the joysticks is then:
lx=classic.leftJoyX();
ly=classic.leftJoyY();
rx=(classic.rightJoyX()<<1);
ry=(classic.rightJoyY()<<1);
combinedXaxis = lx+rx-32;
if (combinedXaxis>63) combinedXaxis = 63;
if (combinedXaxis<0) combinedXaxis = 0;
combinedYaxis = ly+ry-32;
if (combinedYaxis>63) combinedYaxis = 63;
if (combinedYaxis<0) combinedYaxis = 0;
combinedYaxis = 63-combinedYaxis;
The latter statement on code above inverts the way that Y axis behaves so the resulting value grows when the stick is moved down and vice versa.
Gamma
The curve below depicts the values from middle scale to the upper limits (down and right), being a total of 31 counts. The Y axis represents the amount of countings that should be read by the 5200 system.
The whole curve along with a gamma = 2.0 and a linear reference (gamma = 1.0) is depicted below
uint8_t gammaCurve[64] = { // gamma = 2.0
5 , 12 , 18 , 24 , 30 , 36 , 42 , 47 , 52 , 57 , 62 , 66 , 71 , 75 , 78 , 82 ,
86 , 89 , 92 , 95 , 97 , 100, 102, 104, 106, 107, 109, 110, 111, 112, 112, 112,
113, 113, 113, 114, 114, 115, 117, 118, 120, 122, 124, 126, 129, 131, 134, 138,
141, 145, 149, 153, 157, 162, 167, 172, 177, 182, 188, 194, 200, 207, 213, 220
}
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.