ciao a tutti sto progettando un robot che evita ostacoli comandato da due motori
ora sto cercando di creare un loop per la decelerazione in modo tale da evitare che i due motori si blocchino in modo brusco rischiando di rompere gli ingranaggi che tra l'altro sono anche di plastica, comunque il mio problema è sono riuscito a creare questo loop con un ciclo for ma non so come fermare il ciclo..il codice è il seguente:
void decelerate() {
digitalWrite(MOTOR_in1, LOW); // motore sinistra gira avanti
digitalWrite(MOTOR_in2, HIGH);
digitalWrite(MOTOR_in3, HIGH); // motore destro gira avanti
digitalWrite(MOTOR_in4, LOW);
for (valoreFade = 255; valoreFade > 0; valoreFade--) // decelerazione motore
{ analogWrite(enablePinA, valoreFade);
analogWrite(enablePinB, valoreFade);
delay(10);
}
}
il void decelerate lo richiamo nel mio void loop, funzionare funziona ma continua a farlo e io voglio che lo faccia una volta sola
SIcuramente per attivare questa decellerazione utilizzerai un comando, o un pulsante. potresti fare un controllo sull'attività del pulsante. Se il pulsante viene premuto porti a 1 una variabile se viene lasciato la si porta a 0.Poi metti un altro controllo sulla funzione di decellerazione in modo che fin quando una determinata variabile è 1 allora decellera.
beh l'idea sarebbe che quando il sensore ad ultra suoni individua l'oggetto ad una certa distanza inizi a decelerare e quindi a fermarsi...quindi il pulsante è da escludere, ho letto che per terminare il ciclo for bisogna aggiungere al codice: "break;" ma non funziona
Bhe per quanto riguarda la logica il sensore ad ultrasuoni funziona come un "pulsante".Nell'if dell attivazione del pulsante metti la condizione che tipo la distanza deve essere un tot. e fai tipo
Frenare un motore DC con un ponte H si puó fare in 3 modi:
velocissimo: mettere Tutti due i semiponti su H o L e cosí viene cortocircuitato il motore
medio. Disattivando il ponte H con enable. Il motore si ferma per inerzia e a causa della resistenza meccanica nei ingranggi cuscinetti e ruote.
lento fare una PWM con valri devrescenti di duty cycle.
Io non so come gestire un motore via software, quello lo sai tu, ti posso suggerire per ripetere una sola volta la funzione decelerazione di mettere un flag
es:
byte decelera=0;
loop()
{
il robot fa i suoi giri a velocità di regime ....
...
...
se trova un ostacolo decelera=1; oppure lo mandi qui direttamente in void decelerazione();
if (decelera == 1) void decelerazione();
}
void decelerazione()
{
istruzioni per rallentare il movimento
...
...
decelera=0;
}
Qualcosa di simile, ma non vedendo la struttura del tuo loop() non si può darti grandi suggerimenti, mi sembra inutile comunque
Non mi torna però quello che hai messo qui
if(distanza>tot)
{
decellera
}
Qui sembrerebbe che la funzione di rallentamento venga eseguita quando l'ostacolo è lontano
non dovrebbe essere
if(distanza < tot) allora esegui la decelerazione? poi che fa? torna indietro? si gira di tot gradi?
una volta che il robot si è girato la distanza da un qualsiasi oggetto dovrebbe essere > a tot e quindi non eseguire più la funzione decelera() ... perchè dici che si ripete?
Non è che il problema sta nell'uso errato del maggiore > .... minore < ?
Secondo me dovresti gestire un flag per il decelera quando trova 2++ ostacoli consecutivamente.
Sto andando a stecca
trovo un ostacolo, rallento e mi giro
mi sono girato e ho trovato un altro ostacolo (non rallento più perchè l'ho già fatto) mi giro ancora
In pratica sto creando alcuni sotto programmi nominandoli in questo modo: void decelerazione() , void avanti(); ecc.
e in seguito li vorrei richiamare tutti nel void loop ()
è possibile procedere in questo modo ??
ad esempio (a parole non ho ancora fatto il codice per questo caso): se il sensore (sensore ad ultrasuoni) rileva una certa distanza inizia a decelerare e quindi si ferma, a quel punto gira a sinistra e a destra e fa una comparazione tra quale delle due direzioni non vi siano oggetti e quindi poi il robot deve ripartire, pensavo di far tutto questo creando dei sottoprogrammi e mettere poi tutto assieme
si puoi spezzare il programma in tante funzioni logiche. E' anche meglio.
la tua funzione funziona, visto che decellera e assolutamente NON è un ciclo infinito (esci da for quando valorefade arriva a 0) perciò inutile il break;
il problema è SICURAMENTE nel codice che non hai postato, ovvero nel loop(). Senza quello (come detto da @paolop) non ti possiamo aiutare.