PDA

View Full Version : Adjusting Sensitivity/Scale of Controls


archimedes
12-21-2004, 09:18 PM
Last year was the first year for our team. Due to this, we are not completely familiar with the code. Our robot is very sensitive to the joysticks that came with the kit and is hard to control in a productive manner. Very little changes have been made to the default code. We are wondering if anyone would be able to help us solve this sensitiviy problem. Is there a way to do this in the code? Is there a way to change the scale on the joystick so all the way forward isn't something like 255 but instead 100? We have been looking mostly at user_routines.c near lines 224 in the default code for a possible solution. Is this the right place to start or is there a different place? Any help would be appreciated.

Wyoming Aftershock

Billfred
12-21-2004, 09:24 PM
I was searching for information on the IFI system over the summer, and I found this link: http://qin.laya.com/first/joystick.html

That code is in PBASIC (as used on the previous generation of controllers), but you probably should be able to rewrite it. (Chalk it up as a learning experience. :D) Basically, that link teaches you how to set up the motor to speed up on an exponential curve, instead of linear. Slow when you start, but still full power when you push it all the way up.

Hope it helps!

archimedes
12-21-2004, 09:30 PM
Is there any way to adjust the scale also?

MikeDubreuil
12-21-2004, 09:37 PM
Is there a way to do this in the code? Is there a way to change the scale on the joystick so all the way forward isn't something like 255 but instead 100? Step number one is to understand what the output is expecting. 255 is arguably an illegal output and 100 would not cause your robot to go forward, but actually go reverse. A good start would be to read the Programmer Reference Guide (http://innovationfirst.com/FIRSTRobotics/pdfs/2004_Programming_Reference_Guide_12-Apr-2004.pdf) from Innovation FIRST.

Let us know if you need any help after that :)

Mr. Lim
12-21-2004, 09:52 PM
There is a lengthy thread about this in the Programming Forum:

http://www.chiefdelphi.com/forums/showthread.php?p=301722#post301722

The link I've included jumps directly to some code from Team 188 that you can try.

Good Luck!

ConKbot of Doom
01-13-2005, 10:19 PM
Ive been looking at this problem, but rather than a software solution, I would be interested in a hardware solution. Ive been looking at using a potentiometer as a solution.

I would set up a resistor divider to get .5vcc from the OI and send that to pin 1 on the pot, the signal from the joystick would go to pin 3 and pin 2 would go to the input on the OI. That way the driver could adjust the scale quickly, from no scaling to locked at 127

I know the rules prohibit messing around inside joystick, but allow a custom control box, so I would think that a box in the middle would be in a bit of a grey area. Can anyone lend any clarification to this? I just think that why should we devote processor cycles to something that can be done in hardware so simply. Plus I'm more comfortable with electronics than coding, so I'm sure that plays a role in it too.

Mr. Lim
01-14-2005, 09:30 AM
Ive been looking at this problem, but rather than a software solution, I would be interested in a hardware solution. Ive been looking at using a potentiometer as a solution.

I would set up a resistor divider to get .5vcc from the OI and send that to pin 1 on the pot, the signal from the joystick would go to pin 3 and pin 2 would go to the input on the OI. That way the driver could adjust the scale quickly, from no scaling to locked at 127

I know the rules prohibit messing around inside joystick, but allow a custom control box, so I would think that a box in the middle would be in a bit of a grey area. Can anyone lend any clarification to this? I just think that why should we devote processor cycles to something that can be done in hardware so simply. Plus I'm more comfortable with electronics than coding, so I'm sure that plays a role in it too.

Tristan Lall did this to our robot last year using software. We use the older black Flightsticks which have a wheel on them. In fact, the default code still shows variables like "p1_wheel" from these old joysticks =).

The wheel worked as a speed limiter which would scale the total range of the joystick down. Our reason for this was to demo the robot to children, and allow them to drive without fear of breaking things.

I believe this code is UNTESTED, so programmer beware. However the concept alone should prove useful:

temp_scale_long = (unsigned long) (p1_wheel * 3) >> 2 + 64; //So what if it's stepwise? (Just say no to floats.)
temp_tankx_long = (signed long)p1_x - 128;
temp_tankx_char = (unsigned char)(((temp_tankx_long * temp_tankx_long * temp_tankx_long * temp_scale_long) >> 22) + 128);
temp_tanky_long = (signed long)p1_y - 128;
temp_tanky_char = (unsigned char)(((temp_tanky_long * temp_tanky_long * temp_tanky_long * temp_scale_long) >> 22) + 128);
pwm01 = pwm03 = pwm05 = Limit_Mix(2000 + temp_tanky_char + temp_tankx_char - 127);
pwm02= pwm04 = pwm06 = Limit_Mix(2000 + temp_tanky_char - temp_tankx_char + 127);


FYI, we did this in ADDITION to our cubic transfer function, and here Tristan (who once was a driver for Team188) has modified our tank drive code for his preferred one-stick drive.

Hope this helps!

-SlimBoJones...