Go Down

Topic: Help movimento Arduino UNO + Servo + joystick 2 assi (Read 768 times) previous topic - next topic

constructor84

Ciao Ragazzi, vi spiego il mio problema. Ho Arduino Uno, due servi e un joystick. Devo riuscire a muovere i due servi in base alle coordinate inviate dal joystick. In pratica esattamente questo: http://www.youtube.com/watch?v=y6TwGfejHvo
Il mio problema è che non riesco a trovare la soluzione per far "rimanere fermo" il servo. Cioè, muovendo il joystick riesco a far muovere i due servi, adesso come faccio a farli rimanere fermi in quella posizione? se lascio il joystick ovviamente rivela cmq la misura dell'asse x e y e mi modifica la posizione dei servi. Spero di essere stato chiaro. Posto il codice ke ho realizzato fin ora. Grazie in anticipo.

#include <Servo.h>
//assegnamento pin del joystick
const int buttonJoy1 = 4; //digitale
const int assexJoy1 = 4; //analogico
const int asseyJoy1 = 5; //analogico
//assegnamento pin di due servi (uno assex e l'altro assey)
const int servo1 = 2;
const int servo2 = 3;
//valori prelevati dal joystick
int statoAssexJoy1;
int statoAsseyJoy1;
int statoButtonJoy1;
//valore da passare ai servi
int radServoX = 90;
int radServoY = 90;
long int millisText, millisServo, time;
//dichiarazione dei due servi
Servo myServo1, myServo2;

void setup(){
 
  pinMode(assexJoy1, INPUT);
  pinMode(asseyJoy1, INPUT);
  pinMode(buttonJoy1, INPUT);
  //il servo asse X impostato inizialmente a 90 gradi
  myServo1.attach(servo1);
  myServo1.write(radServoX);
 
  //il servo asse Y impostato inizialmente a 90 gradi
  myServo2.attach(servo2);
  myServo2.write(radServoY);
 
  millisText = millis();
  millisServo = millis();
  Serial.begin(9600);
  }

void loop(){
  time = millis();
 
  //lettura dato dall'analogico del joystick
  statoAssexJoy1 = analogRead(assexJoy1);
  statoAsseyJoy1 = analogRead(asseyJoy1);
  statoButtonJoy1 = digitalRead(buttonJoy1);
 
  //se il tasto viene premuto azzera i servi
  if(statoButtonJoy1 == HIGH){
    azzera();
    }
 
  //serve per calcolare ogni 100 millisecondi
  if( (time == 0) || (time > millisServo + 100) ){
   
    //calcolo in base ai gradi massimi (180°) e al valore massimo del joystick (1023)
    statoAssexJoy1 = map(statoAssexJoy1, 0, 1023, 0, 179);
    statoAsseyJoy1 = map(statoAsseyJoy1, 0, 1023, 0, 179);
   
    //scrittura del valore calcolato sul servo (in gradi)
    myServo1.write(statoAssexJoy1);
    myServo2.write(statoAsseyJoy1);

    millisServo = millis();
    }
 
  //serve per stampare a video ogni 1500 millisecondi
  if( (time == 0) || (time > millisText + 1500) ){
    stampaTime(statoAssexJoy1, statoAsseyJoy1, radServoX, radServoY);
    }
  }

void azzera(){
  Serial.println("tasto premuto");
  myServo1.write(90);
  myServo2.write(90);
  }

void stampaTime(int assex1, int assey1, int posServoX, int posServoY){
  Serial.print("Asse x Joystick: ");
  Serial.println(assex1);
  Serial.print("Asse y Joystick: ");
  Serial.println(assey1);
  Serial.print("Posizione asse X del servo: ");
  Serial.print(posServoX);
  Serial.println(" gradi");
  Serial.print("Posizione asse Y del servo: ");
  Serial.print(posServoY);
  Serial.println(" gradi");
  Serial.println("--------------------------------");
  millisText = millis();
  }

astrobeed


Ciao Ragazzi, vi spiego il mio problema. Ho Arduino Uno, due servi e un joystick. Devo riuscire a muovere i due servi in base alle coordinate inviate dal joystick.


Nel video i servo sono stati modificati per la rotazione continua, il joystick non comanda la posizione, comanda la velocità, in modo spannometrico, di rotazione pertanto riportandoli a zero il servo si ferma.
Utilizzando una coppia di servo rc non modificati puoi controllare la loro posizione in funzione della posizione del joystick, esattamente come fai nel tuo sketch, ed è più che normale che riportando a zero lo stick è normale che i servo tornano nella posizione di riposo visto che seguono i movimenti dello stick.
Se la tua esigenza è posizionare in un certo punto i servo non devi usare il joy come comando diretto della posizione, lo devi usare come incremento della stessa, maggiore è la deviazione dello stick e maggiore sarà la velocità di spostamento, però in questo modo non hai un controllo diretto della posizione.

sciorty

Spero di aver capito bene ma per quello che vuoi fare tu il joystick è solo una questione estetica. In pratica sarebbe lo stesso se tu avessi 4 pulsanti che premendoli incrementano o decrementano la posizione dei servi?
Se si, allora puoi prendere i valori del joystick e dividerli assegnandogli una funzione
Es:
Leggi sull'asse x un valore da 0 a 1023. se il valore è compreso tra 0 e 400 allora decrementi il servo1 fino a quando il valore è compreso tra 400 e 500 (joystick in posizione normale, lascerei un margine perchè il valore non è sempre uguale)
Viceversa, per i valori compresi tra 500 e 1023 incrementi il servo1

Spero di averci azzeccato :)

constructor84

In pratica l'unica cosa ke posso fare è muovere i servi sull'asse x e y in modo diciamo "rettilineo", incrementendo una variabile in base a quanto spingo sul joystick. Quindi per andare in una posizione devo per forza muovere prima sull'asse x e poi sull'asse y (per esempio), non è possibile arrivarci in maniera istantanea. Il problema, anche per logica, era proprio quello, lasciando il joystick, ovviamente, leggeva anche i valori di ritorno verso la posizione di riposo e quindi non serviva a niente. Ok, allora grazie per la collaborazione. :-)

Go Up