Problem mit if-Schleife und Servomotor bzw. Joystic

Hallo,

ich möchte einen Servomotor mit einem Joystick steuern. Jedoch reagiert mein Servo nicht wenn ich den Joystick bewege. Ich vermute es liegt an dem If-Befehl, da mir im seriellen Monitor angezeigt wird, dass ich den Joystick bewege. Ich bin noch Anfänger also vielleicht ist es ein recht offensichtlicher Fehler, den ich nicht erkenne.
Danke schon im Vorraus für die Hilfe.

Code:

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
// Arduino pin numbers

int pos = 90; // variable to store the servo position

const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object

pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
Serial.begin(9600);
}

void loop() {
Serial.print("pos = ");
Serial.print(pos);
Serial.print("\t\n");
Serial.print("Switch: ");
Serial.print(digitalRead(SW_pin));
Serial.print("\n");
Serial.print("X-axis: ");
Serial.print(analogRead(X_pin));
Serial.print("\n");
Serial.print("Y-axis: ");
Serial.println(analogRead(Y_pin));
Serial.print("\n\n");

myservo.write(pos); // Servo auf Position "pos" bewegen

if (500 > X_pin < 510){
pos = 90;
}

if (X_pin < 500){ // Wenn Joy nach Links <-
pos = --pos; // pos wird veringert
}

if (X_pin > 510){ // Wenn Joy nach Rechts
pos = ++pos; // pos wir erhöht
}

myservo.write(pos); // Servo auf Position "pos" bewegen


}

Dein Code bringt drei Warnungen, die sich auf Deine Berechnungen beziehen.

DATEI - VOREINSTELLUNGEN - Ausführliche Ausgabe währen -> Haken setzen bei Kompilierung
Darunter das Feld auswählen ALLE

Und Dein delay(1000) muss dringend weg.

Und dann: Gehe in Dein Post mit dem Bleistift unten und markiere Deinen Text Code :slight_smile: .
Oben im Editor gibt es ein </> Symbol - das drückst Du dann und schon hast die Codetags drumrum.
:wink:

Alles klar, dankschön

Bitte.
Du solltest Warnungen bekommen für Zeile 36, 41, 45

 switch(X_pin)
 {
   case   0 ...  500: --pos;    break;
   case 501 ...  510: pos = 90; break;
   case 511 ... 1023: ++pos;    break;
 }

Ich würde das erste case auf 500 setzen.

Done

Funktioniert das überhaupt so wie Du es Dir denkst.

sicher ist
pos --;
wohl zu einfach.

Grüße Uwe

Danke für die ganzen Antworten. Leider funktioniert es immer noch nicht. Der Servo bewegt sich am Anfang von 90 auf 0 runter, ohne dass ich den Joystick berühr habe, und bleibt dann stehen und reagiert nicht mehr. Der serielle Monitor zeigt aber an, dass X_pin bei 505 liegt, also nicht unter 500 oder über 510. Trotzdem bewegt sich der Servo zu 0. Der Code sieht jetzt folgendermaßen aus:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards
// Arduino pin numbers

int pos = 90;    // variable to store the servo position

const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(9600);
}

void loop() {
  Serial.print("pos = ");
  Serial.print(pos); 
  Serial.print("\t\n");
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print("\n");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print("\n");
  Serial.print("Y-axis: ");
  Serial.println(analogRead(Y_pin));
  Serial.print("\n\n");
  


 
  switch(X_pin)
 {
   case   0 ...  500: pos = pos - 1; break;
   case 501 ...  510: pos = 90; break;
   case 511 ... 1023: pos = pos + 1; break;
 }

  if (pos < 0){ // Damit pos nicht negativ wird
    pos = 0;
  }
  if (pos > 180){ // Damit pos nicht über 180 geht
    pos = 180;
  }
 
  myservo.write(pos); // Servo auf Position "pos" bewegen
  
  

  
}
const byte X_pin = A0; // analog pin connected to X output of joystick
const byte Y_pin = A1; // analog pin connected to Y output of joystick

Hilft das?

Edit:
Nein, das tut es nicht. Siehe combie's Beitrag.
Mich wundert, dass bei analogRead(0) tatsächlich eine 505 rauskommen soll.

Nein!
X_pin bleibt still und stur bei 0 (Null)
Denn er wird ja nirgendwo verändert.

Nöö...
Es ist egal ob man 0 oder A0 schreibt.

switch(analogRead(X_pin))
Würde Wunder bewirken.

Bei meinem Joystick sind die Koordinaten des Zentrums bei ca. P(505/505) und der Joystick liegt ohne Veränderung im Zentrum
Edit: P(0/0) wäre, wenn man den Joystick nach oben links drückt

Ja.

Wobei ich normalerweise dazu tendiere, Werte erst zu lesen, aufzuheben und dann zu verarbeiten - wer weiß, ob man sie mal simulieren muss oder wo man sie sonst noch brauchen wird.

Mit switch(analogRead(X_pin)) klappt es.
Vielen lieben Dank combie

Kann man tun, sehe ich auch öfter hier.
Mache es allerdings selber eher nicht, nur dann, wenn es wirklich nötig/sinnvoll ist.

Der analoge Pin ( 0 und 1) ist etwas anderes als der analog gemessene Wert der Spannung die am analogen Pin anliegt ( Werte von 0 bis 1023 sind möglich).

switch(X_pin)

und

switch(analogRead(X_pin))

Grüße Uwe

Was in diesem Fall ja nicht gegeben ist:
Denn es scheint unerheblich, ob der auf der seriellen Schnittstelle verkündete Wert gleich dem ist, der zur Steuerung des Servos verwendet wird.
:wink:

In analogRead() gibt es eine listige Zeile(53), die es erlaubt, statt A0 auch einfach nur 0 einzugeben.

1 Like