Joystick an ESP32

Moin,

ich habe einen XY-Joystick an einem ESP32 angeschlossen und versuche einen Punkt auf einer 32x32 MAX7219 Matrix damit zu steuern.

Funktionieren tut das.
Die Joysticksteuerung kenne ich aus dem RC Bereich (Hubschrauber) sehr gut.
Wenn man den Stick bewegt, dann bewegt sich ein Servo proportional dazu. Wenn man beide Endwerte und den Mittelpunkt korrekt eingestellt hat, dann folgt das Servo ebenso korrekt der Position des Sticks.

So, nun übertragen in die Arduino Welt wäre ich vom gleichen Verhalten ausgegangen, d.h. die analogen Einlesewerte stehen in einem proportionalen Verhältnis zur Position des Sticks.
Auch das funktioniert grundsätzlich.
Aber: Das Steuergefühl ist sowas von unstetig und schlecht.
Ich könnte mir vorstellen, dass dies an extremst schlechten/billigen Potis liegt.
Hat jemand ähnliche Erfahrungen gemacht?
Hat jemand einen Tipp zu qualitativ guten Joysticks, die auch eine proportionale Steuerung zulassen?
Hat jemand einen Tipp wie man das pragmatisch testen könnte?

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
int pinCS = 5; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
int numberOfHorizontalDisplays = 4;
int numberOfVerticalDisplays = 4;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
int x = 0;
int y = 0;
void setup() {
  Serial.begin(115200);
  matrix.setIntensity(0); // Set brightness between 0 and 15
  matrix.setPosition(0, 3, 3); // The first display is at <0, 0>
  matrix.setPosition(1, 2, 3); // The second display is at <1, 0>
  matrix.setPosition(2, 1, 3); // The third display is at <2, 0>
  matrix.setPosition(3, 0, 3); // And the last display is at <3, 0>
  matrix.setPosition(4, 0, 2); // The first display is at <0, 0>
  matrix.setPosition(5, 1, 2); // The second display is at <1, 0>
  matrix.setPosition(6, 2, 2); // The third display is at <2, 0>
  matrix.setPosition(7, 3, 2); // And the last display is at <3, 0>
  matrix.setPosition(8, 3, 1); // The first display is at <0, 0>
  matrix.setPosition(9, 2, 1); // The second display is at <1, 0>
  matrix.setPosition(10, 1, 1); // The third display is at <2, 0>
  matrix.setPosition(11, 0, 1); // And the last display is at <3, 0>
  matrix.setPosition(12, 0, 0); // The first display is at <0, 0>
  matrix.setPosition(13, 1, 0); // The second display is at <1, 0>
  matrix.setPosition(14, 2, 0); // The third display is at <2, 0>
  matrix.setPosition(15, 3, 0); // And the last display is at <3, 0>
  matrix.setRotation(0, 1);    // The first display is position upside down
  matrix.setRotation(1, 1);    // The first display is position upside down
  matrix.setRotation(2, 1);    // The first display is position upside down
  matrix.setRotation(3, 1);    // The same hold for the last display
  matrix.setRotation(4, 3);    // The first display is position upside down
  matrix.setRotation(5, 3);    // The first display is position upside down
  matrix.setRotation(6, 3);    // The first display is position upside down
  matrix.setRotation(7, 3);    // The same hold for the last display
  matrix.setRotation(8, 1);    // The first display is position upside down
  matrix.setRotation(9, 1);    // The first display is position upside down
  matrix.setRotation(10, 1);    // The first display is position upside down
  matrix.setRotation(11, 1);    // The same hold for the last display
  matrix.setRotation(12, 3);    // The first display is position upside down
  matrix.setRotation(13, 3);    // The first display is position upside down
  matrix.setRotation(14, 3);    // The first display is position upside down
  matrix.setRotation(15, 3);    // The same hold for the last display
}
void loop() {
  Serial.print("x: ");
  Serial.print(analogRead(34));
  Serial.print(" ");
  Serial.print(map(analogRead(34), 0, 4095, 0, 32));
  Serial.print(" y:");
  Serial.print(analogRead(35));
  Serial.print(" ");
  Serial.println(map(analogRead(35), 0, 4095, 0, 32));
  matrix.drawPixel(map(analogRead(34), 0, 4095, 0, 32), map(analogRead(35), 0, 4095, 0, 32), HIGH);
  matrix.write();
  delay(10);
}

