Arduino Forum

International => Italiano => Software => Topic started by: Enry1995 on Feb 05, 2018, 08:22 pm

Title: Programmare un motore passo passo
Post by: Enry1995 on Feb 05, 2018, 08:22 pm
Buona sera a tutti,
ho acquistato da amazon questi stepper:

https://www.amazon.it/gp/product/B06XRFCP3X/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1 (https://www.amazon.it/gp/product/B06XRFCP3X/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1)

con il driver L298N.

ho seguito vari guide online come questa (https://www.lombardoandrea.com/l298n-motore-passo-passo-arduino/) dove si comanda il motore indicandone la velocità. Il mio sotto i 40 rpm non gira in modo regolare... e oltre nemmeno si muove.

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 = 96; //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(40);
}

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);






poi ho letto quest'altra guida (https://ardulab.it/2016/11/05/pilotare-un-motore-passo-passo-arduino/) che fa muovere il motore indicando solo i passi, che per la mia applicazione sarebbe più utile... Ma il motore non si comporta nel modo giusto, prima si muove a destra poi a sinistra senza alcun senso.


Code: [Select]


#include <Stepper.h>

const int stepsPerRevolution = 4096;  // 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() {
 myStepper.step(1); //Un passo in senso orario.
 Serial.print("steps:");
 Serial.println(stepCount);
 stepCount++;
 delay(500);
}[/ CODE]





questo è lo schema dei collegamenti che ho utilizzato:

