MECCANICA e DINTORNI
http://meccanicaedintorni.morpel.it/phpbb/

motorizzazione asse X con arduino per fresa
http://meccanicaedintorni.morpel.it/phpbb/viewtopic.php?f=16&t=29762
Pagina 1 di 8

Autore:  raunarde [ mar ott 12, 2021 09:50 ]
Oggetto del messaggio:  motorizzazione asse X con arduino per fresa

Ciao a tutti, vi rompo le scatole per risolvere il mio problema.
ho sviluppato un programma con arduino nano, testato prima su mega e poi rivisto i pin per il nano per motorizzare l'asse x della mia fresa ed in futuro fare anche Y e z e convertirla in CNC, ma dovrei prima imparare a disegnare in cad...

Ho usato un driver DM556 ed uno stepper nema 32 da 6nm, alimentatore da 24 V ma ho anche un 48V eventualmente a disposizione.

Con il mio programma a vuoto funziona tutto, se lo collego sull'asse x della fresa a velocità bassa nessun problema, ma se utilizzo il pulsante spostamento rapido mi perde una marea di passi

Come logica di funzionamento ho messo 2 potenziometri (su ingressi analogici A0 e A1) per gestire la velocità dei passi in funzionamento normale (quindi mentre freso) ed uno spostamento rapido per il posizionamento tramite la pressione di un pulsante.
sul driver il Pulse+, dir+, Ena+ sono collegati a +5V.
l'azionamento è dato da due interruttori in pullup in realtà è un joystik con 4 interruttori per le varie direzioni.

nelle mie sperimentazioni anche a vuoto se aumentavo troppo la velocità di rotazione perdeva passi ed il motore ringhiava parecchio.
Probabilmente ho sbagliato io qualcosa nello sketch per questo chiedo a voi un aiuto per una possibile soluzione
Altro problema riscontrato è che nel Void normal se metto i valori in microSeconds non mi funziona correttamente mentre in mills si.. (non ho capito il perchè)
Codice:


#define puls_sx 3      //pulsante controller SX
#define puls_dx 4      //pulsante controller DX
#define ena 5           //ENA stepper Driver
#define dir 6           //DIR stepper Driver
#define pul 7           //PUL stepper Driver
#define rapid 8         //Pulsante rapido
#define potS A0         //Potenziometro velocità normale
#define potR A1         //Potenziometro velocità Rapida
#define fcsx 10         //Fine corsa SX NC
#define fcdx 11         //Fine corsa DX NC
#define ledSx 12        //Led direzione SX
#define ledDx 9        //Led direzione DX
//#define buzzer 9        // Buzzer segnalazioni acustiche
#define power_on 2       //led stato acceso

int val_p_sx =0;
int val_p_dx =0;
int val_fcsx =0;
int val_fcdx =0;
int val_potS =0;
int val_potR =0;
int val_rapid =0;
int delay_MicrosS = 0;
int delay_MicrosR = 0;

