Programmare un motore passo passo

Buona sera a tutti,
ho acquistato da amazon questi stepper:

con il driver L298N.

ho seguito vari guide online come questa dove si comanda il motore indicandone la velocità. Il mio sotto i 40 rpm non gira in modo regolare... e oltre nemmeno si muove.

/*
* 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 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.

#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:

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

Grazie a tutti buonaserata.

Cortesemente correggi il tuo post sostituendo i tag QUOTE con i tag CODE, grazie.

Guglielmo

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

-zef-:
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


Quindi diresti di staccare l'arduino dai 5v e alimentarlo da USB?

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

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

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.

uwefed:
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..

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

-zef-:
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

-zef-:
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:

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

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

uwefed:
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 :confused: :-X

-zef-:
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 :confused: :-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

gpb01:
Cortesemente correggi il tuo post sostituendo i tag QUOTE con i tag CODE, grazie.

Guglielmo

Enry1995:
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

uwefed:
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:

#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).

[https://streamable.com/xzcc7](http://Questo è il link del video che ho fatto)

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..... :slight_smile: :slight_smile: :slight_smile: )

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.

-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..... :slight_smile: :slight_smile: :slight_smile: )

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

#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

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.

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