(https://i0.wp.com/www.lombardoandrea.com/wp-content/uploads/Arduino_L298N_Motore_Passo_Passo_bb.png)

Quale sarebbe una possibile soluzione per farlo ruotare in modo regolare di quanti step voglio?

Grazie a tutti buonaserata.
Title: Re: Programmare un motore passo passo
Post by: gpb01 on Feb 05, 2018, 09:14 pm
Cortesemente correggi il tuo post sostituendo i tag QUOTE con i tag CODE, grazie.

Guglielmo
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 06, 2018, 01:41 am
ma sei sicuro che dal driver la presa dei 5V sono in uscita e non in entrata? Inoltre se non sbaglio da Vin sulla UNO ci devi far arrivare almeno 7 volt
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 07:15 am
ma sei sicuro che dal driver la presa dei 5V sono in uscita e non in entrata? Inoltre se non sbaglio da Vin sulla UNO ci devi far arrivare almeno 7 volt
(https://preview.ibb.co/j8mAix/IMG_20180206_071146.png)
Quindi diresti di staccare l'arduino dai 5v e alimentarlo da USB?
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 07:32 am
(https://preview.ibb.co/fgcVGH/IMG_20180206_072933.jpg)

Questo sarebbe la foto della struttura che deve muovere che ha un peso inrisorrio... Ma il problema sembra proprio essere che i motori non hanno forza, può essere? Ho svincolato i 5v come mi è stato consigliato e sembra andare un pelino meglio ma non abbastanza
Title: Re: Programmare un motore passo passo
Post by: uwefed on Feb 06, 2018, 07:51 am
Quei motori non hanno tanta forza.

Perche non modifichi quel pezzo e metti un contropeso per far forzare il motore di meno?
Stai usando una rampa di accelerazione?

Ciao Uwe
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 06, 2018, 11:03 am
Vedi che il driver deve essere anche alimentato a 5 volt, per la forza controlla se sul driver non ci sia un trimmer che regola la corrente al motore, se troppo bassa il motore non ha forza, ma attento che se troppo alta scalda come una stufa per poi andare in fumo.
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 12:10 pm
Quei motori non hanno tanta forza.

Perche non modifichi quel pezzo e metti un contropeso per far forzare il motore di meno?
Stai usando una rampa di accelerazione?

Ciao Uwe
Un contrappeso? Come lo metteresti? L'asse superiore quello che si inclina a dx/sx  e basta fatica anche lui... Oltretutto ha veramente pochissimo peso.. per le rampe, momentaneamente non le ho utilizzate, perché volevo far muovere il motore di uno step a lavolta..

Title: Re: Programmare un motore passo passo
Post by: brunello22 on Feb 06, 2018, 12:13 pm
Quote
Ma il motore non si comporta nel modo giusto, prima si muove a destra poi a sinistra senza alcun senso.
Prova a invertire due fili di una fase che vanno al motore
Title: Re: Programmare un motore passo passo
Post by: uwefed on Feb 06, 2018, 12:16 pm
Vedi che il driver deve essere anche alimentato a 5 volt, per la forza controlla se sul driver non ci sia un trimmer che regola la corrente al motore, se troppo bassa il motore non ha forza, ma attento che se troppo alta scalda come una stufa per poi andare in fumo.
zef per favore non dare consigli sbagliati.
Il L298 (senza L297 come in questo caso) é un driver di tensione e percui non ci sono impostazioni di corrente.

Ciao Uwe
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 12:32 pm
Vedi che il driver deve essere anche alimentato a 5 volt, per la forza controlla se sul driver non ci sia un trimmer che regola la corrente al motore, se troppo bassa il motore non ha forza, ma attento che se troppo alta scalda come una stufa per poi andare in fumo.

Ciao, quindi mi consigli di alimentarlo comunque magari con una USB ?  Ecco la foto del driver:

(https://preview.ibb.co/cm99tx/IMG_20180206_121916.jpg) (https://ibb.co/bO0FYx)

(https://preview.ibb.co/evdzRH/IMG_20180206_121924.jpg) (https://ibb.co/jKhR6H)

Non vedo trimmer però ... Grazie a tutti per l'aiuto che mi state dando


Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 12:40 pm
zef per favore non dare consigli sbagliati.
Il L298 (senza L297 come in questo caso) é un driver di tensione e percui non ci sono impostazioni di corrente.

Ciao Uwe

Il discorso che deve essere alimentato a 5v sempre è giusto? Faccio una prova?
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 06, 2018, 03:34 pm
zef per favore non dare consigli sbagliati.
Il L298 (senza L297 come in questo caso) é un driver di tensione e percui non ci sono impostazioni di corrente.

Ciao Uwe

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 
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 05:59 pm
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 
Puoi spiegarmi meglio? Che differenza c'è tra il mio driver piuttosto che l'altro? Cambia solo la regolazione della corrente?
Come vedi il tuo consiglio mi ha aperto un mondo ahaha e anche se è stato sbagliato mi a portato a conoscenza di cose che non sapevo e che magari sono utili per la mia applicazione
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 06:59 pm
Cortesemente correggi il tuo post sostituendo i tag QUOTE con i tag CODE, grazie.

Guglielmo
Puoi spiegarmi meglio? Che differenza c'è tra il mio driver piuttosto che l'altro? Cambia solo la regolazione della corrente?
Come vedi il tuo consiglio mi ha aperto un mondo ahaha e anche se è stato sbagliato mi a portato a conoscenza di cose che non sapevo e che magari sono utili per la mia applicazione
zef per favore non dare consigli sbagliati.
Il L298 (senza L297 come in questo caso) é un driver di tensione e percui non ci sono impostazioni di corrente.

Ciao Uwe

Buona sera, ho delle novità, ho creato un video che mostra come si comporta il motore quando viene gestito da questo software:

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

const int stepsPerRevolution = 4096;  // 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);
 myStepper.setSpeed(10);
}

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

delay(5000);

 do
  {
  myStepper.step(stepCount); //Un passo in senso orario.
 Serial.print("-steps:");
 Serial.println(stepCount);
 stepCount--;
 delay(100);
  } while (stepCount>=0);
 
}


il programma "teoricamente" funziona, dal monitor seriale vedo la variabile stepcount crescere e poi scendere. ma il motore si muove in modo irregolare e non segue i passi che si vedono sul monitor seriale... 

Ho provato sia ad invertire uno dei due cavi che alimentano una bobina del motore, sia ad alimentare esternamente con 5v di un carica telefono il L298N .... Entrambe le prove non mi hanno portato a nessun miglioramento anzi, invertendo le fasi il motore si muove in modo peggiore. Ho scoperto che i +5v dell'integrato erogano e non assorbono tensione ( l'ho dedotto dal led di alimentazione del carica telefono, acceso anche se collegato solo dalla parte dell'uscita).
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 07:14 pm
https://streamable.com/xzcc7 (http://Questo è il link del video che ho fatto)
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 06, 2018, 07:16 pm
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.....  :) :) :) )
Title: Re: Programmare un motore passo passo
Post by: Puso on Feb 06, 2018, 07:48 pm
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.
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 07:53 pm
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
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 08:14 pm
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....
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 08:23 pm
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?
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 06, 2018, 08:27 pm
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 (https://www.amazon.it/s/ref=nb_sb_noss?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords=driver+A4988) 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
Title: Re: Programmare un motore passo passo
Post by: Puso on Feb 06, 2018, 08:35 pm
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?
Title: Re: Programmare un motore passo passo
Post by: uwefed on Feb 06, 2018, 10:09 pm
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.
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 06, 2018, 10:25 pm
per il motore che hai messo in apertura del thread un driver del genere (https://www.amazon.it/s/ref=nb_sb_noss?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords=driver+A4988) 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
Title: Re: Programmare un motore passo passo
Post by: brunello22 on Feb 07, 2018, 12:01 am
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
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 07, 2018, 07:09 am
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
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 07, 2018, 09:57 am
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  ::)
Title: Re: Programmare un motore passo passo
Post by: Puso on Feb 07, 2018, 06:17 pm
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???



Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 07, 2018, 07:25 pm
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 (https://www.amazon.it/s/ref=nb_sb_noss?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords=driver+A4988) 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
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 08, 2018, 01:34 am
Vorrei ribadire il fatto che non ho mai usato la libreria stepper, i driver del link che ti ho inserito non so se sono compatibili con tale libreria, vista la semplicità nel pilotarli preferisco fare tutto dal programma che scrivo, informati prima di comprarli  ;) 
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 14, 2018, 10:26 pm
Vedi che il driver deve essere anche alimentato a 5 volt, per la forza controlla se sul driver non ci sia un trimmer che regola la corrente al motore, se troppo bassa il motore non ha forza, ma attento che se troppo alta scalda come una stufa per poi andare in fumo.

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???




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

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.

Ho acquistato i driver che mi avete indicato (A4988) e li ho collegati in questo modo






(https://i1.wp.com/www.lombardoandrea.com/wp-content/uploads/Arduino-A4988-Base_bb.png?resize=576%2C1024)

(Avendo 2 motori ho collegato 2 driver allo stesso modo variando solo i PIN dell'arduino).

Poi ho collegato un pulsante in questo modo (senza mettere il LED)

(http://arduinotutorial.altervista.org/wp-content/uploads/2011/03/Immagine1.jpg)

Utilizzando questo programma che muove soltanto un motore quest'ultimo fa quello che desidero in modo corretto.

Code: [Select]
//Definizione dei PIN
const int pulsante = 13;
const int pinDir = 2;
const int pinStep = 3;
const int analog = A5;


int passi = 0;
int valore1 = 10;
int valore2 = 0;
int INDIETRO=0;
int ciclo= 0;


const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 10000 ; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
 
void setup() {
  Serial.begin(9600);
  //inizializzo i PIN come OUTPUT
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(pulsante, INPUT);
 


 
 
}
void loop() { 


  if (digitalRead(pulsante)==HIGH) ciclo=ciclo+1;
 
 
  delay(20);
 
 
  if (ciclo == 1) {
 
 
  //definiamo la direzione del motore
  digitalWrite(pinDir, HIGH);
 
  //esegue un giro completo in un senso
  for (int x = 0; x <= numStepMotore; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
    delay(50);
     valore2 = analogRead(analog);
      Serial.print("valore2 = " );
  Serial.println(valore2);
     delay(50);
   if( valore2>valore1)
   
   {
    valore1=valore2; passi=x;
   }
   
     Serial.print("x = " );
    Serial.print(x);
 
     Serial.print("");
     
  Serial.print("valore1 = " );
  Serial.println(valore1);
  Serial.print("passi = " );
  Serial.println(passi);   
   
  }
 
 INDIETRO = 200-passi;
 
  Serial.print("**************");
  Serial.print("valore1 = " );
  Serial.println(valore1);
  Serial.print("passi = " );
  Serial.println(passi);   
  Serial.print("INDIETRO = " );
  Serial.println(INDIETRO);   
  //aspetto 2 secondi
  delay(3000);
 
 
  //cambio la direzione di marcia
  digitalWrite(pinDir, LOW);


 
  //rieseguo un altro giro completo nel senso opposto
  for (int y = 0; y <= INDIETRO; y++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  }
 
  //aspetto altri 2 secondi
  delay(10);
  ciclo=0;
  }

 else
 {
  delay(10);
 
  }

}


Poi ho voluto aggiungere anche il movimento di un secondo motore nella funzione if quando il pulsante viene premuto

Code: [Select]
//Definizione dei PIN
const int pulsante = 13;
const int pinDir = 2;
const int pinStep = 3;
const int analog = A5;

const int pinDirV = 4;
const int pinStepV = 5;
int passiV = 0;
int valore1V = 10;
int valore2V = 0;
int indietroV = 0;
int INDIETROV = 0;

int passi = 0;
int valore1 = 10;
int valore2 = 0;
int INDIETRO=0;
int ciclo= 0;

const int numStepMotoreV = 40;
const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 30000 ; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
 const long velocita2 = 20000 ; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
void setup() {
  Serial.begin(9600);
  //inizializzo i PIN come OUTPUT
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(pulsante, INPUT);
 


 
 
}
void loop() { 


  if (digitalRead(pulsante)==HIGH) ciclo=ciclo+1;
 
  Serial.print("ciclo= " );
  Serial.println(ciclo);
  delay(1000);
 
 
  if (ciclo == 1) {

 digitalWrite(pinDirV, HIGH);
 Serial.print("ciclo= " );
  Serial.println(ciclo);
delay(100);

     for (int z = 0; z <= numStepMotoreV; z++) {
    digitalWrite(pinStepV, HIGH);
    delayMicroseconds(velocita2);
    digitalWrite(pinStepV, LOW);
    delayMicroseconds(velocita2);
  }
 
  delay(20000);
 
  //definiamo la direzione del motore
  digitalWrite(pinDir, HIGH);
 
  //esegue un giro completo in un senso
  for (int x = 0; x <= numStepMotore; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  delay(1);
     valore2 = analogRead(analog);
      Serial.print("valore2 = " );
  Serial.println(valore2);
     delay(1);
   if( valore2>valore1)
   
   {
    valore1=valore2; passi=x;
   }
   
     Serial.print("x = " );
    Serial.print(x);
 
     Serial.print("");
     
  Serial.print("valore1 = " );
  Serial.println(valore1);
  Serial.print("passi = " );
  Serial.println(passi);   
   
  }
 
 INDIETRO = 200-passi;
 
  Serial.print("**************");
  Serial.print("valore1 = " );
  Serial.println(valore1);
  Serial.print("passi = " );
  Serial.println(passi);   
  Serial.print("INDIETRO = " );
  Serial.println(INDIETRO);   
  //aspetto 2 secondi
  delay(3000);
 
 
  //cambio la direzione di marcia
  digitalWrite(pinDir, LOW);


 
  //rieseguo un altro giro completo nel senso opposto
  for (int y = 0; y <= INDIETRO; y++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  }
 
  //aspetto altri 2 secondi
  delay(10);
  ciclo=0;
  }

 else
 {
  delay(10);
 
  }

}


In questo caso se aspetto qualche secondo senza premere il pulsante il secondo motore si muove da solo a caso. Se invce lo premo il secondo motore non si muove e sembra che il movimento che dovrebbe fare il secondo motore venga invece effettuato dal primo.

Chi può aiutarmi? Grazie in anticipo.
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 15, 2018, 09:21 am
ho dato solo un'occhiata veloce e quindi non so se corretto ma dove hai scritto INDIETRO = 200-passi; se passi è maggiore di 200, INDIETRO sarà un numero negativo e quindi nel for (int y = 0; y <= INDIETRO; y++)   Y essendo 0 non sarà minore di INDIETRO (che è un numero negativo) e il ciclo for non farà nulla.
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 15, 2018, 01:06 pm
ho dato solo un'occhiata veloce e quindi non so se corretto ma dove hai scritto INDIETRO = 200-passi; se passi è maggiore di 200, INDIETRO sarà un numero negativo e quindi nel for (int y = 0; y <= INDIETRO; y++)   Y essendo 0 non sarà minore di INDIETRO (che è un numero negativo) e il ciclo for non farà nulla.
Ho aggiunto l'if come hai consigliato=

Code: [Select]
//Definizione dei PIN
const int pulsante = 13;
const int pinDir = 2;
const int pinStep = 3;
const int analog = A5;

const int pinDirV = 4;
const int pinStepV = 5;
int passiV = 0;
int valore1V = 10;
int valore2V = 0;
int indietroV = 0;
int INDIETROV = 0;

int passi = 0;
int valore1 = 10;
int valore2 = 0;
int INDIETRO=0;
int ciclo= 0;

const int numStepMotoreV = 40;
const int numStepMotore = 200; //E' il numero di step per rotazione del motore (potrebbe differire in base al modello)
const long velocita = 30000 ; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
 const long velocita2 = 20000 ; //Si tratta di microsecondi tra un impulso e l'altro sul pin STEP
void setup() {
  Serial.begin(9600);
  //inizializzo i PIN come OUTPUT
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(pulsante, INPUT);
 


 
 
}
void loop() { 


  if (digitalRead(pulsante)==HIGH) ciclo=ciclo+1;
 
  Serial.print("ciclo= " );
  Serial.println(ciclo);
  delay(100);
 
 
  if (ciclo == 1) {

 digitalWrite(pinDirV, HIGH);
 Serial.print("ciclo= " );
  Serial.println(ciclo);
delay(20);

     for (int z = 0; z <= numStepMotoreV; z++) {
    digitalWrite(pinStepV, HIGH);
    delayMicroseconds(velocita2);
    digitalWrite(pinStepV, LOW);
    delayMicroseconds(velocita2);
  }
 
  delay(20);
 
  //definiamo la direzione del motore
  digitalWrite(pinDir, HIGH);
 
  //esegue un giro completo in un senso
  for (int x = 0; x <= numStepMotore; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  delay(1);
     valore2 = analogRead(analog);
      Serial.print("valore2 = " );
  Serial.println(valore2);
     delay(1);
   if( valore2>valore1)
   
   {
    valore1=valore2; passi=x;
   }
   
     Serial.print("x = " );
    Serial.print(x);
 
     Serial.print("");
     
  Serial.print("valore1 = " );
  Serial.println(valore1);
  Serial.print("passi = " );
  Serial.println(passi);   
   
  }
 
 INDIETRO = 200-passi;

 if (INDIETRO<=0){

  INDIETRO=0;
 }
 
  Serial.print("**************");
  Serial.print("valore1 = " );
  Serial.println(valore1);
  Serial.print("passi = " );
  Serial.println(passi);   
  Serial.print("INDIETRO = " );
  Serial.println(INDIETRO);   
  //aspetto 2 secondi
  delay(3000);
 
 
  //cambio la direzione di marcia
  digitalWrite(pinDir, LOW);


 
  //rieseguo un altro giro completo nel senso opposto
  for (int y = 0; y <= INDIETRO; y++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocita);
  }
 
  //aspetto altri 2 secondi
  delay(10);
  ciclo=0;
  }

 else
 {
  delay(10);
 
  }

}





In questo modo=


 INDIETRO = 200-passi;

 if (INDIETRO<=0){

  INDIETRO=0;
 }
 
  Serial.print("**************");
  Serial.print("valore1 = " );
  Serial.println(valore1);
  Serial.print("passi = " );
  Serial.println(passi);   
  Serial.print("INDIETRO = " );
  Serial.println(INDIETRO);   
  //aspetto 2 secondi
  delay(3000);
 


La mia tesina è composta da 2 motori che devono muoversi solamente dopo aver premuto il pulsante, prima quello dell'asse orizzontale (un giro completo dove ricerca il sole seguito da un ritorno verso la fonte della luce), poi quello verticale (partendo da una posizione di 45° deve salire di 15° e poi scendere di 30°, per poi tornare dalla fonte di luce). Il mio problema è che il motore dell'asse verticale si muove casualmente dopo qualche secondo che alimento il circuito, senza che io prema il pulsante.
Per il momento ho fatto il programma della parte orizzontale completamente, mentre della parte verticale solo il primo movimento che porta il pannello a 45°.
Come posso risolvere?


PS:Le foto le trovate nei post precedenti.

Grazie mille in anticipo
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 15, 2018, 03:26 pm
ho dato una lettura con più calma, ci sono cose che non capisco se errori o voluti, intanto controllando meglio mi sono reso conto di aver sbagliato prima in quanto passi non potrà mai avere un valore maggiore di 200 visto che numStepMotore vale massimo 200.... ma questo mi porta a non capire il senso di fare ad esempio un tot di step in una direzione e poi assegnare ad indietro i rimanenti per arrivare a 200, mi spiego meglio (se ci riesco  :smiley-confuse: ) supponiamo che in passi = x; passi diventi 50, poi nel calcolo INDIETRO = 200 - passi; INDIETRO diventa 150 quindi avrai fatto 200 passi in avanti in quanto la for viene comunque eseguita per tutti i 200 passi di numStepMotore.
Altra cosa, sicuro che queste istruzioni sortiscano l'effetto voluto?

Code: [Select]
if ( valore2 > valore1)

      {
        valore1 = valore2; passi = x;
      }


ho come l'impressione che alla fine passi ti vale 200 e di conseguenza INDIETRO sarà uguale a 0.

I vari print di controllo riportano valori che ti aspetti?

il pulsante prova a metterlo in modo che la resistenza vada al positivo e il contatto chiuda sul negativo e invece dello stato high leggi se è low.
Title: Re: Programmare un motore passo passo
Post by: Enry1995 on Feb 15, 2018, 06:13 pm
ho dato una lettura con più calma, ci sono cose che non capisco se errori o voluti, intanto controllando meglio mi sono reso conto di aver sbagliato prima in quanto passi non potrà mai avere un valore maggiore di 200 visto che numStepMotore vale massimo 200.... ma questo mi porta a non capire il senso di fare ad esempio un tot di step in una direzione e poi assegnare ad indietro i rimanenti per arrivare a 200, mi spiego meglio (se ci riesco  :smiley-confuse: ) supponiamo che in passi = x; passi diventi 50, poi nel calcolo INDIETRO = 200 - passi; INDIETRO diventa 150 quindi avrai fatto 200 passi in avanti in quanto la for viene comunque eseguita per tutti i 200 passi di numStepMotore.
Altra cosa, sicuro che queste istruzioni sortiscano l'effetto voluto?

Code: [Select]
if ( valore2 > valore1)

      {
        valore1 = valore2; passi = x;
      }


ho come l'impressione che alla fine passi ti vale 200 e di conseguenza INDIETRO sarà uguale a 0.

I vari print di controllo riportano valori che ti aspetti?

il pulsante prova a metterlo in modo che la resistenza vada al positivo e il contatto chiuda sul negativo e invece dello stato high leggi se è low.
La parte di cui parli te funziona e i parametri che leggo sono corretti. Per evitare avvolgimenti ho deciso di far fare al motore orizzontale un giro completo da una parte e il ritorno dall'altra. Il pulsate (senza aggiungere il motore verticale) funziona bene, anche controllando il monitor seriale. la parte problematica è questa

Code: [Select]
 if (digitalRead(pulsante)==HIGH) ciclo=ciclo+1;
  
  Serial.print("ciclo= " );
  Serial.println(ciclo);
  delay(100);
  
  
  if (ciclo == 1) {

 digitalWrite(pinDirV, HIGH);
 Serial.print("ciclo= " );
  Serial.println(ciclo);
delay(20);

     for (int z = 0; z <= numStepMotoreV; z++) {
    digitalWrite(pinStepV, HIGH);
    delayMicroseconds(velocita2);
    digitalWrite(pinStepV, LOW);
    delayMicroseconds(velocita2);
  }
  
  delay(20);




Quella che riguarda appunto il motore verticale, che reagisce all'alimentazione muovendosi in modo casuale. La parte che hai indicato tu (quella con i 200 numStepMotore) riguarda invece il motore orizzontale, che funziona correttamente.
Title: Re: Programmare un motore passo passo
Post by: -zef- on Feb 16, 2018, 12:09 pm
un pulsante è meglio tenerlo in pullup e leggerne il valore quando è low, dal codice non vedo errori percui venga eseguito in modo casuale quindi presumo che il problema sia il pulsante che capta un qualche disturbo e lo interpreta come un segnale high, altro non saprei le mie conoscenze sono molto limitate  :smiley-confuse: