Joystick als Maus (nur in bestimmten Radius)

Hallo Leute,

die letzten Tage versuche ich mich daran, mit einem Micro Pro + einem Joystick eine Mausbewegung zu realisieren. Eigentlich kein Problem. Schließlich gibt es ja genügend Tutorials und Anleitungen.

Jedoch habe ich etwas Spezielleres vor. Ich möchte nicht die Maus frei bewegen, sondern eine Bewegung in einem maximalen Radius zulassen. Und wenn ich den Stick loslasse, soll dieser von alleine wieder in das Zentrum springen.
Am äußeren Rand sollte jede Position erreicht werden können. Dazwischen wäre schön, aber nicht wichtig.
Ca. so wie auf einem Tablet-Game der "Bewegungskreis" (selbe Prinzip). Anbei ein Beispielbild.

So einen Stick verwende ich:
Joystick Modul

Meine Pinbelegung:
X-Achse: A0
Y-Achse: A1

Ich denke meinen bisherigen Code zu posten wird nicht viel bringen, da ich "nur" eine Wegbegrenzung des Zeigers auf einer Achse hinbekommen habe. Aber nur in eine Richtung.

Ich danke euch für jede Lösung oder Lösungsansatz!!

Gruß Alex

Hallo,
ich rate jetzt mal das, soll auf einem Display dargestellt werden.
hab ich nicht verstanden wenn das kein Problem ist dann musst Du doch nur die X/Y Position begrenzen wenn Das auf einer Kreisfläche sein soll dann halt über den Radius gehen und mit sin() /cos()/ tan() die Begrenzung festlegen. z.B Zu einer x Position gehört eine max Y Position um den Radius einzuhalten dann ergibt sich der Kreis von selbst.
Du könntest auch die Grenzen in einem Array ablegen und darauf abfragen.
Heinz

Hallo Heinz,

das Ganze ist für den PC direkt gedacht. Quasi ein Gamepad, was die Maus kontrolliert.

Hier arbeite ich bisher mit der Mouse.h Library, die mir eine Bewegung der X und Y Koordinaten erlaubt, aber nur von der aktuellen Mauspoition ermöglicht. Also eine maximale Begrenzung konnte ich bisher nicht so einfach realisieren, da ich die aktuelle Position vom Mauszeiger nicht abfragen kann.
Ich kann sie mir über eine Variabe merken und somit eine Achse begrenzen, doch den Weg zurück habe ich noch nicht hinbekommen. Dies ist dann wichtig, wenn man von "Norden" nach "Nord-Osten" geht.

Sonst könnte ich sagen:

  • wenn PotiX=50, dann MausPos=50
  • wenn PotiY=-150, dann MausPosY=-150

Hier mein bisheriger Code, beidem ich mich erst einmal nur auf eine Achse konzentriert habe.

#include <Mouse.h>
int horzPin = A0;  // Analog output of horizontal joystick pin
int vertPin = A1;  // Analog output of vertical joystick pin
int selPin = 9;  // select button pin of joystick

int vertZero, horzZero;  // Stores the initial value of each axis, usually around 512
int potValueY, potValueX;  // Stores current analog output of each axis
int potValueYold, potValueXold;  // Stores current analog output of each axis
int vertMouseX, vertMouseY; // Errechneter Wert invertMouseY * potValueY / sensitivity
int vertMouseXold, vertMouseYold; // Errechneter Wert invertMouseY * potValueY / sensitivity
const int sensitivity = 500;  // Higher sensitivity value = slower mouse, should be <= about 500
int mouseClickFlag = 0;

int invertMouseX = 1;         //Noninverted joystick based on orientation
int invertMouseY = -1;        //Invert joystick based on orientation

int mousePosNowX = 0;
int mousePosNowY = 0;

int maxRadius = 500;

bool center = true;

void setup()
{
  Serial.begin(9600); // Öffnet die serielle Schnittstelle bei 9600 Bit/s:

  pinMode(horzPin, INPUT);  // Set both analog pins as inputs
  pinMode(vertPin, INPUT);
  pinMode(selPin, INPUT);    // set button select pin as input
  digitalWrite(selPin, HIGH);  // Pull button select pin high

  vertZero = analogRead(vertPin);  // get the initial values
  horzZero = analogRead(horzPin);  // Joystick should be in neutral position when reading these

  potValueYold = vertZero;
  potValueYold = horzZero;

  Mouse.begin(); //Init mouse emulation
}

void loop()
{
  potValueY = analogRead(vertPin) - vertZero;  // read vertical offset
  potValueX = analogRead(horzPin) - horzZero;  // read horizontal offset
  if(mousePosNowY < maxRadius){
    vertMouseY = invertMouseY * potValueY / sensitivity;
    Mouse.move(0, vertMouseY, 0); // move mouse on y axis
    potValueYold = potValueY;
    mousePosNowY = mousePosNowY - vertMouseY;
  }
  potValueYold = potValueY;
  vertMouseYold = vertMouseY;
}

Gruß
Alex