Arduino pro mini + due joystik

Ciao ,allora ho due joystik collegati a 2 pin differenti di arcuino , per ogni joystik uso un solo movimento , tanto per intenderci tipo radiocomando rc per auto , ho un problema quando muovo la leva di sinistra avanti o indietro la lettura avviene correttamente ma varia anche la lettura dei pin collegato al joystik di destra benché la leva non venga minimamente toccata , stessa cosa se muovo la leva di sinistra cambia la lettura del pin della leva di destra in più o meno in base al senso in cui la smuovo , come è possibile ???

Che tipo di joystick stai usando? (link)

Con quali pin li hai connessi?

Puoi fare uno schema?

Una foto?

Ciao,
P.

quelli in vendita su internet nei kit per Arduino
2-Axis-Analog-Joystick-Module-arduino

i pin usati sono A1 e A2 ...

pgiagno:
...
Puoi fare uno schema?

Una foto?
...

E magari lo sketch?

Ciao,
P.

valStickThrottle = analogRead(throttlePIN);
  valStickYaw = analogRead(yawPIN);

Per lo schema ho attaccato la massa ad un pin , i 5v nelle altro pin e uno al pin delle arduino ...
Non me ne intendo ma alla fine questi joystik sono potenziometri ... No. ????

ma se il segnale è su un solo pin perchè chiedi 2 letture analogiche su due pin diversi? :wink:

p.s.

uno schema prevede di conoscere esattamente tutte le connessioni fatte... ad esempio a quale pin di arduino hai attaccato il pin segnale del joystick

e... quello non è un programma, sono solo 2 righe che nessuno può controllare se generano errori :wink:

Visto che legge di seguito da due pin analogici, potrebbe essere che debba fare due letture per ogni canale scartando la prima, in modo da dare il tempo al sample and hold dell' ADC di caricarsi correttamente.

questo di sicuro :wink:

#define trimlrPIN A0                 //Pin Analogico 0
#define throttlePIN A1               //Pin analogico 1
#define yawPIN A2                    //Pin analogico 2 

#define minValueMotor 1000
#define maxValueMotor 2000
#define armValueMotor 500

#define rangminjoythr    0
#define rangmaxjoythr 1023
#define rangminjoyyaw    0
#define rangmaxjoyyaw 1023
#define rangmintrim    0
#define rangmaxtrim 1023

int valStickThrottle;
int valStickYaw;
int valtrimlr;


void setup() {
  Serial.begin(115200);
}

void loop() {
  //
  valtrimlr = analogRead(trimlrPIN);
  valtrimlr = map(valtrimlr, rangmintrim,rangmaxtrim,minValueMotor,maxValueMotor);
  //
  valStickThrottle = analogRead(throttlePIN);
  valStickThrottle = map(valStickThrottle, rangminjoythr,rangmaxjoythr,minValueMotor,maxValueMotor);
  //
  valStickYaw = analogRead(yawPIN);
  valStickYaw = map(valStickYaw, rangminjoyyaw, rangmaxjoyyaw, minValueMotor, maxValueMotor);
  //
  Serial.println(String(valStickThrottle));
  Serial.println(String(valStickYaw));
  //
}

se viene mosso solo il joystik collegato al throttlePIN , cambiano i valori anche del valStickYaw …

come ti è stato suggerito le letture sui pin analogici multipli possono dare dei problemi quindi la prima lettura viene scartata e si usa la seconda :wink:
prova così:

void loop() {
  //
  valtrimlr = analogRead(trimlrPIN);   // lettura falsa da scartare 
  delay(5);          // tanto per perdere 5 millisecondi
  valtrimlr = map(analogRead(trimlrPIN), rangmintrim,rangmaxtrim,minValueMotor,maxValueMotor);
  //
  valStickThrottle = analogRead(throttlePIN);  // lettura falsa da scartare 
  delay(5);         // tanto per perdere 5 millisecondi
  valStickThrottle = map(analogRead(throttlePIN), rangminjoythr,rangmaxjoythr,minValueMotor,maxValueMotor);
  //
  valStickYaw = analogRead(yawPIN);   // lettura falsa da scartare 
  delay(5);          // tanto per perdere 5 millisecondi
  valStickYaw = map( analogRead(yawPIN), rangminjoyyaw, rangmaxjoyyaw, minValueMotor, maxValueMotor);
  //
  Serial.println(String(valStickThrottle));
  Serial.println(String(valStickYaw));
  //
}

i 5 millisecondi di delay non sono essenziali ma io di solito li aggiungo tra due letture

... solo una cosa, per non perdere tempo ed occupare meno memoria programma, la lettura che scarti è inutile che la assegni ad una variabile :wink:

void loop() {
  //
  analogRead(trimlrPIN);   // lettura falsa da scartare 
  delay(5);          // tanto per perdere 5 millisecondi
  valtrimlr = map(analogRead(trimlrPIN), rangmintrim,rangmaxtrim,minValueMotor,maxValueMotor); 
  ...

Guglielmo

... solo una cosa, per non perdere tempo

così poi è troppo veloce... :smiley:

gpb01:
... solo una cosa, per non perdere tempo ed occupare meno memoria programma, la lettura che scarti è inutile che la assegni ad una variabile :wink:

void loop() {

//
  analogRead(trimlrPIN);  // lettura falsa da scartare
  delay(5);          // tanto per perdere 5 millisecondi
  valtrimlr = map(analogRead(trimlrPIN), rangmintrim,rangmaxtrim,minValueMotor,maxValueMotor);
  ...



Guglielmo

Ciao , ho provato cosi ... ma niente se muovo un solo joystik mi cambiano i valori anche dell altra lettura , di poco ma cambiano di circa 50 unita e dovendoci muovere dei motori mi incide notevolmente ....
come posso risolvere ? ho provato anche a cambiare la scheda pro-mini con un altra ma ho lo stesso effetto..

Soluzioni ?? non credo di essere l’unico a fare più letture su pin analogici … :slight_smile:

No, infatti ed a TUTTI funzionano come sopra detto, quindi ... o c'è qualche altro problema nel tuo codice o proprio nell'hardware (o nelle connessioni).

Guglielmo

Scusa, tanto per capire meglio, perché non lasci per ora perdere i map e visualizzi i dati grezzi che vengono dalla analogRead()?

Tipo:

void loop() {
  Serial.print(analogRead(trimlrPIN));
  Serial.print(' ');
  Serial.print(analogRead(throttlePIN));
  Serial.print(' ');
  Serial.println(analogRead(yawPIN));
  delay(200);

e vedi come cambiano quei valori quando nel muovi UNO per volta

... docdoc, NON sapendo i valori dei potenziometri di quel joystik e quindi se il S/H fa a tempo a caricarsi, meglio scartare sempre una lettura:

void loop() {
  analogRead(trimlrPIN);
  Serial.print(analogRead(trimlrPIN));
  Serial.print(' ');
  analogRead(throttlePIN);
  Serial.print(analogRead(throttlePIN));
  Serial.print(' ');
  analogRead(yawPIN);
  Serial.println(analogRead(yawPIN));
  delay(200);

Guglielmo

Allora sono andato avanti …
non avevo dichiarato i pin come input , ora dopo la dichiarazione e la doppia lettura va già meglio , però ancora muovendone uno sfalsa la lettura dell altro di circa 20/25 punti …
La cosa strana è che attaccato ad un altro pin ho un potenziometro (che uso come trim per regolare che il tank che ho costruito vada dritto ) e questo non subisce le variazioni che hanno gli altri , inoltre se muovo il potenziometro non fa fare letture sballate ai joystik…
I collegamenti dei due joy e del potenziometro sono le stesse piedino al +batteria piedini al -batteria e poi al pin dell Arduino … ovviamente le masse collegate assieme al Arduino … ho provato ad invertire i pin tra il potenziometro è un joy ma la cosa non cambia …

@docdoc : questa sera provo , effettivamente non ho mai verificato i dati letti effettivi ma sempre dopo il map ...

I pin analogici NON vanno dichiarati come INPUT, ci pensa l'analogRead() ad impostarli come si deve ed a collegarli al mux del ADC.

Il mio sospetto è che il valore dei due potenziometri del joystik sia molto alto (> 10K) e quindi il condensatore del S/H non fa a tempo a caricarsi completamente ...

Occorrerà forse rallentare le letture o aggiungere dei condensatori sugli ingressi analogici ... ::slight_smile:

Guglielmo