Dubbio se codice errato o problema hardware

Salve a tutti
Vi chiedo aiuto in merito a un problema banale ma non riesco a venirne a capo. Non so se dipenda dal codice o dall'hardware.
Il listato non deve far altro che muovere un motorino cc secondo il movimento di un joystick. Devo ancora finirlo e ovviamente ci sono errori sicuramente ma la cosa che mi lascia perplesso è che ho provato a fare una prima compilazione e l'ho caricato su Arduino Uno per un primo test veloce, ma il Serial Monitor invece di restituirmi prima i valori delle righe subito dopo il loop mi restituisce la prima riga di Serial.println dentro il ciclo while.
Altra cosa strana, il ciclo while dovrebbe iterare finchè i valori restano in quel range restituendo solo "joystick fermo" ( almeno se l'ho scritto corretto) ma invece mi sul Monitor Seriale ho sempre le stesse stringhe.
Potreste dirmi da cosa può dipendere?

Grazie mille

const int step = 13;
const int dir = 4;
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output



void setup() {
  pinMode(step, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(SW_pin, INPUT_PULLUP);
  //digitalWrite(SW_pin, HIGH);
  Serial.begin(9600);
}

int stato = LOW;

void loop() 
{
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print("\n");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print("\n");
  Serial.print("Y-axis: ");
  Serial.println(analogRead(Y_pin));
  Serial.print("\n\n");
  delay(700);

  while (analogRead((X_pin ==498) || (X_pin ==499)))
  {
    Serial.println("Joystick fermo");
    delay(500);
    if (analogRead((X_pin !=497) && (X_pin !=504))) break;

  } 

  if(analogRead(X_pin < 495))
  { 
     Serial.println("Move to left");
     digitalWrite (dir, LOW);
     for (int x=0; x<480; x++)
     {
       digitalWrite(step, stato);
       delay(10);
       stato = !stato;
       if (x==480) break;
              
      }
    
  }

    delay(50);

  if(analogRead(X_pin >505))
  {
    digitalWrite(dir, HIGH);
    for (int x=0; x<480; x++)
    {
    digitalWrite(step, stato);
    delay(10);
    stato = !stato;
    if (x==480) break;
    }
     
  }
  
}

ciao,

secondo me è meglio se ti rileggi come funziona "analogRead(pin)"; poi devi considerare che "false" è uguale a "0" mentre "true" è qualsiasi numero diverso da "0"...

Scusa ma non sono convinto di aver sbagliato l'uso di analogRead. Oppure potresti spiegarmi il perchè di questa tua affermazione?
In molti esempi ho usato la stessa sintassi per misurare il valore di un ingresso analogico e compiere azioni in merito al valore restituito.
Ammetto che ci sono errori di numeri e di uso degli operatori logici ma la cosa che non mi torna è perchè ad esempio il ciclo while non itera se resto dentro quei valori.

Con tutti quei delay, è più il tempo che sta fermo che il tempo che gira! Già il delay(700) iniziale tiene fermo per 700ms, poi fa un giro di loop e poi si ferma di nuovo...

... magari mi spieghi tu cosa, secondo te fa questa analogRead()?

analogRead((X_pin ==498) || (X_pin ==499))

... considerando che X_pin ed Y_pin sono delle costanti che hai definito così:

const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

... così vediamo se ci sono delle incomprensioni :roll_eyes:

Guglielmo

I delay nei cicli ci sono perchè il motorino è uno stepper.
Gli altri li ho aggiunti per vedere con calma cosa accade nel serial monitor. Ovviamente poi li sistemerò, il tempo che impiega è il minimo.

Si esatto, come ho detto prima alcuni numeri e operatori sono inesatti.
Ho corretto in questo modo la riga:
analogRead((X_pin >=498) || (X_pin <=502))
Questo perchè il joystick nella sua posizione di riposo non resta mai fermo in un valore fisso ma oscilla tra i due valori sopra.
Ho quindi cercato di creare un range di valori che venissero riconosciuti come levetta ferma in posizione centrale. O almeno è quello che sto cercando di fare

???...
Rileggi bene ciò che hai scritto... :slight_smile:

Cortesemente mi commenti dettagliatamente, secondo TE, cosa fa quell'istruzione ... perché, confermo, che NON ti è chiaro il funzionamento della analogRead() ... :roll_eyes:

Guglielmo

analogRead(X_pin);
if (X_pin ecc ecc.........
??

secondo me questo:

analogRead((X_pin >=498) || (X_pin <=502))

considerando che "X_pin" è ua costante a "0" e quanto vale "true" e "false" si traduce in:

analogRead((0>=498) || (0 <=502))
    analogRead(0 || 1)
        analogRead(1)

che poi la analogRead(1) ritornerà un valore all 99.99% diverso da "0" e quindi tutte le sue verifiche saranno "true"...

NO, la sintassi della analogRead() la trovi nel reference ... in pratica:

valore_letto = analogRead(pin_da_leggere);

... quindi:

  1. all'interno delle parentesi puoi mettere SOLO il numero del pin da leggere
  2. il valore letto è il valore ritornato dalla funzione

Quindi, quello che hai scritto, come ben descrive andreaber sopra, NON va assolutamente bene ... devi leggere sia X_pin che Y_pin, salvare i valori e fare i tuoi confronti.

Guardati gli esempi, che trovi nel IDE, di come si chiama la analogRead(). :wink:

Guglielmo

Scusate ma l'ho fatta grossa...sono stato un pò di tempo fermo e ho perso le basi !! :sob:
Mi ero talmente incaponito a cercare il motivo del perchè non funzionasse il while che ho perso di vista l'errore più grave!

Grazie comunque del vostro intervento.
Abbiate pazienza!
Con il mio nuovo R4 mi divertirò a rimettermi in riga!

Occhio che Arduino UNO R4, in comune con Arduino UNO R3 ... ha SOLO il nome ... :grin:
... è un oggetto totalmente diverso che richiede parecchio studio per approfondirne l'uso.

Buon divertimento :slight_smile:

Guglielmo

Cercherò di fare del mio meglio , anche se purtroppo ho visto che ancora non c'è molta documentazione in giro. Quasi tutti i testi sono riferiti alla R3.
Spero uscirà qualcosa che insegni come sfruttare le sue potenzialità.

Grazie cmq :+1:

Leggili e studiali con interesse
Scusa se te lo dico, so che la verità è spesso ruvida, ma se il tuo livello è questo:

sei ben lontano da poter sfruttare una R4
Anzi, sei ancora piuttosto lontano da riuscire a sfruttare una qualsiasi MCU o anche solo ottenere codice funzionante su PC

Studia tranquillo la R3...

1 Like