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.
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).
In effetti avevo dimenticato quelle variabili. In origine usavo quelle per cercare di comandare il motore ma in effetti ora non servono a nulla
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
Grazie per l’interessamento
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!