Go Down

Topic: "posizione home" motore passo-passo all'accensione (Read 898 times) previous topic - next topic

acuplush

Mar 31, 2018, 11:34 am Last Edit: Mar 31, 2018, 01:34 pm by acuplush
ragazzi ho un problema, per il mio progetto son dovuto passare ad un motore unipolare (esattamente il 28byj48 con driver uln2003)
io devo fare in modo che all'accensione mi ruoti in senso antiorario fino alla pressione del finecorsa e poi rimanere lì fino a "richieste" dal loop., mentre se è già in posizione 0 deve semplicemente rimanere lì.

io ho trovato una guida che spiega come fare con i motori bipolari, ma con questo motore devo utilizzare una libreria specifica per farlo funzzionare al meglio, ma non riesco ad imporgli quello che voglio fare (magari non si può neanche fare)
questo il  link  alla guida della libreria

grazie


-zef-

Fai un ciclo con while dove controlli se il finecosa è premuto, se si, esce dal ciclo, se no, fai uno step nella direzione giusta, e il ciclo si ripete, prima o poi il fine corsa viene premuto e si esce dal ciclo... se il motore gira nel verso giusto  :)

p.s. ovvio che con while finché il finecorsa non viene premuto il programma rimane bloccato li

Etemenanki

#2
Mar 31, 2018, 11:47 am Last Edit: Mar 31, 2018, 11:48 am by Etemenanki
Deve farlo SOLO all'accensione ? ... non puoi mettere una while (o un'if) nel setup ? ...

alla fine del setup, controlli se finecorsa e' premuto, se si passi al loop, se no fai uno step verso la home e ricontrolli ... certo rimane bloccato, ma essendo nel setup, lo fa solo all'accensione ... e non credo ci voglia poi molto per arrivare alla home ed iniziare il loop, se non c'e' gia, giusto ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

MatteoDerrico

#3
Mar 31, 2018, 12:28 pm Last Edit: Mar 31, 2018, 12:28 pm by MatteoDerrico
ciao :)

non so se posso mettere link a siti esterni, incollo qui l'estratto della libreria, magari mi potete illuminare.

SI puoi metterli, per le altre volte torna comodo per chi deve rispondere :)
utilizza l'apposito taso per l''inserimento del link :)


MD
Se una scrivania in disordine è segno di una mente disordinata, di cosa sarà segno allora una scrivania vuota?

acuplush

ho aggiornato il primo post con il link.

si, mi basta farlo solo quando alimento arduino per avere la certezza che non si sia fermato lungo il percorso (magari per mancanza energia elettrica)

avevo provato ad abbozzare il codice ma non reagiva alla pressione del tasto. ora mi rimetto a fare prove

Etemenanki

#5
Mar 31, 2018, 02:26 pm Last Edit: Mar 31, 2018, 02:26 pm by Etemenanki
Uhm ... dovrebbe bastare una cosa tipo, come ultime righe del setup, una digitalwrite che mette il pin direzione nel verso di rotazione che porta a home, e subito dopo un while (finecorsa premuto) con dentro due digitalwrite, prima che porta il pin step alto e seconda che lo riporta basso per dare gli impulsi (ed ovviamente anche una read per leggere lo stato del finecorsa, altrimenti dall'interno del while non lo leggi piu) ... in quel modo il while continua a dare impulsi finche' non sente che il finecorsa e' premuto, poi esce ed inizia il loop ... ma se c'e' in giro un programmatore, forse ti puo suggerire anche un sistema migliore, a me adesso non viene in mente altro ... 
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

acuplush

#6
Mar 31, 2018, 02:45 pm Last Edit: Mar 31, 2018, 02:46 pm by acuplush
avendo il motore unipolare con la sua scheda non ho i pin "step" e "dir".
da quello che capisco dalla guida (non sono un genio in inglese) posso solo dirgli "tot step in un senso" o nell'altro con il segno -


per prova voglio fargli fare:
in caso che il finecorsa non sia premuto fai 1000 step in senso orario, controlla, se ancora non premuto fai altri 1000 step e così via fin che viene premuto,
poi passa al loop che fa 4000step in senso antiorario, pausa 4000 orario.



questo è quello che ho scritto ma non funziona, mi va subito al ciclo loop, della parte setup non mi fa niente.
magari sbaglio qualcosa di banale  :(

Code: [Select]

#include <StepperMotor.h>

// 4 pins of the stepper motor board
#define _PIN1 8
#define _PIN2 9
#define _PIN3 10
#define _PIN4 11

// Intderruption on PIN2, push-button
#define ITR_PIN 2




StepperMotor stepper(_PIN1, _PIN2, _PIN3, _PIN4);



void setup()
{
 
  stepper.setPeriod(1);
  pinMode(ITR_PIN, INPUT);
  pinMode(_PIN1, OUTPUT);
  pinMode(_PIN2, OUTPUT);
  pinMode(_PIN3, OUTPUT);
  pinMode(_PIN4, OUTPUT);
  digitalRead (ITR_PIN);
 
  while (digitalRead (ITR_PIN) ==LOW)
  {
  stepper.move (1000);
  delay (500);
  digitalRead (ITR_PIN);
  }
}

void loop()
{
    stepper.move(-4000);
    delay (5000);
      stepper.move(4000);   
     delay (5000);
     
     
}]



Puso

ciao
non sono un programmatore ma io eviterei il While.

al suo posto metterei due IF con una bella condizione booleana.

Se finecorsa è premuto allora condizione Vera
Se finecorsa non è premuto allora condizione Falsa,quindi gira finche la condizione diventa vera.

Qualkosa del genere.



paulus1969


Ma quei
digitalRead (ITR_PIN);
messi così da soli....

A parte questo, dicci come è collegato il pulsante.
Al limite metti nel setup un Serial.print dello stato del pulsante prima del while ed uno dopo il while, così dal monitor seriale lo vedi.


acuplush

#9
Mar 31, 2018, 04:05 pm Last Edit: Mar 31, 2018, 05:01 pm by acuplush
il pulsante è collegato al pin 2 in modo "classico":
un pin al polo positivo, l'altro al pin 2 e al negativo tramite resistenza

edit:

sembra che ci sia riuscito!!!!!
questo è il codice di setup, in questo modo và indietro a step di 500passi finchè preme il pulsante, poi passa al loop.


Code: [Select]
void setup()
{
 
  stepper.setPeriod(1);
  pinMode(finecorsa, INPUT);
  pinMode(_PIN1, OUTPUT);
  pinMode(_PIN2, OUTPUT);
  pinMode(_PIN3, OUTPUT);
  pinMode(_PIN4, OUTPUT);
  digitalRead (finecorsa);
  val = digitalRead(finecorsa);
  Serial.begin(9600);
  while (val ==LOW)
  {
   Serial.println(" azzeramento in corso ");
  stepper.move (500);
  delay (200);
  val = digitalRead(finecorsa);
  }
 
     Serial.println(" azzeramento eseguito "); 
}

brunello22

in quel modo, non scatta subito quando raggiungi il finecorsa


Code: [Select]
 Serial.println(" azzeramento in corso ");
  stepper.move (1);
  delay (1);

acuplush

in quel modo, non scatta subito quando raggiungi il finecorsa


Code: [Select]
Serial.println(" azzeramento in corso ");
  stepper.move (1);
  delay (1);


Hai ragione ma quei valori "alti" li ho messi per vedere con l'occhio il movimento, poi li regolerò di conseguenza, calcolando anche che a quel motore lì attaccherò un riduttore meccanico 100/1

Intanto ho creato il codice giusto, per modificare i valori c'è tempo nei test finali

Go Up