Controllare dei driver stepper direttamente da un Arduino

Sezione riservata ai sofware sviluppati in proprio
Rispondi
Junior73
God
God
Messaggi: 3614
Iscritto il: lunedì 14 aprile 2014, 10:36
Località: Perugia

Controllare dei driver stepper direttamente da un Arduino

Messaggio da Junior73 » martedì 28 luglio 2015, 19:35

Topic separato da questo: https://www.cncitalia.net/forum/viewtopi ... 01#p560601

Intanto che preparo i collegamenti per l'uso del Driver con la BB posto uno semplice script per Arduino per poter comandare un motorestepper di un n numero di giri. Ho usato delay normale e non delaymicroseconds e per comodità il led che si accende .....chiaramente va cambiato . L'idea era quella di usare il reset come start del motore passo passo , fargli compiere un numero x di giri in una sola direzione e poi stop fino alla prossima pressione del reset. Mi serve per la pompa peristaltica ma potrebbe adattarsi ad altri usi.
Posso ipotizzare (perdonate le cavolate) che ad ogni carico di tensione di 5v del pin 8 sullo step della Tb6560 corrisponda un passo del motore in caso la TB6560 lavori full step? E che quindi 200 cicli di tensione del pin 8 corrispondono ad un giro completo del motore?

/*
Stepper Giro
*/

int Giri = 0;
void setup() {

pinMode(8, OUTPUT);
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(8, HIGH);
digitalWrite(13, HIGH);
delay(300);
digitalWrite(8, LOW);
digitalWrite(13, LOW);
delay(100);
Giri = Giri + 1;
if (Giri == 200)
{
Giri = 0;
while(1);
}
else
{
delay(1);
}
}

Saluti
Ultima modifica di walgri il sabato 1 agosto 2015, 0:22, modificato 1 volta in totale.
Motivazione: Divisione dei topic

Avatar utente
walgri
God
God
Messaggi: 4735
Iscritto il: giovedì 13 gennaio 2011, 18:37
Località: Cagliari

Re: Consigli vari prima di iniziare

Messaggio da walgri » mercoledì 29 luglio 2015, 11:24

@Junior ti consiglio di indentare il tuo codice, ne guadagnerai tantissimo in leggibilità, e per comodita di lettura nel forum, mettilo tra i tag Code, come in questo caso:

Codice: Seleziona tutto

/*
   Stepper Giro
 */

int Giri = 0;
void setup() {

    pinMode(8, OUTPUT);
    pinMode(13, OUTPUT);
}

void loop() {
    digitalWrite(8, HIGH);
    digitalWrite(13, HIGH);
    delay(300);
    digitalWrite(8, LOW);
    digitalWrite(13, LOW);
    delay(100);
    Giri = Giri + 1;
    if (Giri == 200)
    {
        Giri = 0;
        while(1);
    }
    else
    {
        delay(1);
    }
}
(Non ho controllato il codice, l'ho solo riformattato - quella while(1) dentro quell'if mi suona come loop infinito)

Edit: In generale io preferisco lo stile K&R: http://jhanc.altervista.org/jargon/I/indent-style.html
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

Junior73
God
God
Messaggi: 3614
Iscritto il: lunedì 14 aprile 2014, 10:36
Località: Perugia

Re: Consigli vari prima di iniziare

Messaggio da Junior73 » mercoledì 29 luglio 2015, 16:57

Ciao Walgri è talmente semplice che non ho pensato di fargli nulla poichè è da cambiare e soprattutto verificare. Ho messo qualche commento per coloro che magari non conoscono niente di programmazione Arduino o più in generale .
Volevo chiedere conferme prima di collegare il tutto :

-Se collego il pin 8 di Arduino al Clk+ e il Clk- a Gnd l'alternanza di 5v generati farà girare il motore?
-I Cw+ Cw- della direzione come pure Enable + e - possono rimanere entrambi scollegati?
-Settando a 3 ampere la corrente della Tb6560 con un motore da 3 ampere rischio di surriscaldare il chip ? Meglio che scenda tipo ad 1,6 ampere?

Codice: Seleziona tutto

/*
 Stepper Giro
 */



int Passi = 0;//Dichiaro la variabile Passi con un valore di zero
void setup() {

      pinMode(8, OUTPUT);//Pin 8 di Arduino come uscita 5v verso il CLK+ della Tb6560 per generare il passo
      pinMode(13, OUTPUT);//Pin 13 Led della Scheda Arduino come uscita
}

void loop() {
      digitalWrite(8, HIGH);//5 volt sul pin 8
      digitalWrite(13, HIGH);// accensione del led in contemporanea
      delay(25); // tempo di attesa da cambiare con delayMicroseconds per aumentare la velocità di rotazione              
      digitalWrite(8, LOW); //0 volt sul pin 8
      digitalWrite(13, LOW); // Led spento 
      delay(25);//come sopra              
      Passi = Passi + 1; // La variabile sale di 1 per ogni ciclo
         if (Passi == 200)//Condizione per controllare il valore della variabile Passi che determina il numero di          passi
   {
          Passi = 0; // Se vera Passi viene riportata a zero
          while(1);//si interrompe il ciclo fino al prossimo start manuale
    }
    else
    {
           delayMicroseconds(1);//Se non è vera continua il ciclo con un delay 
}
}

Junior73
God
God
Messaggi: 3614
Iscritto il: lunedì 14 aprile 2014, 10:36
Località: Perugia

Re: Consigli vari prima di iniziare

Messaggio da Junior73 » venerdì 31 luglio 2015, 15:20

Rieccomi non avendo un alimentatore 24v non ho potuto provare lo script con il Driver Tb6560. Così ho provato ad usare il Driver Dm542A con il motore del Kit 3 ampere e gli alimentatori a 36v in dotazione (la corrente con il regolatore si abbassa fino a 30 volt circa).

Collegamenti :

-Pin 8 di arduino connesso al PUL + (5v) del Driver DM542A
-GND di arduino su PUL-(PUL)

Enable+ e - come pure Dir + e - scollegati

Il driver è configurato a 400 Pulse e quindi per fare un giro completo di 360 gradi al motore sono necessari appunto 400 cicli dello script. La velocità è regolata dal delaymicroseconds . Più il valore è basso più il motore gira veloce. Sotto i 200 si blocca o penso come si dice in gergo "stalla". Così ho messo un valore di 250 di delay. Devo calcolare gli Rpm per minuto ancora....... :)

Codice: Seleziona tutto

/*
 Stepper Giro
 */



int Passi = 0;//Dichiaro la variabile Passi con un valore di zero
void setup() {

  pinMode(8, OUTPUT);//Pin 8 di Arduino come uscita 5v connessa al PUL + (5v)  del Driver DM542A
  pinMode(13, OUTPUT);//Pin 13 Led della Scheda Arduino come uscita
}

void loop() {
   digitalWrite(8, HIGH);//5 volt sul pin 8
   digitalWrite(13, HIGH);// accensione del led in contemporanea
   delayMicroseconds(250); // tempo di attesa              
   digitalWrite(8, LOW); //0 volt sul pin 8
   digitalWrite(13, LOW); // Led spento 
   delayMicroseconds(249);//come sopra              
   Passi = Passi + 1; // La variabile sale di 1 per ogni ciclo
   if (Passi == 400)//Condizione per controllare il valore della variabile Passi che determina il numero di passi per ogni giro
   {
    Passi = 0; // Se vera Passi viene riportata a zero
    while(1);//si interrompe il ciclo fino al prossimo start manuale
    }
    else
    {
    delayMicroseconds(1);//Se non è vera continua il ciclo con un delay 
}
}
Nel prossimo script vorrei invertire la direzione del motore.....

Saluti

Junior73
God
God
Messaggi: 3614
Iscritto il: lunedì 14 aprile 2014, 10:36
Località: Perugia

Re: Consigli vari prima di iniziare

Messaggio da Junior73 » venerdì 31 luglio 2015, 23:50

Provo a buttar giù qualcosa anche per il controllo di più motori in sequenza. In questo script vorrei far muovere di un giro completo 4 motori stepper in sequenza . Ho usato i pin 8 (motore 1),9 (motore 2),10(motore3),11(motore 4) . Si può usare penso per diversi utilizzi potendo controllare separatamente il numero di passi di ciascun motore.

Codice: Seleziona tutto


/*
 Stepper Controllo 4 Motori in sequenza
 */
int M1 = 0;
int M2 = 0;
int M3 = 0;
int M4 = 0;

