Decelerazione motore

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

Grazie in anticipo !

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

Alternative ??

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

if(distanza>tot)
{
decellera
}

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.

Ciao Uwe

OK però la funzione decelera me la ripete all'infinito visto che è un ciclo for o mi sto sbagliando ??

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 :slight_smile:

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.

  1. Sto andando a stecca
  2. trovo un ostacolo, rallento e mi giro
  3. mi sono girato e ho trovato un altro ostacolo (non rallento più perchè l'ho già fatto) mi giro ancora
  4. non ci sono ostacoli riprendo ad andare a stecca

ciao

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

Grazie per le risposte !

La risposta e una richiesta te l'ha data @paolop

  1. si puoi spezzare il programma in tante funzioni logiche. E' anche meglio.
  2. 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;
  3. il problema è SICURAMENTE nel codice che non hai postato, ovvero nel loop(). Senza quello (come detto da @paolop) non ti possiamo aiutare.