Lieben Gruß,
Chris

themanfrommoon: Hat jemand einen Tipp wie man das pragmatisch testen könnte?

Schmeiß mal Serial und delay raus, wird es dann besser?

Hast Du schon mal einen gleitenden Mittelwert über z. B. fünf Messungen probiert? mittelwert = (mittelwert * 4 + messung) / 5

Ich hab ohne serial und delay angefangen. Das macht keinen Unterschied.
Die Werte zittern auch nicht.
Mein Verdacht ist, dass es entweder was mit der Messung selber zu tun hat. Ich hab das Teil an 3,3V, GND und den analog in angeschlossen.
Oder das sind die billigsten der billigsten Schrottpotis die man sich nicht vorstellen kann.

Daher meine Frage, ob jemand ähnliche Erfahrungen gemacht hat, oder jemand eine Idee hat wie man das gut testen könnte.

Lieben Gruß,
Chris

(deleted)

Welchen Joystick hast Du denn? Wenn Du ihn mit einem Multimeter im Ohmbereich den Joystick durchgemessen? Welchen Widerstandswert hat der Joystick?

Grüße Uwe

Diese hier hab ich gekauft: https://www.amazon.de/gp/product/B07CKCBHF4 Ich denke nicht, dass die eine logarithmische Kennlinie haben.

Wie soll ich das Steuergefühl besser beschreiben. Relativ großes Totband, dann passiert viel zu viel, und den Rest vom Steuerweg passiert wieder nix. Ein proportionales Steuergefühl wäre da ganz anders, nämlich eben proportional. Dass heisst, wenn ich den Stick um 5% bewege, dann liefert der Ausgang 5% Änderung. Bei 10% Änderung am Stick liefert der Ausgang 10% Änderung. Bei 50% Änderung am Stick liefert der Ausgang 50% Änderung. Bei 100% Änderung am Stick liefert der Ausgang 100% Änderung. So sollte das eigentlich sein.

Wenn ich den Joystick bewege fühlt sich das ungefähr so an: 5% Bewegung, keine Änderung am Ausgang. 10% Bewegung, keine Änderung am Ausgang. 15% Bewegung, keine Änderung am Ausgang. 16% Bewegung, Ausgang geht auf 30% 20% Bewegung, Ausgang geht auf 60% 25% Bewegung, Ausgang geht auf 90% 30% Bewegung, Ausgang geht auf 100% 50% Bewegung, Ausgang bleibt bei 100% 80% Bewegung, Ausgang bleibt bei 100% 100% Bewegung, Ausgang bleibt bei 100%

so ungefähr fühlt sich das an.

...ich messe mal

Beschriftung: B103 267

In Neutralstellung: GND-VRX 3,518kΩ 5V-VRX 3,429kΩ GND-VRY 3,543kΩ 5V-VRY 3,479kΩ VRX-VRY 4,69kΩ GND-5V 4,58kΩ

...da seh ich jetzt nicht, dass das ein 10kΩ Poti sein soll, wohl eher 4k7 ?!

Na ja, vielleicht nimmst Du Dir die Kennlinie auf (Widerstandswerte in 10%-Schritten). Wenn die einigermaßen reproduzierbar ist adaptierst Du das dann auf den gewünschten Wert "Ausschlag in %". Wenn nicht, sind die Dinger doch eher

...für verschiedene spielerische Projekte

Ich hab mal versucht die Ausschläge abzuschätzen und habe dann die Widerstände gemessen.
So sieht die Kennlinie ungefähr aus:

Das ist doch kein lineares 10k Poti?!

Das is doch ein Müllhaufen :disappointed_relieved:

Kennlinie Poti Joystick.PNG

Hmmmm - verzeih - das ist wirklich Sch.... . Sind alle drei so schlecht?

Das reicht ja nur für kindergerechtes "binäres Schalten".

Ja die sind alle so schlecht, und wenn man mal bei amazon in den Bewertungen liest, dann sieht man dass das kein Einzelfall ist. Das schlechte Verhalten wird da sehr oft berichtet.
So rein mechanisch macht das Teil gar keinen schlechten Eindruck, aber die Kohleschichtbahn ist der allerletzte Müll.

