Servomotore comandato da Joystick

Ciao, sono nuovo e ho competenze base per quanto riguarda Arduino. (non so editare i codici)
Vorrei sapere se è possibile comandare un servomotore con un joystick in modo che dalla posizione centrale se lo muovo a dx, il servo va a dx, però se ritorno in posizione centrale con il Joystick, il servo resta fermo (idem per la sx).
Potete aiutarmi? Grazie.

Buonasera e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO … Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

ok, grazie, l'ho appena fatto

Ti conviene studiarti gli esempi della libreria Servo.h. Lì trovi come comandare il servo.

Il joystick, collegato fra i 5V e GND con il cursore su un pin analogico, fornisce un valore fra 0 (cursore tutto a sinistra, centrale verso GND) e 1023 (cursore tutto a destra, centrale verso 5V). Quando è in posizione centrale fornisce un valore CIRCA 512 (diciamo fra 507 e 517).

Il tuo programma è tutt’altro che banale.

Deve leggere il valore del joystick e finché resta fra 507 e 517 non fa niente.

Supponiamo che il valore diventi inferiore a 507 (il joystick sta andando a sinistra); il servo segue il valore (che sta decrescendo). Non appena il valore riaumenta (il joystick sta tornando verso destra) il servo si ferma nella posizione in cui si trova e non si muove finché il valore del joystick non diventa maggiore di 517, oppure minore del valore della posizione attuale.

Lo stesso se il valore diventa maggiore di 517.

Posso farti uno schema di flusso, ma il programma devi scriverlo tu.

Ciao,
P.

Si, grz. se potresti farmi uno schema di flusso intanto penso un po' come fare

>bc_24: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso. :slight_smile:

Gli utenti da device "mobile" (piccoli schermi) ringrazieranno per la cortesia :wink:

Guglielmo

P.S.: Ho eliminato io il "quote" dal tuo post qui sopra :wink:

gpb01:
>bc_24: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe ...

Tipo così?

Guglielmo

ok grazie :smiley:

Sono riuscito a trovare qualcosa su Internet, ma mi piacerebbe che se io muovo il joystick di poco, il servo si muove lentamente, e se lo muovo di più il servo si muove più velocemente.

Potete aiutarmi?
Grazie

#include <Servo.h>


Servo Pan;
Servo Tilt;


#define Reset 4


int T_Hum = 15;


struct Asse {int Val; int Pos; int S_min; int S_Max; int StepServo;};
struct Asse X = {0, 90, 256, 768, 1};
struct Asse Y = {0, 90, 256, 768, 1};


void setup() {

  Pan.attach(2);
  Tilt.attach(3);
  pinMode(Reset, INPUT_PULLUP);
}

void loop() {

  X.Val = analogRead(A0);
  Y.Val = analogRead(A1);

  if(digitalRead(Reset) == LOW){X.Pos = 90; Y.Pos = 90; Pan.write(X.Pos); Tilt.write(Y.Pos);}
  

  if(X.Val <= X.S_min){if(X.Pos != 0){X.Pos = X.Pos - X.StepServo; Pan.write(X.Pos);}}
  if(X.Val >= X.S_Max){if(X.Pos != 180){X.Pos = X.Pos + X.StepServo; Pan.write(X.Pos);}}
  if(Y.Val <= Y.S_min){if(Y.Pos != 0){Y.Pos = Y.Pos - Y.StepServo; Tilt.write(Y.Pos);}}
  if(Y.Val >= Y.S_Max){if(Y.Pos != 180){Y.Pos = Y.Pos + Y.StepServo; Tilt.write(Y.Pos);}}
  

  delay(T_Hum);
}

Ad ogni ciclo di loop tu decrementi la posizione del servo di 1 step, e in più alla fine di ogni ciclo aspetti 15 ms.

Prova a cambiare

X.Pos = X.Pos-X.StepServo;

con

X.Pos = X.Val;

e

Y.Pos = Y.Pos-Y.StepServo;

con

Y.Pos = Y.Val;

e a togliere

delay(T_Hum);

Ciao,
P.

pgiagno:
Ad ogni ciclo di loop tu decrementi la posizione del servo di 1 step, e in più alla fine di ogni ciclo aspetti 15 ms. ...

Grazie pgiagno!

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.