Go Down

Topic: Programmare un motore passo passo (Read 10563 times) previous topic - next topic


-zef-

ho sempre usato dei driver in cui puoi regolare la corrente che arriva al motore in modo da pilotarli senza bruciarli, inoltre hanno comunemente tre piedini di controllo, enable per abilitare o meno il driver e alimentare il motore anche se non gira, in questo modo mantiene la posizione anche sotto sforzo, dir che serve per la direzione in cui deve ruotare e step che appunto fa compiere al motore uno step, nel tuo driver per quanto ne so è un doppio ponte ad H, per pilotare due motori dc separati oppure un unico stepper, ma la logica di funzionamento è diversa, sul tuo (ma non avendolo mai usato non sono sicuro al 100%) hai 4 pin di controllo (IN1 e IN2 per una fase e IN3 e IN4 per l'altra fase) dove due indicano in quale verso deve ruotare il motore A e gli altri due in quale verso ruotare il motore B che tradotto per uno stepper dovresti pilotare in sequenza IN1 e IN3 (lasciando IN2 e IN4 a low) per far girare il motore in un senso e IN2 e IN4 per farlo girare al contrario, ma ripeto non ho mai usato quel tipo di driver per pilotare uno stepper qindi prendi con le pinze quanto ho scritto (se no poi viene uwefed e mi caz.....  :) :) :) )

Puso

Forse dico una sciocchezza i no conosco queste schedine ma immagino siano un semplice ponteH più o meno elaborato.

Comunque sia i motori Passo Passo funzionano tutti allo stesso modo(quasi) devi solo azzeccare la sequenza giusta delle bobine.

Durante le MIE di prove li collego(anche motorini smontati dai comuni  vecchi scanner) direttamente alla scheda Arduino (un semplice schetc di poche righe senza librerie) ed il motore gira (ovviamente senza pretendere che faccia forza).

I pontiH se non ho capito male servono solo a tenere divisi i comandi alle bobine dalla potenza necessaria per fa girare il motore anche sotto sforzo.

Enry1995

ho sempre usato dei driver in cui puoi regolare la corrente che arriva al motore in modo da pilotarli senza bruciarli, inoltre hanno comunemente tre piedini di controllo, enable per abilitare o meno il driver e alimentare il motore anche se non gira, in questo modo mantiene la posizione anche sotto sforzo, dir che serve per la direzione in cui deve ruotare e step che appunto fa compiere al motore uno step, nel tuo driver per quanto ne so è un doppio ponte ad H, per pilotare due motori dc separati oppure un unico stepper, ma la logica di funzionamento è diversa, sul tuo (ma non avendolo mai usato non sono sicuro al 100%) hai 4 pin di controllo (IN1 e IN2 per una fase e IN3 e IN4 per l'altra fase) dove due indicano in quale verso deve ruotare il motore A e gli altri due in quale verso ruotare il motore B che tradotto per uno stepper dovresti pilotare in sequenza IN1 e IN3 (lasciando IN2 e IN4 a low) per far girare il motore in un senso e IN2 e IN4 per farlo girare al contrario, ma ripeto non ho mai usato quel tipo di driver per pilotare uno stepper qindi prendi con le pinze quanto ho scritto (se no poi viene uwefed e mi caz.....  :) :) :) )
Quello che dici nella seconda parte del post l'ho condivido pienamente, almeno da ciò che ho letto.... però penso che la libreria che utilizzo mi dovrebbe semplificare l'utilizzo, perchè dovrebbe contenere tutto ciò che serve per alimentare due poli per volta... ho modificato il programma, ora sembra andare meglio qui sotto lo poserò correttamente. Il problema ora è che il motore non gira al contrario....


Code: [Select]
#include <Stepper.h>

const int stepsPerRevolution = 200;  // Numero di passi del motore necessari per fare un giro

// Inizializziamo l'oggetto myStepper
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

int stepCount = 0;

void setup() {
 Serial.begin(9600);

}

void loop() {
  do
  {
 myStepper.step(stepCount); //Un passo in senso orario.
  delay(300);
 stepCount++;
  Serial.print("steps:");
 Serial.println(stepCount);
  } while (stepCount<100);

delay(5000);
 stepCount=0;

 do
  {
  
  myStepper.step(stepCount); //Un passo in senso orario.

 delay(300);
  Serial.print("-steps:");
 Serial.println(stepCount);
 stepCount--;
  } while (stepCount>-100);
 
}


avete qualche idea?

puoi linkarmi uno dei controller di cui parli, così caso mai proverò con uno di quelli....

Ciao e grazie

Enry1995

Forse dico una sciocchezza i no conosco queste schedine ma immagino siano un semplice ponteH più o meno elaborato.

Comunque sia i motori Passo Passo funzionano tutti allo stesso modo(quasi) devi solo azzeccare la sequenza giusta delle bobine.

Durante le MIE di prove li collego(anche motorini smontati dai comuni  vecchi scanner) direttamente alla scheda Arduino (un semplice schetc di poche righe senza librerie) ed il motore gira (ovviamente senza pretendere che faccia forza).

I pontiH se non ho capito male servono solo a tenere divisi i comandi alle bobine dalla potenza necessaria per fa girare il motore anche sotto sforzo.
ok capisco, il problema è che quello che ho in mente è abbastanza complesso e senza librerie diventa complicato oltre l'immaginabile ahahah oltretutto il motore che sto usando non si muove con solo 5v quindi l'idea di utilizzare un ponte ad h è corretta....

Enry1995

Ho analizzato meglio il motore, il problema sembra essere il fatto che tra un passo e l'altro non vengano alimentate tutte e 4 le fasi in modo da bloccarlo. Potete consigliarmi che driver acquistare per avere questa funzione?

-zef-

puoi linkarmi uno dei controller di cui parli, così caso mai proverò con uno di quelli....
per il motore che hai messo in apertura del thread un driver del genere va benissimo, hanno il trimmer per regolare la corrente e si pilotano con En, Dir e Step inoltre trovi un infinità di esempi per arduino in rete

Puso

scusa se replico, ma se vuoi bloccare il motore in posizione NON devi alimentare tutte le bobine, te ne basta 1 oppure 2 se vuoi una posizione intermedia(dipende dal motore che hai).

inoltre sei sicuro che la sequenza che hai dato sia giusta?

uwefed

Davo per scontato fosse un driver con L297 e L298, non era mia intenzione dare consigli sbagliati, che comunque non poteva di certo fare danni. Non essendo un driver con step e dir "forse" va anche configurato in modo diverso per essere usato con la libreria stepper, ma visto che non ho mai usato ne tale libreria ne tale tipo di driver evito di dare ulteriori consigli sbagliati  :smiley-confuse:  :-X
Sinceramente non ho ancora visto una schedina con il L297 e il L298. Sono integrati vecchi di 40 anni e oggigiorno si usano dei integrati con MOSFET come stadio di uscita che hanno molto meno perdite.

Enry1995

per il motore che hai messo in apertura del thread un driver del genere va benissimo, hanno il trimmer per regolare la corrente e si pilotano con En, Dir e Step inoltre trovi un infinità di esempi per arduino in rete
Ti ringrazio, proverò a controllare quello che fa al caso mio e vedrò quale acquistare ;)


scusa se replico, ma se vuoi bloccare il motore in posizione NON devi alimentare tutte le bobine, te ne basta 1 oppure 2 se vuoi una posizione intermedia(dipende dal motore che hai).

inoltre sei sicuro che la sequenza che hai dato sia giusta?
Code: [Select]
/*
* L298N pilotare un motore passo passo con Arduino
* In questo esempio vediamo come sfruttare la libreria Stepper
* al fine di controllare un motore passo passo
* Obbietivo : muovere ripetutamente il motore da 0 a 180 gradi e ritorno
* Nel post correlato viene mostrato come interfacciare Arduino
* ed il motore passo passo tramite il modulo L298N
*
* Autore  : Andrea Lombardo
* Web     : http://www.lombardoandrea.com
* Post    : http://bit.ly/L298N-ARDUINO-MOTOREPASSOPASSO
* Git     : https://github.com/AndreaLombardo/Arduino-L298N-Motore-Passo-Passo
*/

//includo l'apposita libreria per gestire i motori passo passo
#include <Stepper.h>

/*
* Informo il programma su quanti sono gli step impiegati
* dal mio motore per compiere un giro completo.
* In alcuni datasheet (come nel mio caso) non e' specificato il numero di step del motore
* viene tuttavia specificato il numerdo di gradi effettuato ad ogni step (Step angle).
* Avendo queste informazioni, basta dividere 360 per lo Step angle
* per ottenere il numero di step del motore.
* E' evidente che piu' alto e' il numero degli step, piu' accurato sara' il movimento del motore
*/
int static stepMotore = 200; //modificare il valore in base agli step del motore in possesso

//un giro completo e' composto da 360 gradi, ne deriva che per compiere 180 gradi il motore dovra' percorrere
//un numero di step pari ai suoi "stepMotore diviso 2"
int stepDaPercorrere = stepMotore/2;

//definisco i pin che controlleranno il motore, per convenzione ho usato i nomi dei connettori presenti sul modulo L298N
int static IN1 = 11;
int static IN2 = 10;
int static IN3 = 9;
int static IN4 = 8;

//Istanzio un oggetto Stepper che rappresentera' il mio motore
Stepper mioMotore(stepMotore, IN1, IN2, IN3, IN4);

void setup() {
 //imposto la velocita' del motore
 //prova a giocare con questo valore per vedere le reazioni del motore
 //ma fallo gradualmente per non fare incazzare il motore...
 mioMotore.setSpeed(2);
}

void loop() {

 //effettuo il movimento di andata
 mioMotore.step(stepDaPercorrere);

 //attendo 50 millisecondi
 delay(50);

 //il metodo step accetta valori negativi
 //effettuo il movimento di ritorno
 mioMotore.step(-stepDaPercorrere);
 
 //attendo altri 50 millisecondi
 delay(50);
}   


Ciao Puso, la sequenza che avevo dato prima era sbagliata, qui c'è quella corretta copiata da internet, però anche con questa il motore mi da gli stessi problemi

brunello22

Ma il motore lo hai collegato nella giusta sequenza

Connection:
 Black(A+), Green(A-), Red(B+), Blue(B-)


Su un morsetto : Nero e Verde
Sull'altro : Rosso e Blu

Enry1995

Ma il motore lo hai collegato nella giusta sequenza

Connection:
 Black(A+), Green(A-), Red(B+), Blue(B-)


Su un morsetto : Nero e Verde
Sull'altro : Rosso e Blu

Si ho controllato con il tester la resistenza Delle fasi e ho ricavato le due coppie di cavai che ho collegato su due morsetti diversi...
Ciao e grazie

-zef-

Sinceramente non ho ancora visto una schedina con il L297 e il L298. Sono integrati vecchi di 40 anni e oggigiorno si usano dei integrati con MOSFET come stadio di uscita che hanno molto meno perdite.

non ha 40 anni ma la mia prima scheda a tre assi che comprai quando ho costruito un piccolo pantografo cnc ha la coppia L297 e L298 come anche un meno giovane driver fatto da Nuova Elettronica il mitico kit LX1420... (e ancora funzionano bene entrambe) eh si gli anni passano  ::)