void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop(){
  
  while(M1 < 400) {
  digitalWrite(8, HIGH);
  delayMicroseconds (250);              
  digitalWrite(8, LOW); 
  delayMicroseconds (250);
  M1= M1 + 1;  
}
  while(M2 < 400) {
  digitalWrite(9, HIGH);
  delayMicroseconds (250);               
  digitalWrite(9, LOW); 
  delayMicroseconds (250);
  M2= M2 + 1;  
}
  while(M3 < 400) {
  digitalWrite(10, HIGH);
  delayMicroseconds (250);               
  digitalWrite(10, LOW); 
  delayMicroseconds (250);
  M3= M3 + 1;  
}
  while(M4 < 400) {
  digitalWrite(11, HIGH);
  delayMicroseconds (250);             
  digitalWrite(11, LOW); 
  delayMicroseconds (250);
  M4= M4 + 1;  
}
}
Saluti

turbina

Re: Controllare dei driver stepper direttamente da un Arduin

Messaggio da turbina » sabato 1 agosto 2015, 3:51

E' sempre meglio dare un nome ad ogni variabile numerica.........

int STEP1 = 8; //step motore1
int STEP2 = 9; //step motore2
int STEP3 = 10; //step motore3
int STEP4 = 11; //step motore4

void setup() {
pinMode(STEP1, OUTPUT);
pinMode(STEP2, OUTPUT);
pinMode(STEP3, OUTPUT);
pinMode(STEP4, OUTPUT);
}

Junior73
God
God
Messaggi: 3614
Iscritto il: lunedì 14 aprile 2014, 10:36
Località: Perugia

Re: Controllare dei driver stepper direttamente da un Arduin

Messaggio da Junior73 » sabato 1 agosto 2015, 10:42

Ciao Turbina si certamente è meglio ....sto buttando giù qualche script al volo...

A questo proposito pensavo ai parametri sui quali si dovrebbe avere un controllo per ogni motore:

-Numero di step
-Velocità Rpm
-Direzione
-Esclusione di un motore (in caso siano più di uno)
-Sequenza dei motori
.....

Ora mi viene spontaneo fare un programma per pc che va a modificare/creare lo script di arduino per poi caricarlo ogni volta dove si inseriscono per tutti i motori i vari settaggi etc. E' una soluzione che prevede l'uso continuo dl un computer che non vorrei percorrere. Arduino deve poter lavorare da solo e quindi poter essere settato senza l'uso di un pc. In questo caso penso si possano percorrere soluzioni con imput hardware (tutto ciò che è elettronica mi mette in difficoltà :) ) o software tipo leggere parametri da una SD.

Che ne pensi?Quale soluzione sarebbe migliore?

Perchè il motore mi "stalla" se vado sotto i 200 microsecondi di delay? Arduino non riesce a generare i "segnali", la corrente non basta o ci sono altre ragioni.....

Saluti

Avatar utente
walgri
God
God
Messaggi: 4735
Iscritto il: giovedì 13 gennaio 2011, 18:37
Località: Cagliari

Re: Controllare dei driver stepper direttamente da un Arduin

Messaggio da walgri » sabato 1 agosto 2015, 11:08

Dipende da quante volte devi cambiare la sequenza. Franco99 ti aveva giò mi pare indicato alcune soluzioni nel tuo precedente topic sul dosatore, sia tramite la SD, sia in altro modo.

Volendo restare solo sul software metterei i parametri dei motore in struct, o in istanze di classi, e comporrei la sequenza concatenando i singoli movimenti dei vari motori in un array. In questo modo è semplice modificare la sequenza e renderla lunga a piacere.
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

turbina

Re: Controllare dei driver stepper direttamente da un Arduin

Messaggio da turbina » sabato 1 agosto 2015, 11:23

Junior73 ha scritto: Perchè il motore mi "stalla" se vado sotto i 200 microsecondi di delay? Arduino non riesce a generare i "segnali", la corrente non basta o ci sono altre ragioni.....
Saluti
Bisogna mettere le rampe cioè il motore deve salire e scendere gradualmente di velocità

Junior73
God
God
Messaggi: 3614
Iscritto il: lunedì 14 aprile 2014, 10:36
Località: Perugia

Re: Controllare dei driver stepper direttamente da un Arduin

Messaggio da Junior73 » sabato 1 agosto 2015, 15:44

o.k. forse se faccio una pompa peristaltica (test) per il dosaggio di liquidi meglio mi riallacci al discorso nel topic che avevo aperto dove era intervenuto franco99. Qua invece si può fare una cosa più generica, usando vari driver senza personalizzare troppo verso i miei usi.

Per lo stallo o.k. provo a creargli una sorta di fade in- fade out . Provo con la partenza lenta iniziale dove sembra che sia il problema. Quando ho sentito quel "rumoraccio" pensavo di aver rotto il motore . Devo procurarmi almeno un motore per fare test.

Saluti

Rispondi

Torna a “Home Made”