Joystick, mehr weg als Daten

Moin,

ich habe mir zwei von diesen Joysticks gekauft http://www.ebay.de/itm/281353509711?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649 Angeschlossen wie die Beschriftung auf der Platine. Wenn ich diesen auslese, habe ich in der Mitte 506 bzw 511 als Wert. Wenn ich diesen dann bewege sind die Max bzw. Min Werte schneller erreicht, als ich das Ende der Poties erreiche. (gefühlt halbe strecke) Die Bewegung habe ich nur ganz langsam gemacht damit Zeit fürs Auslesen und Aktualisieren bleibt. Als Code habe ich diese Beispiel genommen.

/* YourDuino Electronic Brick Test 5
 Joystick  V1.01
 terry@yourduino.com */

/*-----( Declare Constants )-----*/
/*-----( Define Pin Numbers )-----*/
#define X_AXIS    A0  /*----(Joystick Pin connections)----*/
#define Y_AXIS    A1
#define Z_SWITCH  3

/*-----( Declare Variables )-----*/

int  Xvalue; /*----(Values we will read from the Joystick)----*/   
int  Yvalue;
int  Zvalue;

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
Serial.begin(115200);  /*----(Set up Serial Monitor Output)----*/
Serial.println("YourDuino Joystick Test 1.01");

}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
Xvalue = analogRead (X_AXIS); /*----(Read the X value and display it)----*/
Serial.print ( "X:" );
Serial.print (Xvalue, DEC );

Yvalue = analogRead (Y_AXIS);/*----(Read the Y value and display it)----*/
Serial.print ( " | Y:" );
Serial.print (Yvalue, DEC );

Zvalue = digitalRead (Z_SWITCH);/*----(Read the Z value and display it)----*/
Serial.print ( " | Z: " );
Serial.print (Zvalue, DEC );

Serial.println ();  /*----(End of Line)----*/

delay(100);  /*----(Wait to read the print)----*/
}/* --(end main loop )-- */

/* ( THE END ) */

Ich denke mal es sind die verbauten Poties diese haben ich mit dem Multimeter überprüft. Die 0V sind z.B. sehr viel früher erreicht als das Ende des Weges. War wohl ein Griff ins Klo.

Sind die verbauten Poties in einem Gamecontroller so viel besser?

Hallo,
das kommt ja schon mit dem hin, was in der Beschreibung steht. In Null-Stellung 2,5 Volt- gleich ca. 511 am A0 Pin.
D.h. Du hast einen Weg von 511 bis 1024 von MitteJoyStick bis Anschlag.
Das ist sehr empfindlich und noch weniger Weg.
Mit einer elektronischen Bastelei würde man da sicher weiterkommen. Wie funktioniert denn das Ding, kannst Du da
vielleicht irgendwo ein “Poti” austauschen?
Per Software könntest Du die “map” Funktion nutzen, sonst fällt mir da nichts zu ein.
Nach Datenblatt oder Schaltplan fragen ist wohl sinnlos.
Gruß und Spaß
Andreas
P.S.
Moment, wie funktioniert denn das Ding. Wenn Du den vor Dir liegen hast, dann hast Du 511 in der Mitte.
Wenn Du den Stick jetzt nach oben drückst, dann 1023?
Wenn Du den Stick jetzt nach unten drückst, dann 0?
Dann funktioniert er ja richtig?

Der Joystick hat aber sagen wir mal Spiel. Er will dass er sein Maximum von 0 oder 1023 am Anschlag hat. Das ist nicht der Fall.

Hallo,
wenn es “nur” um das Spiel geht, dann muß man ganz einfach den Weg begrenzen.
Entweder einbauen, oder Klötzchen unterkleben. Einstellen ist bei dem Preis wohl nicht möglich.
Gruß und Spaß
Andreas

Ne-die haben kein Spiel. Hab auch solche Teile und: die sind alle so. Das "Ende" (1024 oder eben 0) werden bereits nach ca. nem Drittel des möglichen Weges erreicht. ABER: für das, wofür die gedacht sind (Daumensteuerung!) ist der Weg genau richtig. Die werden normal nämlich auch in Gehäuse gebaut, und können dann gar nicht so weit bewegt werden... Trotzdem isses, bei freier Montage, recht ärgerlich, da man wirklich sehr sensibel hantieren muss mit den Dngern. Feinfühlig sind die durchaus: mit ner ruhigen Hand kann man den ganzen Wertebereich ohne weiteres "durchlaufen"- das geht.

Nein Spiel haben die Dinger nicht.
Die Rückstellung erfolgt mit einer eingebauten Feder.
Wie gesagt, wenn ich ihn in eine Richtung bewege ist die Ausgabe von z.B. 1023 schon erreicht,
aber ich habe noch weiter ca 1/4 weg bis zum anschlag über
Anschlag <----1/4 ---- Mitte -----1/4 -----Anschlag
Also jeweils ca. nach dem 1/4 Bewegungsweg von der Mitte ist der Max bzw Min Wert schon erreicht.
Poti Tauschen… nicht wirklich bei dem Preis

