Microriduttore che continua a girare

Ciao a tutti,

Ho il seguente problema e non so come uscirne. Ho praticamente un motoriduttore che deve azionare una barra e la barra a fine corsa attiva un pulsante che deve far fermare il motoriduttore. Il problema che una volta arrivato a fine corsa e attivato il pulsante il motoriduttore continua a girare a velocità ridotta al posto di interrompere la corsa. Se non mi sono spiegato posterò un video.

In allegato il file ino e la foto dello schema elettrico. La sezione gialla si allaccia al Pin 8 (quello che fa muovere il motore) mentre la sezione rossa e quella che dovrebbe bloccare il movimento ed è allacciato al Pin 7. Filo verde sono i 5 V e il bianco è la massa.

L’idea era quella di attivare il pulsante giallo e quindi il motorino che si fermava una volta arrivato al rosso. Poi ripremere il giallo e ritornava alla posizione di partenza. Ovviamente sono ancora all’inizio quindi sono ancora in fase di sperimentazione e quindi questo è un codice iniziale.

Grazie a chiunque mi aiuti :smiley:

pulsante_motore_2.ino (1.55 KB)

Perché dichiari A e B ad inizio sketch e poi non usi mai quelle variabili? A e B globali vengono poi "nascosti" da A e B dichiarati nella funzione setMotors (è la "visibilità").
Altra cosa, non ho capito la logica del programma, puoi spiegarla meglio? Nel codice io vedo questo:

      if (val1 == HIGH) {        // controlla che l'input sia HIGH (pulsante premuto)  
        setMotors(0, 255);
        if (val2 == HIGH){
          setMotors(0, 0);        // premuto il pulsante 2 si ferma tutto
        }
      } else {  
        setMotors(0, 0);
      }

Tradotto, significa:

se il pulsante 1 è alto, manda il comando setMotors(0,255) e poi controlla se il pulsante 2 è alto: se è premuto, manda il comando setMotors(0,0). Se il pulsante 1 non è alto, manda il comando setMotors(0,0).

Che fa setMotors(0,255)? e setMotors(0,0)?

In effetti avevo dimenticato quelle variabili. In origine usavo quelle per cercare di comandare il motore ma in effetti ora non servono a nulla :smiley:
I setMotors danno il comando per far girare il motore. 255 è il massimo mentre 0 ovviamente è fermo. La parte è divisa in 2 in quanto la parte successiva è di gestione dei motori

void setMotors(int A, int B)
{
   int vA = abs(A) * motorVolts / supplyVolts;
   int vB = abs(B) * motorVolts / supplyVolts;
   int dA = (A > 0);
   int dB = (B > 0);
   if (vA < 50)
   {
     vA = 0; 
   }
   if (vB < 50)
   {
     vB = 0; 
   }
   analogWrite(pwmPinA, vA);
   analogWrite(pwmPinB, vB);
   digitalWrite(directionPinA, dA);
   digitalWrite(directionPinB, dB);
}

è la parte di comando del motore. L’idea è se tengo premuto il pulsante 1 manda il motore a 255 se ho contemporanemente il pulsante 2 spegni tutto. Il problema che il motore continua a girare lentamente. Questa era la prima stesura in quanto successivamente l’idea era quella di aggiungere un nuovo comando sul punsante 1 che facesse ritornare il motore al punto di partenza.

Spero di essermi spiegato :sweat_smile:

Grazie per l’interessamento :smiley:

PS: ho risolto il problema erano le variabili A e B che mi continuavano a far girare il motore dichiarate all’inizio…Una svista incredibile!