Vai al contenuto
PLC Forum


Arduino e motore stepper


attiliovolpe

Messaggi consigliati

Buongiorno, ho collegato un motore stepper da 200 step giro ad Arduino mega 2560 tramite il driver Allegro A4988, il codice scritto è il seguente:

 

                                    // definizione dei pin 
const int stepPin = 2; 
const int dirPin = 3; 
 
void setup() {
                                    // definizione di pin come uscite
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
}
void loop() {
  digitalWrite(dirPin,LOW);         // setto a low il pin direction su A4988 (potrei lasciarlo scollegato, invertirei la rotazione)
                                    // faccio 200 step per avere un giro completo
  for(int x = 0; x <=199; x++) 
  {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(500); 
    
  }
 delay(1000);                       // pausa di un secondo

Ovviamente il codice è pubblicato su vari siti che riportano esempi di utilizzo del driver Allegro, come scritto nei commenti il motore dovrebbe fare 200 step per avere un giro, ma così non è.

Infatti ho settato 199 anzichè 200 e secondo i ritardi impostati ho un giro esatto, altrimenti con 200 su ogni giro il motore va di un paio di step (ad occhio) avanti, fa cioè un giro e due step; ho provato anche a modificare i valori di delay, ma la combinazione giusta di valori per avere un giro è 199 e 500.

Essendo comunque il motore da 200 step/giro, perchè devo impostare 199 per avere il giro esatto?

 

 

Link al commento
Condividi su altri siti


Perchè partendo da 0 e contando sino a 199 sono esattamente 200 impulsi

 

O scrivi

for(int x = 0; x <200; x++)
                       

Oppure for (int x = 1; x<= 200; x++)

Link al commento
Condividi su altri siti

Ok grazie.

Adesso sapendo che il motore da un giro con 200 impulsi, passo al sensore a forcella ed al disco encoder.

Parliamo di tacche disposte su una sola fila, quindi per adesso vorrei definire la risoluzione del disco, e leggere la velocità.

Alimento il sensore a forcella dai 5V di Arduino o da alimentatore separato? 

Provando il sensore con un pezzo di carta, quando inserisco il foglio il sensore va a 0, quando lo rimuovo ho 4,80V (tra uscita e massa); montando il disco sul motore, gli impulsi sono veloci e leggo poco più di 2V quando il segnale va a 1.

Qualche suggerimento per leggere il treno di impulsi? (Dal monitor seriale, ad una prima prova, leggo continuamente a 0 l'ingresso).

 

Link al commento
Condividi su altri siti

Se non hai un oscilloscopio non vedi niente. Puoi provare a ruotare a mano il disco; forse con pazienza certosina riesci a tenere stabile l'arnese su uno stato di "1" per misurare l'auscita.

Comunque i dati che hai letto con il foglio di carta sono congrui.

Puoi usare il +5v di arduino per alimentare la forcella, verifica solamente che la corrente per il diodo illuminatore sia limitata dal resistore adatto; idem per il carico di collettore del fototransistor. A meno che la forcella abbia gia a bordo tutto quanto.

Link al commento
Condividi su altri siti

Buongiorno Livio, la forcella è su un piccolo stampato  ed ha un condensatore ed una resistenza; ho un oscilloscopio, è un poscope, non il massimo ma adatto ad analizzare questo tipo di segnali.

Link al commento
Condividi su altri siti

Dunque, avendo procurato il service manual della stampante posso dire che il sensore che voglio utilizzare va alimentato a 3,3V, ha due canali ed i due stati HIGH e LOW sono rispettivamente 3,2V e 0,4V, ha una risoluzione di 180 linee per pollice, LPI.

Il sensore funziona, adesso ho fatto un pò di prove con oscilloscopio e poi con Arduino, il disco ottico l'ho fatto io con un disco di plastica ed un solo foro, quindi un impulso per giro, praticamente cosa bella settando l'interrupt come CHANGE leggo ogni variazione di stato al passaggio del foro nella forcella, settando l'interrupt come RISING, sul fronte di salita, leggo il passaggio solo ruotando il disco in senso orario, settando invece l'interrupt come FALLING, fronte di discesa, leggo gli impulsi solo in senso antiorario.

Non ho ancora idea di come possa essere fatto, magari quando userò il suo disco ottico trasparente con le tacche sarà diverso ma attualmente mi piace molto poter discriminare il senso di rotazione con un solo canale.

Link al commento
Condividi su altri siti

Mi sembra strano perchè indipendentemente dal senso di rotazione hai sempre un fronte di salita ed uno di discesa, quindi l'intervento dell'interrupt deve essere indipendente dal senso di rotazione.

Verifica bene, anche con l'oscilloscopio, come è fatto questo impulso.

Link al commento
Condividi su altri siti

Credo che si tratti di una coincidenza a favore , dipendente dallo stato di partenza ; non riesco a capire come un solo canale riesca a determinare il senso....

Link al commento
Condividi su altri siti

L'onda è quadra, anche io non mi spiego come possa essere così, è ovvio che i fronti del segnale sono uguali in entrambe le direzioni, posso dirvi che i canali sono comunque due all'interno del sensore, poi magari col suo disco di materiale opaco con le tacche fatte come devono essere, le cose cambino, voglio dire passando un disco in plastica con un foro abbastanza ampio rispetto al disco  "vero", magari la luce investe il fototransistor in maniera diversa e accade così...

Farò sapere, se resta così è una figata!!!

Link al commento
Condividi su altri siti

Quote

Farò sapere, se resta così è una figata!!!

 

No! Se resta così è molto inaffidabile.:(

 

Visto che hai acquistato un oscilloscopio controlla bene la forma del segnale che vai ad applicare all'interrutp.

Se il segnale ha un fronte di salita deve avere necessariamente anche un fronte di discesa e viceversa. Quindi in un senso avrai prima la salita e poi la discesa, mentre nell'altro sarà l'esatto contrario. Comunque giri il disco l'interrupt deve essere attivato su qualsiasi fronte in modo indipendente dal senso di rotazione.

 

Quote

....settando l'interrupt come CHANGE leggo ogni variazione di stato al passaggio del foro nella forcella, ....

 

Dovresti avere 2 interruzioni per rotazione.

Se non è così controlla bene i tempi di esecuzione, l'eventuale presenza di un'istruzione di blocco interrupt e la successiva riabilitazione.

Link al commento
Condividi su altri siti

Ho fatto qualche prova, con il suo disco legge il cambiamento di stato ad ogni tacca, secondo quanto già detto il sensore ha una risoluzione di 180 LPI, il numero di tacche per giro del disco in dotazione ancora non lo ho verificato.

Resta il fatto del particolare modo della lettura (fronti salita e discesa) che si verificava ruotando manualmente il disco in plastica con il foro.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...