Ho un problema con il ciclo Do...While

Salve, voglio far muovere un motore passo passo tramite monitor seriale tramite il ciclo do...while

int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 5;
char tasto;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin (9600);


}

void loop() {


  do {


    digitalWrite (motorPin1, HIGH);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, HIGH);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, HIGH);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, HIGH);
    delay (delayTime);
  }
  while (if (Serial.available () > 0)
           tasto = Serial.read ();
           switch (tasto);
           case 72: )
          break;

  do {


    digitalWrite (motorPin1, HIGH);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, HIGH);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, HIGH);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, HIGH);
    delay (delayTime);
  }
  while (if (Serial.available () > 0)
           tasto = Serial.read ();
           switch (tasto);
           case 62: )

        case 13:
  break;

case 10:
  break;

default:
  Serial.println ("Comando Sconosciuto:");
  Serial.println (tasto);
  Serial.println (".Premi H o L");
  break;
}
}
}

Ho cercato di fare questo programma... va bene ? In ogni caso, quando inserisco H sul monitor seriale

digitalWrite (motorPin1, HIGH);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, HIGH);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, HIGH);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, HIGH);
    delay (delayTime);

deve ripetersi all' infinito il codice quà sopra finchè non premo L. A quel punto... gira in senso orario, quindi

digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, HIGH);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, HIGH);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, HIGH);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, HIGH);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);

Buona sera, essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del nostro regolamento, ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :)

>MaurizioMiscio: … mettere “troppa carne al fuocoNON è mai bene … ricomincia scrivendo uno semplice “scheletro” di cosa deve fare il programma, SENZA tutte quelle digitalWrite() (… dove vanno metti SOLO un commento del tipo "// <— qui vanno le digitalWrite()) e senza tante complicazioni poi, piano piano, verificato che funziona tutto, aggiungi altre parti e così via :wink:

Guglielmo

P.S.: E impara ad “indentare” correttamente il codice che così è illegibile e “nasconde” di più gli errori. C’è una funzione dell’IDE per l’indentatura automatica … Strumenti → Formattazione Automatica.

Ciao! All'interno di un ciclo while o do while, occorre mettere una condizione o qualcosa che possa essere valutata vera o falsa, 1 o 0. Non possiamo mettere un programma tra le parentesi come hai fatto tu :)

Se tu hai la necessità di leggere un carattere da seriale e fare altre cose, lo potresti fare nel corpo del ciclo. Cioè dove metto le istruzione metto anche la lettura del carattere da seriale e tutto il resto.

Però penso che il tuo programma sia una soluzione sbagliata per quello che vuoi fare. Ti propongo uno schema diverso del programma.

1) Io creo due funzioni void rotazioneOraria(), void rotazioneAntioraria(), nel corpo delle due funzioni inserisco i digitalWrite() per fare ruotare il motore in un senso o nell'altro, quello che adesso è nel do while.

2) Nella funzione loop(), se c'è un carattere su seriale if (Serial.available () > 0, leggo il carattere e lo assegno alla variabile.

3) Ho un if e else if, nella funzione loop(), se il carattere è a richiamo una funzionemovimento, se il carattere e b, richiamo l'altra funzione movimento.

Ho letto che hai 14 anni, io a quella età non sapevo fare niente con i computer :)

torn24 potresti darmi un’ esempio ? (quindi… Fai copia incolla il mio programma è lo sistemo a modo tuo) grazie. Ció mi serve per la scuola ti sono veramente riconoscente.

Ecco cosa intendevo! Però se riuscivi a capire dal testo avresti imparato di più :)

int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int delayTime = 5;
char tasto;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin (9600);


}

void loop() {

     if (Serial.available () > 0)
           tasto = Serial.read ();


     if(tasto=='a'){// Se il carattere è =='a' continuo in ciclo a chiamare la funzione ruotaOrario()

         ruotaOrario();

     }else if(tasto=='b'){// Se il carattere è =='b' continuo in ciclo a chiamare la funzione ruotaAntiorario()

         ruotaAntiorario();

     }else{
              
           //Quello che vuoi fare se il carattere è diverso
  
     }
          
           
}


void ruotaOrario(){// i digitalWrite potrebbero essere invertiti, con orario o antiorario, da controllare

    digitalWrite (motorPin1, HIGH);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, HIGH);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, HIGH);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, HIGH);
    delay (delayTime);
}


void ruotaAntiorario(){

    digitalWrite (motorPin1, HIGH);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, HIGH);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, HIGH);
    digitalWrite (motorPin4, LOW);
    delay (delayTime);
    digitalWrite (motorPin1, LOW);
    digitalWrite (motorPin2, LOW);
    digitalWrite (motorPin3, LOW);
    digitalWrite (motorPin4, HIGH);
    delay (delayTime);

}

Cerca in rete la giusta sequenza per rotazione oraria e antioraria, adesso ruota solo in un senso perché il codice è lo stesso nelle due funzioni O UTILIZZA LA LIBRERIA STEPPER.H

Ti ringrazio infinitamente... Questa community dovrebbe essere molto piú zeppa di persone come te ! In questo periodo della mia vita scolastica ho bisogno di un po' di aiuto e questo forum si rileva perfetto. Ho capito anche dalla parte scritta ma volevo mi facessi lo skatch per essere sicuro che non sbagliassi. Grazie ancora ! Ti auguro buona giornata !

Con l’uso della libreria stepper.h diventa ancora più semplice :slight_smile:

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(60);
  // initialize the serial port:
 
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  Serial.begin (9600);


}


void loop() {

    if (Serial.available () > 0)
           tasto = Serial.read ();


     if(tasto=='a'){// Se il carattere è =='a' 

         myStepper.step(1); // finché il carattere è a, faccio di continuo un passo orario
         delay(100);

     }else if(tasto=='b'){// Se il carattere è =='b' 

         myStepper.step(-1); // finché il carattere è b, faccio di continuo un passo antiorario
         delay(100);

     }
  
  

  
}

Un problema a cui puoi andare incontro! Col monitor seriale dell'IDE arduino, puoi impostare "in basso a destra del monitor seriale", di inviare solo i caratteri, o di aggiungere il carattere new line.

Se sul monitor seriale dici di aggiungere il carattere new line, questo sarà l'ultimo carattere letto dal programma, e il programma non funzionerà perché non corrispondono ai caratteri voluti.

MaurizioMiscio:
T Ho capito anche dalla parte scritta ma volevo mi facessi lo skatch per essere sicuro che non sbagliassi.

fai così: impara almeno i verbi da solo
Visto che ormai programmare hai copiato…

MaurizioMiscio: Si, mi piacerebbe un sacco usare le librerie ma il nostro prof vuole prima insegnarci a programmare senza !

Spero che il tuo prof sia iscritto al forum

(OT-MODE) Leggendo il solo oggetto del topic ho iniziato a temere una gravidanza indesiderata... :D (/OT-MODE)

docdoc:
(OT-MODE)
Leggendo il solo oggetto del topic ho iniziato a temere una gravidanza indesiderata… :smiley:
(/OT-MODE)

Dopo nove mesi una arduino Due, un aborto insomma!
Ma dai!!!