Pilotare motore stepper con arduino nano

Ciao ragazzi, sto pilotando un motore stepper tramite un arduino nano e un driver, il motore in questione fa muovere una piccola coclea.

Il problema e che vorrei fermare il motore quando una cella di carico rileva che il peso impostato è stato raggiunto, per far questo utilizzo una libreria, nel dettaglio la HX711.h

La porzione di codice che fa si che il motore si muova si trova all’interno di un ciclo while, quindi perchè possa fermarlo si deve verificare all’interno del ciclo la condizione che permette di uscirne.

Il problema è che per recuperare il valore della variabile peso, il ciclo while rallenta di parecchio, facendo fare allo stepper sono pochi step al secondo, e questo non va bene nel mio caso.

Qualcuno ha idea su come risolvere???

Grazie a tutti, vi posto il codice che ho scritto!

void startmotor() {

  ////////ABILITAZIONE MOTORE ON////////
digitalWrite (X_EN_5v, LOW);//ENA+(+5V) low=abilitato

  ////////SENSO DI ROTAZIONE////////
digitalWrite (X_DIR_5v,HIGH); //HIGH=orario LOW=antiorario

////////CICLO MOTORE IN MARCIA////////
while(peso_raggiunto==false) 
{      
  digitalWrite (X_STP_5v, HIGH);
  delayMicroseconds (MoveSpeed);
  digitalWrite (X_STP_5v, LOW);
  delayMicroseconds (MoveSpeed);

peso = bilancia.get_units(5), 3;


  if (peso <= peso_impostato and rotore_bloccato == false and abilitazione == true) {
   peso_raggiunto=false; // peso non raggiunto
  }
  else { 
    peso_raggiunto=true; // condizione per uscire dal ciclo while
    stop_motor();
    return; //torno al loop
  }
}

}

Quanto preciso deve essere misurato il peso?

Se usi solo un amplificatore differenziale e misuri la tensione col ADC del Arduino sei piú veloce.

Ciao Uwe

ciao,

potresti o spostare la lettura del peso...cioè invece di mettere la bilancia dopo la coclea, che avrà sempre un ritardo almeno che non usi formule di "predizione", misurare quanto entra in coclea..cioè tipo "perdita di peso"; altra soluzione è quella di eseguire un test di portata...cioè forzi la coclea per x impulsi del motore e registri il peso...questo testo darà la portata per impulso o per n impulsi come vuoi tu...e successivamente fai la correzione con la verifica del peso.

La lettura del peso sta bene all'uscita, se la metti all'entrata devi sempre avere la coclea piena ecc. ecc...
Il discorso di predire già il numero di giri è valido ma magari complicato.
Quello che ho fatto io è invece giocare sulla velocità del motore: vado al 100% fino al(peso che voglio - X) che può essere un 5%, per esempio. A quel punto abbasso la velocità della coclea anche della metà ed ho il peso perfetto. Ma io ho velocità variabile
Nel tuo caso invece allungherai i ritardi tra un passo e il successivo ma il discorso non cambia: arrivare velocemente fino al 95 o 98% del peso e poi rallentare.

Il 90% del peso lo potresti raggiungere legando il peso erogato ai passi.

In alternativa, potresti usare un altro nano o un attiny (se ce la fa) per misurare il peso e quando raggiungi quello voluto fai portare alto un piedino dell'attiny collegato ad un piedino del nano che potresti leggere dentro il ciclo while (operazione molto più veloce, al limite vai anche con la manipolazione diretta delle porte).

per girare una coclea ti serve per forza la precisione di uno stepper? Non puoi usare un motoriduttore cc e pilotarlo in PWM? Come ti ha suggerito Steve_cr lo fai andare al massimo della velocità fino ad un 97% e poi lo rallenti finché non raggiunge il peso desiderato.

Comunque nel codice postato il secondo delayMicroseconds (MoveSpeed); non serve visto che già la lettura del peso introduce un ritardo, magari guadagni un po' di velocità in più senza.