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ò:
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
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)
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)
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..