Controllare due servomotori con un joystick

Ciao a tutti, sto progettando un circuito utilizzando arduino, che prenda degli imput da un joystick e mandi il segnale a due servomotori per farli ruotare a seconda di quanto scosto la leva.
ho un codice sorgente ma quando viene caricato, i due motori ruotano in un solo senso fino a fermarsi (perché la rotazione è compresa tra 0 e 180) e non rispondono ai comandi del joystick.

#include <Servo.h>

Servo Pan;         
Servo Tilt;
int   potP = 2;        //pin lettura potenziometri
int   potT = 3;
int   valP;            //variabili per la posizione del joystick
int   valT;
int   P = 90;          //Variabile per la scrittura della posizione
int   T = 90;

void setup() {

  Pan.attach(9);     //assegna pin 9 e 10 come output del segnale per controllare i servi
  Tilt.attach(10);
}

void loop() {

  valP = analogRead(potP);  //legge il valore di potP e lo assegna a valP. Valore compreso tra 0 e 1023
  valT = analogRead(potT);

  valP = map(valP, 0, 1023, 0, 180);    //Aggiorna valP con valore relativo in scala compresa tra 0 e 180 
  valT = map(valT, 0, 1023, 0, 180);    //La posizione del servo varia tra 0 e 180
  if (78<valP<91) P=0;
  if (78<valT<91) T=0;
  if ((valP > 90) & (P < 180))          //se il potenziometro non e in posizione di riposo aumenta P di un trentesimo 
    P = P + ((valP - 90) / 30);         //della differenza tra il valore del potenziometro e il valore di riposo
  if (valP == 0)              //anzichè aumentare in questo caso diminuisce
    P = P - ((90 - valP) / 30);

  if ((valT > 90) & (T < 180))          //come sopra ma per l altro potenziometro 
    T = T + ((valT - 90) / 30);
  if ((valT == 0))   
    T = T - ((90 - valT) / 30);   

  Pan.write(P);                                 //A questo punto comunica al servo la nuova posizione da raggiungere 
  Tilt.write(T); 
  delay(10);                                    //delay per permettere ai servi di raggiungere le posizioni
}

it would help if you posted on the Italian speaking forum.

[color=#212121]sarebbe d'aiuto se hai postato sul forum di lingua italiana .[/color]

http://forum.arduino.cc/index.php?board=34.0

I wonder how you say "Arduino" in Italian ?

Ciao!

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

mikypallanuoto:
Ciao a tutti,

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Non so a che ti serve stò test, comunque l’AND nei test è con doppio && altrimenti fa and sui bit di tue test.

if ((valP > 90) & (P < 180))

quindi

if ( valP>90 &&  P<180)

Non capisco la logica che stai usando:

con valori del potenziometro (mappati)

  • tra 91 e 179 aumenta il valore di pilotaggio del Servo (P o rispettivamente T) di un 30-simo del valore del Potenziometro ovvero
    da 91 a 120 di 0,
    da 121 a 150 di 1
    e da 151 a 179 di 2

  • tra 79 e 90 P o T viene messo a 0

  • se é 0 allora P o T viene diminuito di 3

La sintassi (78<valP<91) é errata in C devi scrivere (78<valP && valP<91)
La sintassi (valT > 90) & (T < 180) non é un and logico ma un and bit per bit devi usare il doppio “&&”

Cerca di trovare gli errori stampandoti via seriale sul terminale del IDe i valori letti dai potenziometri, di valP e valT e dei valori P e T.

Cosí ti rendi conto dove sei.

Altro errore: devi limitare i valori di P e T da 0 a 180. impedendo di aumentare se il valore é 180 e impedendo di poterlo diminuire se é 0.

Ciao Uwe