Utilizzare correttamente l'IF..

Ciao ragazzi, mi sto seriamente rinco con un codice che ho preparato per muovere 2 servi.

Il codice dovrebbe fare in modo che all’avvio, entrambi i servi si muovano (ad una velocita’ ridotta) nella direzione AVANTI e quando raggiungono entrambi una determinata posizione, dovrebbero iniziare entrambi ad andare nella direzione INDIETRO.

Purtroppo il codice funziona esclusivamente quando entrambi devono andare avanti, e alla fine di questo movimento (quando raggiungono le loro posizioni finali del movimento AVANTI) rimangono li fermi senza tornare indietro… evidentemente mi sta sfuggendo qualcosa…
Ecco il codice:

#include <Servo.h> 

Servo servo_braccio;
Servo servo_avambraccio;

// PIN 9 AVAMBRACCIO
int pos_avambraccio = 170;    // max 170 --> avambraccio tutto retratto

//PIN 10 BRACCIO
int pos_braccio = 90;  //max 165 --> braccio attaccato alla pancia

int moto = 1;   //moto = 1 ---> AVANTI   -   moto = 2 ---> INDIETRO

void setup() 
{
  servo_braccio.attach(10);
  servo_braccio.write(pos_braccio); //settiamo la posizione iniziale del servo!

  servo_avambraccio.attach(9);
  servo_avambraccio.write(pos_avambraccio); //settiamo la posizione iniziale del servo!
}

void loop() 
{
  // ------------------------ BRACCIO AVANTI E INDIETRO LENTO 

  //*********************** AVANTI
  if (moto = 1)
  {           
    if (pos_braccio > 25) // se <=25 stop motion
    {
     pos_braccio = pos_braccio - 1; //il braccio avanza
    }
       
    if (pos_avambraccio > 70) // se <=70 stop motion
    {
     pos_avambraccio = pos_avambraccio - 1; //l'avambraccio si chiude
    }
        
    if (pos_braccio <= 25 && pos_avambraccio <= 70) //RAGGIUNTI I TARGET SI ATTIVA moto 2, INDIETRO
    {
     moto = 2;
    }     
  }

  //*********************** DIETRO
  if (moto = 2)
  {          
    if (pos_braccio < 165) // se >=165 stop motion
    {
     pos_braccio = pos_braccio + 1; //il braccio arretra
    }
    
    if (pos_avambraccio < 165) // se >=165 stop motion
    {
     pos_avambraccio = pos_avambraccio + 1; //l'avambraccio si apre
    }

    if (pos_braccio >= 165 && pos_avambraccio >= 165) //RAGGIUNTI I TARGET SI ATTIVA moto 1, AVANTI
    {
     moto = 1;
    }  
  }

    delay(20); 
    servo_braccio.write(pos_braccio);
    servo_avambraccio.write(pos_avambraccio);

}

Ho provato anche con l’ELSE invece di utilizzare 2 IF ma niente, dopo che i servi concludono il movimento AVANTI, rimangono fermi li :
Avete qualche suggerimento?

Non ho neppure letto tutto. Di sicuro questo è errato:

if (moto = 1)

Questa viene accettata in C ed è una assegnazione anche se stà in un if.

Questo è un confronto

if (moto == 1)

Ahhh e' vero!! :D

Grazie 1000 nid69ita! :)

nid69ita: Non ho neppure letto tutto. Di sicuro questo è errato:

if (moto = 1)

Questa viene accettata in C ed è una assegnazione anche se stà in un if.

visto che un assegnazione va sempre a buon fine viene valutata vera e percui il if viene sempre eseguito. È una codice valido e percui il compilatore non si lamenta ma non fa quello che Tu Ti aspetti. Si deve stare attenti di usare nel if i doppi == Ciao Uwe

uwefed:

nid69ita: Non ho neppure letto tutto. Di sicuro questo è errato:

if (moto = 1)

Questa viene accettata in C ed è una assegnazione anche se stà in un if.

visto che un assegnazione va sempre a buon fine viene valutata vera e percui il if viene sempre eseguito. È una codice valido e percui il compilatore non si lamenta ma non fa quello che Tu Ti aspetti. Si deve stare attenti di usare nel if i doppi == Ciao Uwe

Si difatti non ero più abituato a questa "costrizione" del == al posto del semplice = :P Grazie :)

Non è una costrizione, è la sintassi del linguaggio. :D Serve per evitare ambiguità. ;) Anche l'AND booleano è rappresentato da "&&", così da distinguerlo dall'AND binario, che invece ha solo 1 segno "&"

PS: In Pascal si usava a := 1 per fare le assegnazioni, però mica ci si lamentava :P

leo72:
Non è una costrizione, è la sintassi del linguaggio. :smiley: Serve per evitare ambiguità. :wink:
Anche l’AND booleano è rappresentato da “&&”, così da distinguerlo dall’AND binario, che invece ha solo 1 segno “&”

PS:
In Pascal si usava a := 1 per fare le assegnazioni, però mica ci si lamentava :stuck_out_tongue:

Diciamo che mi sono fossilizzato per anni con il DarkBasic Pro, con il quale un’assegnazione puo’ essere un semplice =…
Grazie per la spiegazione Leo!