Nun ist in erster Linie die Frage: Wo gibt es denn was besseres käuflich zu erwerben?
Da erwarte ich eigentlich so eine Kennlinie:

Kennlinie 10k Poti Joystick.PNG

Du scheibst: GND-5V 4,58kΩ Das sind die 2 Potentiometer (X und Y) paralell; also 2x um die 10kOhm.

GND-VRX 3,518kΩ 5V-VRX 3,429kΩ GND-VRY 3,543kΩ 5V-VRY 3,479kΩ Das sind 5kOhm mit 10kOhm+5kOhm paralell = 3,75kOhm

So mehr oder weniger.

Aber die Kennlinie ist schon komisch. Ich habe keine Erklährung.

Grüße Uwe

Ich müsste doch aber in irgendeiner Kombination auch mal die 10kΩ messen können, oder nicht? (wegen der Schaltung) Dann wäre ja die parralelschaltung vielleicht das Problem, aber dann kann das ja nie funktionieren?!

Parallelschaltung? Muss ich mir mal aufmalen...

Erprobte Alternativen kann ich keine nennen. Vielleicht gibt es bei den Retrogamern irgendwo noch analoge Joysticks oder ein Kreuzknüppel aus dem RC-Bereich könnte die zugedachte Aufgabe erledigen.

(deleted)

So ist die Schaltung:

Im Flußkaufhaus gibt es eine Auswahl an Steuerhebeln mit einer analogen Schnittstelle, oder?

Das ist zwar richtig, aber wenn es ein Problem der Schaltung ist nützt es wenig.
Und wenn die am Ende alle aus der gleichen Fabrik kommen nützt es auch nix.

Daher die Frage in die Runde ob jemand gute Erfahrungen mit Produkt X von Lieferant Y hat?

Lieben Gruß,
Chris

themanfrommoon: Ich müsste doch aber in irgendeiner Kombination auch mal die 10kΩ messen können, oder nicht? (wegen der Schaltung)

Mein Fundus an Joysticks reicht von Billigprodukten über Mittelklasse bis obere Mittelklasse (die Links sind Beispiele).

Was alle gemeinsam haben: Bei keinem kann ich, wenn ich den Hebel auf Anschlage bewege den "vollen" Widerstand oder 0 Ohm messen.

Also: wenn das verbaute Potentiometer z.B. 10 kOhm hat, dann messe ich nie 10 kOhm oder 0 Ohm. Das erwarte ich auch gar nicht - ist wohl konstruktionsbedingt so. :) Aber natürlich solle sich beim Bewegen des Hebels der Widerstand kontinuierlich verändern. :)

uxomm: Das erwarte ich auch gar nicht - ist wohl konstruktionsbedingt so. :)

Der Freudenknüppel läßt sich geschätzte 90° bewegen, während der Schleifer eines handelsüblichen Potis einen größeren Winkel überstreicht.

Linear sollte es dennoch sein.

themanfrommoon: So ist die Schaltung:

|500x371 Das ist zwar richtig, aber wenn es ein Problem der Schaltung ist nützt es wenig. Und wenn die am Ende alle aus der gleichen Fabrik kommen nützt es auch nix.

Daher die Frage in die Runde ob jemand gute Erfahrungen mit Produkt X von Lieferant Y hat?

Lieben Gruß, Chris

Ja, die Schaltung ist so wie ich sie mir vorgestellt habe. 2 Potentopmeter paralell zwischen Masse und Versorgungsspannung. Du kannst 10kOhm messen wenn Du ein Potentiometer auslötest.

Grüße Uwe

Hallo uxomm,

uxomm: Mein Fundus an Joysticks reicht von Billigprodukten über Mittelklasse bis obere Mittelklasse (die Links sind Beispiele). …... Aber natürlich solle sich beim Bewegen des Hebels der Widerstand kontinuierlich verändern. :)

Wärst du so nett und könntest von deinen beiden erstgenannten Varianten mal versuchen eine Kennlinie aufzunehmen um zu schauen ob die wenigstens einigermaßen linear funktionieren? (Deine "Mittelklasse" hatte ich nämlich jetzt im Auge)

Danke und liebe Grüße, Chris