Puso

Code: [Select]

void loop() {

 mioMotore.step(stepDaPercorrere);
 delay(50);
 mioMotore.step(-stepDaPercorrere);
 delay(50);
}   

Non conosco la libreria ma provo a leggere il loop

-vai al passo successivo;
-aspetta 50 millisecondi;
-torna indietro di un passo;
-aspetta 50 millisecondi;

Se ho letto bene stai giocando a Ping Pong con 2 bobine invece che far girare il motore

Hai almeno una vaga idea di com'è fatto dentro il tuo motore passopasso???




Enry1995

Code: [Select]

void loop() {

 mioMotore.step(stepDaPercorrere);
 delay(50);
 mioMotore.step(-stepDaPercorrere);
 delay(50);
}  

Non conosco la libreria ma provo a leggere il loop

-vai al passo successivo;
-aspetta 50 millisecondi;
-torna indietro di un passo;
-aspetta 50 millisecondi;

Se ho letto bene stai giocando a Ping Pong con 2 bobine invece che far girare il motore

Hai almeno una vaga idea di com'è fatto dentro il tuo motore passopasso???




Ciao se leggi tutto il codice,  il programma gli dovrebbe far fare, 100 passi in senso orario e 100 in antiorario




#include <Stepper.h>


int static stepMotore = 200; //modificare il valore in base agli step del motore in possesso