void setup() {

  Serial.begin(9600);
  pinMode(puls_sx, INPUT_PULLUP);
  pinMode(puls_dx, INPUT_PULLUP);
  pinMode(ena, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(pul, OUTPUT);
  pinMode(potS, INPUT);
  pinMode(potR, INPUT);
  pinMode(fcsx, INPUT_PULLUP);
  pinMode(fcdx, INPUT_PULLUP);
  pinMode(ledSx, OUTPUT);
  pinMode(ledDx, OUTPUT);
//  pinMode(buzzer, OUTPUT);
  pinMode(power_on, OUTPUT);
  pinMode(rapid, INPUT_PULLUP);
 
  digitalWrite(power_on, HIGH);
  digitalWrite(ledSx,LOW);
  digitalWrite(ledDx,LOW);
  delay(200);
  digitalWrite(ledSx, HIGH);
  digitalWrite(ledDx, HIGH);
  Serial.println ("Ready");
  delay(1000);
  digitalWrite(ledSx, LOW);
  digitalWrite(ledDx, LOW);
  tone(1, 1000, 600);
  delay(1000);



}

/* void tone_err() {
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  tone(2, 1200, 100);
  delay(100);
  Serial.println("Tono Errore");
}  */

void loop() {
check_valori();
direzione();

}

void start_normal() {
 
   // if (digitalRead(val_rapid)==1){                              //se puls rapid non premuto
      //leggo velocita potS
   
   
      delay (delay_MicrosS);   //in millis perchè con i micros non lavora correttamente
      digitalWrite(pul, HIGH);
      delayMicroseconds(10);
      digitalWrite(pul, LOW);
   

  }

void start_rapid() {
// if(digitalRead(val_rapid)==0) {                             //se premo rapid
       //leggo potR
   
   
   
      delayMicroseconds (delay_MicrosR);
      digitalWrite(pul, HIGH);
      delayMicroseconds(10);
      digitalWrite(pul, LOW);
     
   

  }




//}

 
void check_valori() {

  val_p_sx = digitalRead(puls_sx);
  val_p_dx = digitalRead(puls_dx);
  val_fcsx = digitalRead(fcsx);
  val_fcdx = digitalRead(fcdx);
  val_rapid = digitalRead(rapid);
  delay_MicrosS = map(analogRead(potS), 0, 1023,1,50);
  delay_MicrosR = map(analogRead(potR), 0, 1023, 5, 500);
}
void direzione(){

if ((val_p_sx == 0)&&(val_p_dx==1)) { //funziona a SX
    if (val_fcsx == 0) {
      digitalWrite(ledSx, HIGH);
      digitalWrite(dir, HIGH);
      digitalWrite(ena, HIGH);
       if (val_rapid==0){
        start_rapid();
       
       }
     else {
        start_normal();
       }
    }

    else  {   if (val_fcsx == 1)   {      //finecorsa sx aperto blocco movimento
      digitalWrite(ledSx, LOW); {
        digitalWrite(ena, LOW);
        Serial.println("finecorsa sinistra");
   //     tone_err();
       
      }
    }

  }
  }


if ((val_p_dx == 0)&&(val_p_sx==1)){
    if (val_fcdx == 0){                   //funziona a dx
      digitalWrite(ledDx, HIGH);
      digitalWrite(dir, LOW);
      digitalWrite(ena, HIGH);
        if (val_rapid==0){
        start_rapid();
       }
     else {
        start_normal();
       }
     
    }

    else {  if(val_fcdx == 1); {                  //finecorsa dx aperto blocco movimento
      digitalWrite(ledDx, LOW); {
        digitalWrite(ena, LOW);
        Serial.println("finecorsa destra");
   //     tone_err();
       
      }
    }

  }
}
  if (((val_p_dx==0) && (val_p_sx==0))||((val_p_dx==1) && (val_p_sx==1))){
    digitalWrite(ena, LOW);
    digitalWrite(ledSx, LOW);
    digitalWrite(ledDx, LOW);
    //Serial.println("Stop");
  }
 
}



 

Autore:  Vincenzo [ mar ott 12, 2021 20:49 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

24 volts sono troppo pochi, appena provi a salire di velocità è ovvio che perdi passi, dagli 48 Vdc e vedrai come risponde.
Di solito i nema32 danno il massimo a tensioni alte, io ne ho 4 che lavorano, da datasheet, fino a 110 Vdc, li ho alimentati a 48 Vdc con dei driver simili ai tuoi ed i rapidi sulla BF46 non perdono passi fino a 2000 mm/min

Autore:  AlBi [ mer ott 13, 2021 08:42 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Potrei sbagliarmi perché non conosco assolutamente Arduino, ma dando un'occhiata al tuo codice
mi sembra che hai gestito la generazione degli impusi per lo stepper muovendo il gpio alto/basso da codice.
Questo è un grosso errore, devi usare la periferica timer per generare un uscita ad onda quadra (duty cycle 50%) e frequenza variabile.
Inoltre il cambio di direzione deve essere sincrono con i fronti dell'onda quadra, e per farlo devi usare l'interrupt
generato dall' OC (output compare) del timer.

Per quanto riguarda la tensione di alimentazione, in linea generale quoto quello che diceva Vincenzo, però
prima di collegarlo al 48V devi anche verificare che le connessioni a gli avvolgimenti del motore vadano bene;
lo dico perché alcuni motori hanno avvolgimenti doppi che si possono collegare in serie o in parallelo.
Se non ci sono limitazioni specifiche date dal motore usa la massima tensione di lavoro prevista dal tuo driver.

p.s.
Quando devi allegare un Km di codice forse è meglio allegare un file di testo zippato piuttosto che metterlo in linea come hai fatto.

Autore:  sbinf74 [ mer ott 13, 2021 08:59 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Mi pare tu non gestista l'accelerazione.... Potresti utilizzare una libreria che lo fa per te accelstepper.h.
Inizialmente mi ero trovato bene con questo codice https://www.lombardoandrea.com/motori-passo-passo-arduino-joystick/

Poi ho voluto aggiungere un display e le cose si sono complicate :risatina: alla fine, grazie a delle dritte di McMax, sto facendo il tutto con i timer di arduino.


Vedi qualcosa qui TEST

Autore:  raunarde [ mer ott 13, 2021 11:55 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Grazie per le risposte, allora per prima cosa provo a mettere subito il 48V, poi l'accelerazione non l'ho gestita e non ho nemmeno capito come venga pilotato il motore (dal sito di Andrea lombardo) , mi perdo con i valX & co.
Per il pilotaggio del driver, io vario in pratica la permanenza a livello LOW del PUL mantenendo invece costante il tempo in cui mi va HIGH. per variare il dutycycle devo studiare un attimo come fare.

@Sbinf74 , ho la tua stessa fresa e piano piano vorrei "CnCzzarla" come hai fatto tu, per ora sto sbattendo la testa sull'asse X con la movimentazione manuale. una volta ok questo passo agli altri assi

Autore:  sbinf74 [ mer ott 13, 2021 12:33 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Guarda io voglio fare questo joy proprio perchè alla fine la uso più in manuale che in cnc.

Questo quello che mi sono prefissato:
Utilizzo di un solo Joy (la Z la muovo in alternativa a X e Y)
Enable/Disable dei drive (per liberare anche il movimento a mano)
Scala di velocità regolabile in modo che posso fare degli spostamenti veloci o anche singoli step.

Funzione Hold che mantiene la velocità corrente senza dover mantenere il joy, con cambio direzione quando funzione hold è attiva

Display con indicatore di quote con gestione quota relativa ed assoluta (logicamente azzerabili).

Per tutto questo sono passato da subito ad un arduino mega perchè con il mega ho i timer necessari per pilotare tutti i motori.

Io il codice di Anrea Lombardo l'ho provato e funzionava molto bene solo che come ho provato ad aggiungere il display (ma anche una serial.print) mi sono reso conto che con la serializzazione del loop non funzionava bene. Anche facendo un'aggiornamento dei valori del display a intervalli prefissati mi trovavo i motori subivano una pausa. Direi che con due assi e senza tanti fronzoli puoi usare tranquillamente quel codice e aggiungere la gestione delle velocità come ti aggrada.

Autore:  Davide Resca [ mer ott 13, 2021 12:58 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Bella idea, ci sto provando anche io ma sono ancora al serial monitor con serial.begin ... :risatina:
Apri un post che provo a seguirti :mrgreen:

Autore:  raunarde [ mer ott 13, 2021 15:07 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

non mi piace avere la pappa pronta però se finisci il tutto poi magari ti rubo il progetto se lo condividi.

Io non ho usato il joystick resistivo per non avere variazioni di velocità indesiderate, uso un joystick a 4 interruttore e la velocità la regolo con i potenziometri.
ho preso questo :

Autore:  McMax [ mer ott 13, 2021 21:08 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Quoto quanto già detto: la gestione dei passi da dare allo stepper va fatta usando i timer, non alzando e abbassando i GPIO con DigitalWrite....
L'uscita sul timer non deve necessariamente avere un duty cycle al 50% ma anzi, è meglio dare un impulso breve (5usec) di lunghezza fissa variando solo la frequenza per variare la velocità. E' importante che il motore venga accelerato e decelerato: da evitarsi partenze e stop istantanei: per farlo la frequenza del PWM va variata in modo lineare sia a salire (accelerazione) che a scendere (decelerazione).

Per i cambi di direzione, più che affidarsi solo agli interrupt del timer, è bene essere certi di decelerare il motore, fermarlo e poi cambiare direzione. Un cambio di direzione al volo causa solo stallo e perdita di passi, anche se eseguito in sincrono con l'interrupt del timer.

L'interrupt è comodissimo e va utilizzato per tenere il conto dei passi nel caso in cui di voglia mantenere un contatore di passi assoluto che all'occorrenza può essere usato come DRO indiretto... che ovviamente non terrà conto del gioco di inversione della vite/chiocciola ma che, eventualmente, può essere compensato.

Autore:  lelef [ mer ott 13, 2021 23:22 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

vi do' 2 idee di materiale che ho usato
https://forum.v1engineering.com/t/joystick-managed-by-marlin/10863
routine che potete inserire praticamente in tutti i marlin quindi una bella rosa di schede, volendo potete mettere quindi un display anche touchscreen oppure collegarvi a raspberry o ad un pc per avere anche pieno controllo cnc, lamentano la mncanza di rampe ma se settato bene non son necessarie.
Ho usato una skr pro 1.2, la doc che trovate per il joystick per questa e' incompleta sopratutto a livello hardware, se vi serve vedo di ripescare codice e collegamenti corretti.
Ci son gia, disponibili varie fork a seconda di vome configurate la macchina, per parametrizzare il tutto potete mettervi in debug da pc e con pochi comandi leggere i dati degli assi ed impostare tutto che poi resta definitivo in memoria sull'eeprom.
altra e' https://estlcam.de
Non e' solo un sistema via pc come potrebbe essere mach3 o linuxcnc, potete collegare joistik 3 assi e volantino,non il sistema che propone con interfaccia parallela ,e' un'altra configurazione,il pendant eltricamente e' identico ma diretto su arduino mega,cosi' puo' funzionare anche stand alone.
il primo smanettando con alcuni sender potete usarlo come controllo completo anche in modlita' tornio, il firmware Estlcam solo 3 assi fresa e niente display

Autore:  raunarde [ gio ott 14, 2021 07:38 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

@McMax a questo punto mi sono perso, non so come gestire i timer.

devo studiare un po', ma non ho capito come fare a dare i passi al Pulse.

Autore:  Davide Resca [ gio ott 14, 2021 08:00 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Anche io sono curioso , dai Max ( o qualcun'altro di pratico ) erudiscici :mrgreen:
Ma fai un esempio pratico da poter provare, in rete si trovano millemila esempi sui timer ma tutti complessi e dopo un po' con le mie scarse conoscenze del Wiring e/o C++ mi perdo ... :cry:

Autore:  McMax [ gio ott 14, 2021 08:26 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

qui di seguito la sezione interessata estrapolata dal firmware del ESL.

Codice:

....
volatile unsigned int TOP;


void StopTimer1() //pulisce i registri del Timer1 per fermare il PWM e quindi il motore stepper

{
  TCCR1B &= B11111000;  //imposta il prescaler del Timer a 0 - il Timer1 si ferma in questo punto
  TIMSK1 &= B11111101;  //ferma l'interrupt associato al Timer1
  TCNT1 = 0;            //resetta il valore del Timer1
}

void StartTimer1() //imposta i registri del Timer 1 e fa partire il conteggio - riavvia il motore dopo che  stato fermato
{
  TCNT1 = 0;            //resetta il valore del Timer1
  TIMSK1 |= B0000010;   //imposta l'interrupt associato al Timer1
  TCCR1B |= B0000011;   //imposta il precaler del Timer1 a clk/64 - il Timer1 parte in questo punto
}


ISR (TIMER1_COMPA_vect)    // rountine di interrupt del Timer1 - usata per incrementare i passi stepper e tenere traccia della posizone
{
  ICR1 = TOP;
  if (Direction == CW)
    absolute_steps++;
  else
    absolute_steps--;   
}

void ClearPWM()  //pulisce il  PWM e ferma il Timer1
{
  TCCR1B = 0;                        // halt Timer by setting clock bits (Prescaler) to 0. This will stop the timer until we get set up
  TCCR1A = 0;                        // Reset the register to avoid misconfiguration issue
  TCNT1 = 0;                         // start counting at 0 (BOTTOM)
  TIMSK1 = 0;                        // Reset the interrupt mask register for Timer1               
   
}

void SetPWM()    //imposta il PWM e avvia il Timer1
{
  ICR1 = 65535;                        //(65535) TOP impostato al valore massimo in modo da avviare il motore con la minima frequenza
  OCR1A = 3;                           // OCR1A impostato a 3 in modo che il "CLEAR" del pin OC1A venga effettuato dopo 6 cicli del timer1.
                                               // ovvero 24us con prescaler clk/64
  TCCR1A = _BV(COM1A1) | _BV(WGM11);   //OC1A (pin 9) set for PWM with SET at BOTTOM and CLEAR at MATCH (non-inverted mode)
  TCCR1B = _BV(WGM13) | _BV(WGM12);    //WGM set for Fast PWM with ICR1 used as TOP value

}


una volta avviato, ad ogni ciclo di timer viene generato un impulso di step per il motore la cui frequenza viene controllata cambiando il valore della variabile TOP, che viene assegnato come valore di ICR1 nella routine di interrupt del timer ("ISR (TIMER1_COMPA_vect)") che si genera ad ogni ciclo. Nella routine di interrupt viene anche incrementato o decrementato il contatore assoluto dei passi per tenere traccia della posizione.
Scusate per i commenti misti ITA/ENG ma per certe cose mi viene più comodo l'inglese visto che i datasheet sono tutti in inglese....

Autore:  Davide Resca [ gio ott 14, 2021 09:39 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

"Io ne capisco poco, ma c'è sempre qualcuno che ne capisce di meno."
Salve ... sono quello che ne capisce meno :rotfl: :rotfl: :rotfl:

Grazie , devo studiare tutto il codice ma è durissima, inoltre da quello che vedo ci vuole una certa conoscenza dell'hardware del processore altrimenti non se ne esce ...
Quando trafficavo con i primi Pic a 8Mhz era già un bordello fare tutti i conti per settare i vari bit dei registri nel modo corretto ... poi mi sono dimenticato quasi tutto e adesso "ne resterà uno solo " ma non sono io :???:

Autore:  raunarde [ gio ott 14, 2021 11:20 ]
Oggetto del messaggio:  Re: motorizzazione asse X con arduino per fresa

Davide Resca, siamo in due a non capirci un H :D

questo weekend vedo se riesco a dedicare un po' di tempo a questo discorso, ma non so da che parte iniziare.... proverò dalla fine :p

Pagina 1 di 8 Tutti gli orari sono UTC +1 ora
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/