rotazione alternata da pulsante

Ciao a tutti,

Sto cercando di azionare un motore in modo alternato, vale a dire premo il pulsante si muove fino ad un certo punto poi ripremo quello stesso pulsante e il motore ruota allo stesso modo ma in modo inverso.
Mi sono bloccato in quanto quando dico al motore di ruotare in senso contrario si ferma al posto di cambiare verso. :confused:

Per favore date un occhiata voi ditemi dove sbaglio. Sono veramente bloccato :cry:

Grazie

G.

PULSANTE_MOTORE_AZIONAMENTO.ino (1.41 KB)

Per primo non dai nessuna informazione riguardante i driver, il motore e come é collegato il motore. Non abbiamo la sfera di cristallo che ci fa vedere quello che Tu hai.

Poi prova di stampare sulla seriale le variabili vA, vB, dA, dB per vedere che risultati ottieni dai calcoli.

Ciao Uwe

Scusa mi era sembrato che l'allegato fosse stato caricato, la allego ora. Il motore è il 6V motoriduttore, collegato ad un motorshield arduino. Attualemente per i test è collegato in 5V prima che venga montato. Provo a vedere cosa esce dalla stampa delle variabili.

il risultato è:

vA: 0
vB: 255
dA: 0
dB: 0
vA: 0
vB: 255
dA: 0
dB: 1
vA: 0
vB: 255
dA: 0
dB: 0
vA: 0
vB: 255
dA: 0
dB: 1

dB diventa 1 quando il motore si ferma altrimenti è 0. vA è sempre 0 in quanto non è collegato nulla.

Grazie

Sei sicuro di usare i pin giusti?

Ho controllato; sono giusti.
Non é necessario, ma prova di mettere il BRAKEB ovvero pin D8 a LOW.

Ciao Uwe

Come si dice..Se non ne stai capendo nulla ricomincia da capo. E mi sono accorto che non avevo previsto proprio il controllo del motore nell'altro senso. Comunque ora funziona, ma ora sto integrando il tutto con dei pulsanti che vorrebbero essere dei finecorsa(sto attendendo che mi arrivino). In pratica premi il pulsante gira fino al fine corsa finale(sezione verde pin 8) premi il pulsante e torna indietro fino al fine corsa iniziale(sezione gialla pin 2). Ma per l'ennesima volta brancolo nel buio. in pratica gli stati sono 4: 1) inizio corsa premuto e azione no e fine corsa no, 2)inizio corsa no e azione si fine corsa no,3) inizio corsa no azione si e fine corsa si,4) inizio corsa no azione no fine corsa si. Sto cercando di sviluppare per il momento l'ultimo stato per poi sviluppare gli altri ma se non riesco a fare il più semplice figuriamoci i più complessi. Allego il nuovo codice e il nuovo schema.

Grazie e buon natale :smiley:

pulsante_motore.ino (1.82 KB)

lo schema elettrico non riesco a postarlo. Comunque è praticamente uguale a quello postato precedentemente ma con altri e pulsanti(oltre quello già presente) che rappresentano il finecorsa e l'iniziocorsa(fine corsa posto all'inizio dello scorrimento). i pin sono al 2 l'inizio corsa, l'azionamento il 7 e l'8 il fine corsa.

Hai messo delle resistenze pulldown?

Il delay(50) nel if funge giá da antirimbalzo; non serve che metti nel if il millis()

Devi ripensare alla logica di funzionamento.
Adesso fai partire il tutto quando premi il pulsante e fermi il motore quando arriva al finecorsa. Se rischiacci il pulsante deve girare il motore alontanadosi da quel finecorsa. Devi usare una variabile di direzione che varia con i finecorsa oltre che con il premere del pulsante.

Ciao Uwe

Non avevo pensato alle resistenze di pull e le subito inserite.
Avevo pensato di mantenere quella logica di movimento del motore come una sorta di "sistema di emergenza" se ripremo il pulsante di azionamento quello ritorna alla posizione di partenza. Oggi provo a integrare questa nuova variabile. vedo se ne riesco a cavare un ragno dal buco :smiley:

Ti ringrazio tantissimo Uwe

Allora ho fatto dei passi in avanti. Sono riuscito a inserire tutto ho fatto anche una disposizione in 3 bit. Ma ho questo problema

    void loop() {  
      ingr = digitalRead(BUTTONI);  // legge il valore dell'input e lo conserva  
      fine = digitalRead(BUTTONF);
      azione = digitalRead(BUTTONA);

      if (ingr == HIGH) {  
      setMotors(0,0); //il motore è fermo

      } 
     
     if (ingr== HIGH && azione == HIGH ) {  
       
delay(50);
valI = 0;
  setMotors(0,128); //accende il motore
      }
   if (ingr== LOW && azione == HIGH ) {  
       
delay(50);

  setMotors(0,128); //accende il motore proseguendo lo stato precedente
      }

Pensavo nel caso la compilazione si complicasse di usare una compilazione con lo switch. Che dite?

Allora chi dura la vince..

alla fine ci sono riuscito togliendo gli if e facendo uno switch e inserendo dei while :smiley:

Grazie a uwefed per l'interessamento e l'aiuto :smiley:

Mi piacerebbe vedere come hai risolto, mi sarebbe di aiuto a capire, grazie.