Comando Servo con Joystick Incrementa e decrementa posizione

Buongiorno a tutti,
vi chiedo di darmi una mano in quando sto realizzando un braccio meccanico con 2 Servo.
sul web ho trovato uno Sketch dove si riesce a pilotare i 2 Servo Orizz. e Vert. con 2 Joystick.
il problema è che quando il joystick torna nella posizione centrale anche il servo ritorna nella posizione 90°.
io vorrei che muovendo il Joy verso dx per esempio il servo si comincia a spostare verso dx e quando rilascio il joy il servo resti in quella posizione.
avete qualche consiglio?
allego lo sketch.
Grazie.

#include <Servo.h> 

Servo horzServo;                      // Crea l'oggetto servo per il servo per il movimento pan (orizzontale)
Servo vertServo;                      // Crea l'oggetto servo per il servo per il movimento tilt (verticale)

int horzPin = A0;                      // Input analogico per il joystick asse orizzontale
int vertPin = A1;                      // Input analogico per il joystick asse verticale
int horzVal;                             // Legge il valore dell'asse orizzontale
int vertVal;                             // Legge il valore dell'asse verticale

void setup()
{
 horzServo.attach(9);             // Si utilizza il pin 9 PWM per il servo orizzontale
 vertServo.attach(10);           // Si utilizza il pin 10 PWM per il servo verticale
}

void loop()
{
 horzVal = analogRead(horzPin);                   // Legge la posizione del joystick orizzontale
 horzVal = map(horzVal, 0, 1023, 0, 179);   // Scala di lettura per soddisfare il servo
 horzServo.write(horzVal);                            // Sposta il servo alla posizione richiesta

 vertVal = analogRead(vertPin);                    // Legge la posizione del joystick verticale
 vertVal = map(vertVal, 0, 1023, 0, 179);    // Scala di lettura per soddisfare il servo
 vertServo.write(vertVal);                             // Sposta il servo alla posizione richiesta

 delay(15);                                                 // Pausa di attesa per raggiungere la posizione
}

>Snake-84: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

P.S.: ... e, se non lo hai già fatto, leggi con molta attenzione tutto il suddetto regolamento :wink:

gpb01:
>Snake-84: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

P.S.: ... e, se non lo hai già fatto, leggi con molta attenzione tutto il suddetto regolamento :wink:

Buongiorno,
grazie.

... se ben ricordo il tuo problema è già stato affrontato qui nella sezione Italiana. Prova a fare una ricerca, dovreti trovare un altro thread che chiedeva, più o meno, la stessa cosa :slight_smile:

Guglielmo

Comunque, per darti un suggerimento "al volo" (molto al volo :D) ... il tuo sketch legge la posizione del joystick, e dice al servo di raggiungere la posizione letta ... per cui e' normale che funzioni in quel modo ...

Quello che invece dovresti fare, se vuoi che funzioni come descrivi, e' leggere la posizione, trasformarla in un valore da usare come velocita' di spostamento (se vuoi che la velocita' cambi in base a quanto sposti la leva) oppure in un valore fisso di direzione (se vuoi solo che i servo si spostino alla stessa velocita' indipendentemente da quanto sposti la leva), e poi in una routine, leggere quei valori ed agire di conseguenza passando i dati corretti alla libreria ... :wink:

Buongiorno,
grazie per le indicazioni, come sketck avete qualche esempio in merito?
vorrei arrivarci da solo ma proprio non riesco a capire come dire ad arduino di leggere la posizione del joy, e trasformarla in un valore da usare come velocita' di spostamento.

Fai una cosa molto semplice:

  • Usa due variabili per indicare la posizione dei servo: x e y.
  • A ogni iterazione del loop controlla la posizione del joystick: se è a destra aggiungi un tot fisso a x, se è a sinistra sottrai, e così via.
  • Sempre a ogni iterazione, sposta i servo nelle nuove posizioni x e y.

Una volta che ciò funziona, potrai pensare a spostamenti a velocità variabile.

Aggiungo una cosa, a cui forse hai gia pensato comunque ... se usi joystick analogici e leggi il valore con ingressi analogici, potresti fare un map dei valori letti ... ad esempio, se fai il map da 0 a 1023 (controlla prima che i joystick arrivino realmente a quei valori alle estremita', altrimenti dovrai usare i valori reali) su un risultato, ad esempio, da 0 ad 8 (che sono 9 valori, sempre usare dispari), avrai il valore 4 in posizione centrale (e per un certo arco), poi valori decrescenti in un senso e crescenti nell'altro ...

Quindi, per iniziare con quello che ti ha suggerito SukkoPera, ti bastera' controllare un servo e leggere se il valore e' maggiore di 4 (servo in un senso) o minore di 4 (servo nell'altro ... se non e' ne maggiore ne minore oviamente e' 4, e quindi tutto e' fermo, bastano un paio di if o un'if/else), e scrivere lo sketch di prova in quel senso ... quando poi vorrai provare il controllo con diverse velocita', avrai gia la struttura di base, con 4 valori in un senso e 4 nell'altro per le diverse velocita' (e se ti serviranno piu velocita' bastera' cambiare il map), ed il valore intermedio per lo zero ...

... solo come idea, naturalmente ... :wink:

Sì ete, ma questo lo possiamo fare dopo. Iniziamo con le fondamenta: joystick a destra -> servo a destra, ecc ecc ;).

Sukko: no, non intendevo che dovesse iniziare con le velocita' ... gli suggerivo solo un modo semplice per leggere la direzione del servo, tenendo anche allo stesso tempo una "zona franca" sullo zero, senza doverla implementare all'interno dello sketch ...

Intendo dire, se fai il map su 9 valori (o qualsiasi altro numero dispari di valori, piu ne usi e piu sono corti gli archi) come gli ho suggerito, hai automaticamente 9 sezioni di arco in cui i valori sono uguali in tutta la sezione, per cui senza dover fare confronti su diversi range di valori, il valore centrale avra' gia il suo arco di movimento in cui il valore rimane 4, senza doverlo controllare fra due diversi limiti con una funzione specifica ... e cosi via ... tutto qui ...