Gucke schon bei Ebay nach einen Defekten RC Sender mit anständigen Kreuzknüppel.

Kann es sein, dass du den Joystick falsch bedienst?

0 - 1023 ist möglich, wenn du diese genau in Richtung der X oder Y Achse bewegst. Wenn du aber mit 45° versetzt bewegst, sind 0 und 1023 nicht mehr möglich. Möglich wäre 250 - 750.

Habe bislang nur Joysticks von PS2 Controllern genutzt. Sind meiner Meinung nach vom Aufbau deutlich kompakter. Jedoch ist der Weg einfach zu kurz um diese direkt zu nutzen. Stand ebenfalls vor dem Problem mit einem PS2 Kontroller Umbau für RC.

Sowas kann man softwaretechnisch verfeinert. Wirst aber selber schreiben dürfen.. Durchschnittwerte ermitteln, oder die Linearität verändern.

Hallo, http://www.ebay.de/itm/Kreuzknuppel-Analogstick-Thumbstick-Joystick-Fernsteuerung-Sender-/261555855122?pt=RC_Modellbau&hash=item3ce5f19f12 Gruß und Glück Andreas

sschultewolter: Kann es sein, dass du den Joystick falsch bedienst?

Nein den Joystick bedien ich richtig. Die Werte von 0 bis 1023 erreiche ich ja nur zu früh...

sschultewolter: 0 - 1023 ist möglich, wenn du diese genau in Richtung der X oder Y Achse bewegst. Wenn du aber mit 45° versetzt bewegst, sind 0 und 1023 nicht mehr möglich. Möglich wäre 250 - 750.

Dem muss ich widersprechen. Bei deiner Annahme müsst sich der Joystick in einer Raute ( Also Quadrat um 45 Grad gedreht) bewegen. Aber die Endpunkte sind parallel zu den Achsen, also in einem Quadrat. Dem entsprechend sind die Eckpunkte 0 0, 1023 0, 1023 1023 und 1023 0 als Werte. So ist es auch bei den (großen) RC- Sender. Wäre ja auch unlogisch das wenn ich z.B. Vollgas fahre nicht mehr den vollen Lenkausschlag hin bekomme. Und sag mir jetzt nicht, dass so etwas dann berechnet wird. Wie soll es denn bei den alten Analogen 27, 35 und 40 MHz Anlagen dann funktioniert haben, die waren noch nicht µC unterstützt .

Gruß Ingo

Gruß Ingo

Der liefert auch in den Ecken die vollen Werte: links oben z.B. 0,0 und rechts unten dann entsprechend 1024,1024. Das klappt schon. Das "Problem" (ich sehe es nicht als solches, die Dinger sind einfach so und nicht anders konstruiert) ist eben, dass diese End-Werte schon erreicht werden, lange bevor der mechanische Weg ausgereizt ist. Wären die, wie es gedacht ist, in nem Gehäuse verbaut, würd ich diese Frage nicht stellen-da wäre der Weg mechanisch begrenzt. da er das aber nun mal nicht ist, kann man sie bedeutend weiter bewegen als sie messen können. Das ist alles.

Stimmt :wink: Ich konnte die Werte nicht anfahren, da diese vom Gehäuse (PS2) blockiert werden. Dort ist es nur ein Kreis. Mit der Berechnung meinte ich es anders.

Was für deinen Fall ausreichen würde (ist die Frage, ob sich alle baugleichen Joysticks so verhalten).
Zur Lösung:

Entweder du parametrierst den Joystick mit festen defines, oder aber machst bei jedem Start eine Initialisierung (die Werte der Initialisierung können auch ins Eeprom geschrieben werden, wenn es nicht jedes mal von neuem gemacht werden soll.

Dazu kannst du wie folgt vorgehen, am besten defenierst du dir einen Zeitraum von zB. 10 Sekunden, in dem du alle Achsen kommt von Min nach Max fährst.

Der Ablauf könnte dann wie folgt sein.

int x_min, x_max;
int y_min, y_max;

void init() {
int x_read = analogRead(A0);
int y_read = analogRead(A1);

if(x < x_min) x_min = x;
else if(x > x_max) x_max = x;

if(y < y_min) y_min = y;
else if(y > y_max) y_max = y;
}

void loop() {
x = map(analogRead(A0), x_min, x_max, -128, 127);
y = map(analogRead(A1), x_min, x_max, -128, 127);
}

Die Skalierung kann natürlich noch angepasst werden, denke aber, eine höhere Auflösung macht bei dem kurzen Weg kaum einen Unterschied.

Ah jetzt verstehe ich was Du meinst.
Es wäre dann so wie bei Windows mit der Kalibrierung des Joysticks,
Wo man diesen ein paar mal im Kreis bewegt.
Die Auflösung ist schon ok da ich diese dann an den RC Sender übergeben will.
Dieser arbeitet mit 10Bit Auflösung. Von daher wäre es unnütz erst runter und dann wieder rauf zu rechnen.

Gruß Ingo