Robottino senza delay()

ciao a tutti, come posso evitare l'uso dei delay sul mio robottino?
Per controllare i motori ho creato varie funzioni del tipo

avanti(); 
indietro();

ecc
mettendo dei delay tra una funzione e l'altra, ma in questo modo Arduino rimane bloccato durante il periodo di tempo del delay...
Allora ho provato a fare una cosa del genere, però non va (è solo un esempio di prova):

int AIN1 = 8;
int AIN2 = 9;
int tempo = 0;
int ritardo1 = 0;
int ritardo2 = 0;
void setup() {
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
}
void loop() {
  tempo = millis();
  if (tempo > ritardo1 + 2000)
  {
    avanti();
    ritardo1 = millis();
  }
  //delay(1000);
  if (tempo > ritardo2 + 4000)
  {
    indietro();
    ritardo2 = millis();
  }
}
void avanti() {
  digitalWrite(AIN1, HIGH);
  digitalWrite(AIN2, LOW);

}
void indietro() {
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, HIGH);


}

Voglio far andare i motori avanti per 2 secondi e indietro per 4 (esempio) però senza interrompere il programma. Avete qualche soluzione?
Grazie

Ciao, la logica potrebbe non essere del tutto sbagliata ma se in fase iniziale non imposti il robottino affinchè vada avanti o indietro non può funzionare. Inoltrela definizione delle variabili da confrontare con millis è errata, non sono int ma bensì unsigned long.
Se poi la logica deve essere vadio avanti per due secondi e poi vado indietro per quattro secondi devi usare una variabile per sapere se stai andando avanti o indietro e in base a quella decidi come controllare lo scorrere del tempo.

Come dice @fabpolli.
L'ideale è creare una macchina a stati finiti. Ovvero una variabile che memorizza in che momento sei. Una istruzione switch() su quella variabile esegue il codice giusto. Nel codice il tempo passato modifica lo stato del robot.
Prova a leggere questo, anche se esempio diverso, è in italiano:
http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/
un tutorial in inglese però:

nid69ita:
Come dice @fabpolli.
L'ideale è creare una macchina a stati finiti. Ovvero una variabile che memorizza in che momento sei. Una istruzione switch() su quella variabile esegue il codice giusto. Nel codice il tempo passato modifica lo stato del robot.
Prova a leggere questo, anche se esempio diverso, è in italiano:
Macchina a stati finiti e Arduino – lucadentella.it
un tutorial in inglese però:
Gammon Forum : Electronics : Microprocessors : State machines

Ciao a tutti, rispondo dopo un po' di tempo dato che avevo lasciato perdere.
Dunque, una variabile per memorizzare lo stato attuale (avanti o indietro) e per gestire il tempo come posso fare? cioè per impostare il tempo che deve durare il movimento... in sostanza come controllo lo scorrere del tempo?
Grazie

Prova a studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che molte cose ti saranno più chiare.

Guglielmo

Sisi, conosco già millis.
L'overflow non è un problema dato che "scatta" dopo 49,7 giorni...

Ragazzi, il mio problema è sempre lo stesso, non c'è nessuno che può darmi un "aiutino"?

Allora, praticamente ho creato varie funzioni per i movimenti del mio robottini, come

 avanti()
indietro() 
fermo()

ecc
Come faccio a far andare avanti() il mio robottino per 5 secondi per una sola volta senza usare i delay (quindi con millis() ) e inserendo il codice nel loop?
Mi serve solo qualche "input" per come risolvere, il codice me lo scrivo da solo.
Grazie

Il conteggio lo devi fare per "differenza". Devi memorizzare la millis() quando deve partire il tempo poi verifichi per differenza se quel tempo è passato, solo allora scatta l'evento. In pratica fai andare avanti solo finchè quella differenza non ha raggiunto i 5 secondi (e la variabile che memorizza la metti a zero quando ha finito)

...
OldMillis=millis();
...
if(OldMillis!=0)  // 
{ if(OldMillis-millis()<=5000) 
    avanti();
  else  
    OldMillis=0;
}

P.S. In generale, secondo me, il tuo programma dovrebbe seguire lo schema di una macchina a stati finiti:
http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/
Una variabile dice in quale stato è il robot. Quella variabile la cambi in base ad eventi.

nid69ita:
Il conteggio lo devi fare per "differenza". Devi memorizzare la millis() quando deve partire il tempo poi verifichi per differenza se quel tempo è passato, solo allora scatta l'evento. In pratica fai andare avanti solo finchè quella differenza non ha raggiunto i 5 secondi (e la variabile che memorizza la metti a zero quando ha finito)

...

OldMillis=millis();
...
if(OldMillis!=0)  //
{ if(OldMillis-millis()<=5000)
    avanti();
  else 
    OldMillis=0;
}





P.S. In generale, secondo me, il tuo programma dovrebbe seguire lo schema di una macchina a stati finiti:
http://www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/
Una variabile dice in quale stato è il robot. Quella variabile la cambi in base ad eventi.

Ok, grazie mille, ci sono riuscito.
Solo che è un po' un casino perchè per quello che devo fare io servono molte variabili, ad esempio se il robottino sta andando avanti, se deve girare, se a già girato, per la direzione in cui deve girare ecc.
Non esiste una libraria già pronta che semplifichi un po' la vita?
Altrimenti il programma diventa abbastanza complesso e poco leggibile..

Io mi ripeto, farei il programma seguendo la logica di una macchina a stati finiti, vedi il mio post precedente.

nid69ita:
Io mi ripeto, farei il programma seguendo la logica di una macchina a stati finiti, vedi il mio post precedente.

Sisi, infatti.
Il fatto è che quando le variabili diventano numerose il tutto diventa un po' complicato... tutto qui