problema avviamento motore

Stiamo facendo un progettino sull’uso di arduino e il sensore ad ultrasuoni e un motore per lo spostamento di un carico…spostamento determinato dal sensore ad ultrasuoni. Provando a inserire una lunghezza ben precisa già nello sketch essa viene raggiunta ma quando si tratta di inserirla io stesso il motore non parte. Posto qui i due sketch:

I)
/*Prova di avviamento sincronizzato con misurazioni mediante
 il sensore ad ultrasuoni. Per prova si cercherà di arrivare
 alla misurazione definitiva di 300 mm*/
int trigger=3, echo=2, rpwm=8,lpwm=7, enable=12,distanza,time;
float durata;


void setup(){
  Serial.begin(9600);
  pinMode( trigger, OUTPUT );
  pinMode( echo, INPUT );
  pinMode( rpwm, OUTPUT );
  pinMode(enable,OUTPUT);
  pinMode(A5,INPUT);
}

void loop(){
  digitalWrite(enable,HIGH);
  distanza=misura();
  Serial.print(distanza, DEC);
  Serial.println("mm");
  if(distanza>=300){
    analogWrite(rpwm,0);
    digitalWrite(enable,LOW);
  }

  analogWrite(lpwm, 0);
  time=millis();
  while(time+30>millis() && distanza<299){
    analogWrite(rpwm, 200);
    readCurrent();

  }
}

II)
int trigger = 3;
int echo = 2;       //pin di echo e trigger del sonar
int enable = 12;    //pin di abilitazione della scheda di potenza
int rpwm = 8;       //pin di pilotaggio direzionale AVANTI
int lpwm = 7;       //pin di pilotaggio direzionale INDIETRO  
int arrivo;
int corrente;
int Traguardo;
int distanza;          //valore restituito dalla funzione "misura"
int partenza;
int misurabase=177; //sostituire a 10000 il numero ottenuto attraverso lo sketch misurabase
int time;

void setup(){
  Serial.begin(9600);
  Serial.println("Inserisci una lunghezza intera compresa tra 0 e 200."); //il programma taglierà comunque la parte decimale
  Serial.println(" ");
  pinMode( trigger, OUTPUT );
  pinMode( echo, INPUT );
  pinMode( rpwm, OUTPUT );
  pinMode( lpwm, OUTPUT );
  pinMode(enable,OUTPUT);
  pinMode(A5,INPUT);
}

void loop(){
  distanza=misura();
  if (Serial.available()) {
    arrivo= Serial.parseInt();  
    Traguardo=arrivo + misurabase;
    Serial.print("Traguardo:");
    Serial.print(Traguardo,DEC);
    Serial.println("mm");
  }
  digitalWrite(enable,HIGH);
  while(Traguardo>distanza){
    avanti();
  }
}

la funzione avanti è data da:
void avanti(){
  distanza=misura();
  Serial.print("distanza:");
  Serial.print(distanza, DEC);
  Serial.println("mm");
  if(distanza>=Traguardo){
    analogWrite(rpwm,0);
    digitalWrite(enable,LOW);
  }

  analogWrite(lpwm, 0);
  time=millis();
  while(time+30>millis() && distanza<Traguardo){
    analogWrite(rpwm, 200);
    readCurrent();
  }
}

avete qualche consiglio? ps le funzioni readcurrent e misura non le posto perchè sono funzionanti

Giolino:
avete qualche consiglio?

Si, modificare il topic e includere il codice dentro i tag CODE. Per vedere come si fa guarda il punto 7 --> [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Ma nel Monitor Seriale i dati stampati sono corretti?

innanzitutto chiedo scusa per il post. modificato prontamente :cold_sweat: . Cmq nel primo caso (quello funzionante) si . Nel secondo dal momento che l'ostacolo non si muove a video viene stampata sempre la prima misura...sembra che si blocchi prima del ciclo while e non muovendo mai l'ostacolo ovviamente non esce mai dalla funzione "avanti()"

Manca la condizione se sulla seriale non c'è niente.
Esempio

if (Serial.available()) {
    arrivo= Serial.parseInt();  
    Traguardo=arrivo + misurabase;
    Serial.print("Traguardo:");
    Serial.print(Traguardo,DEC);
    Serial.println("mm");
  }
else
{
   Traguardo= 0 + misurabase;
   Serial.print("Traguardo:");
    Serial.print(Traguardo,DEC);
    Serial.println("mm");
}

vabbè quello è l'ultimo dei problemi. A me sembra strano che della funzione AVANTI non entri proprio nel ciclo while che avvia il motore per 30 ms..... =(

Il While funziona così.
Se la condizione è falsa non effettua neanche un ciclo.
Per effettuare almeno un ciclo devi usare do…while

do
{

} while(condizione);

Vuol dire che in quel punto del codice Traguardo non è maggiore di distanza.

EDIT: O stai parlando di questo?

while(time+30>millis() && distanza<Traguardo){
    analogWrite(rpwm, 200);
    readCurrent();
  }

Si esatto sto parlando proprio del secondo sketch che hai postato

risolto: ho modificato il tipo di funzione void avanti in int avanti e gli ho passato il termine Traguardo :slight_smile: grazie cmq Paolo P per la tua attenzione