The cheaper joysticks use potentiometers. There's a little tiny metal contact sliding along a resistance track. Dirt, water, age and electrical noise will all cause problems in the long term.
Expensive joysticks use hall effect sensors. They sense the rotation of a magnet without touching it. They never wear out and dirt and water don't affect the magnetic signal. If you can find one under $300 you are doing well. However some single-axis controls such as the throttle on an electric bike use the same technology and they are relatively cheap.
There you go. If you're able to use one of those then you are doing well.
You need to give more information about your application. "Are there affordable cars?" Yes, but if you are trying to carry 20 people and you only have a few thousand dollars then no, there aren't "affordable" cars.
I am building a dron. I want the dron to don't move if joystick is released. At the start up I make multiple measures of the steady state and use it as zero value.
Instead of looking for 'zero' as being 512, let 'zero' be any read value (for example) between 502 and 522. The 'deadband' in this case is +/- 10 counts. Now if the joystick produces a value between 502 and 522 the system will assume a position value of 'zero'
Not only 'zero' might need trimming, but also the 'extremes' might not be 0 and 1023.
Since we didn't see any code or pictures, we also can't be sure you're using the pots correctly.
You should write a few lines of code that just displays the pot values in the serial monitor.
Then try to tame the beast with double reads, offsets, and/or map().
Post your code and a picture of the setup if you want help with that.
You might need a bit more than just "potValue = analogRead(potPin);"
Attached is an example (unrelated) I wrote for reading a pot and converting to 0-100% (101 values).
It ignores the extremes, and has a deadband between each % value.
And only prints if the % value changes.
Leo..
// converts the position of a 10k lin(B) pot to 0-100%
// pot connected to A0, 5volt and ground
int rawValue;
int oldValue;
byte potPercentage;
byte oldPercentage;
void setup() {
Serial.begin(115200); // set serial monitor to this baud rate, or change the value
}
void loop() {
// read input twice
rawValue = analogRead(A0);
rawValue = analogRead(A0); // double read
// ignore bad hop-on region of a pot by removing 8 values at both extremes
rawValue = constrain(rawValue, 8, 1015);
// add some deadband
if (rawValue < (oldValue - 4) || rawValue > (oldValue + 4)) {
oldValue = rawValue;
// convert to percentage
potPercentage = map(oldValue, 8, 1008, 0, 100);
// Only print if %value changes
if (oldPercentage != potPercentage) {
Serial.print("Pot percentage is: ");
Serial.print(potPercentage);
Serial.println(" %");
oldPercentage = potPercentage;
}
}
}
afedorov:
I am building a drone. I want the drone to don't move if joystick is released. At the start up I make multiple measures of the steady state and use it as zero value.
What is the deadband programmed?
It's de-sensitisation. So you just have to write code that processes the values from the joystick. Make the joystick unresponsive if the joystick values lie in some suitable range around the 512 region..... such as... make the joystick not do anything (eg. output zero values) if the actual joystick values fall in the range from say 508 to 516, or whatever range you want.
Before you work on the drone, probably better off starting with using your joystick to control an RC car to begin with.
I am actually testing the joystick on a RC car I built. The issue I noticed that the over time the default value shifts and original limit doesn't work anymore.