//un giro completo e' composto da 360 gradi, ne deriva che per compiere 180 gradi il motore dovra' percorrere
//un numero di step pari ai suoi "stepMotore diviso 2"
int stepDaPercorrere = stepMotore/2;

//definisco i pin che controlleranno il motore, per convenzione ho usato i nomi dei connettori presenti sul modulo L298N
int static IN1 = 11;
int static IN2 = 10;
int static IN3 = 9;
int static IN4 = 8;

//Istanzio un oggetto Stepper che rappresentera' il mio motore
Stepper mioMotore(stepMotore, IN1, IN2, IN3, IN4);

void setup() {
 //imposto la velocita' del motore
 //prova a giocare con questo valore per vedere le reazioni del motore
 //ma fallo gradualmente per non fare incazzare il motore...
 mioMotore.setSpeed(2);
}

void loop() {

 //effettuo il movimento di andata
 mioMotore.step(stepDaPercorrere);

 //attendo 50 millisecondi
 delay(50);

 //il metodo step accetta valori negativi
 //effettuo il movimento di ritorno
 mioMotore.step(-stepDaPercorrere); //step da percorrere è uguale a 100
 
 //attendo altri 50 millisecondi
 delay(50);
}  

Ora ho provato a usare un altro alimentatore... Con questo il motore non si muove più casualmente. Però gira solo in un verso. Avete qualche idea?


Un'altra prova che mi viene in mente è di sostituire il modulo che uso per comandare il motore con quello consigliato da :

per il motore che hai messo in apertura del thread un driver del genere va benissimo, hanno il trimmer per regolare la corrente e si pilotano con En, Dir e Step inoltre trovi un infinità di esempi per arduino in rete

Go Up