motorizzazione asse X con arduino per fresa

Moderatore: Junior Admin

Rispondi
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

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: Seleziona tutto



#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");
  }
  
 }

 

  
Vincenzo
FINALMENTE USO IL TORNIO
Messaggi: 377
Iscritto il: mer lug 14, 2010 20:47
Località: Roncade, Treviso

Re: motorizzazione asse X con arduino per fresa

Messaggio da Vincenzo »

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
Avatar utente
AlBi
TORNITORE E FRESATORE
Messaggi: 1726
Iscritto il: mer ott 07, 2015 09:11
Località: Lastra a Signa (Firenze)

Re: motorizzazione asse X con arduino per fresa

Messaggio da AlBi »

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.
Alberto Bianchi
Le mie 'rumente', Tornio: Mi-Bo; Fresatrici: Fervi T044, Rumag REV1S, CST L1; Tavola rotante: Vertex HV8; Divisori: BS-0 & Yantai FNL100B; Trapano: Caber BO6; Forno a muffola; Segatrice Axel 4"x6"; Affila-bulini Parpas AU.
sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: motorizzazione asse X con arduino per fresa

Messaggio da sbinf74 »

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
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

Re: motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

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
sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: motorizzazione asse X con arduino per fresa

Messaggio da sbinf74 »

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.
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: motorizzazione asse X con arduino per fresa

Messaggio da Davide Resca »

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:
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

Re: motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

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 :
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: motorizzazione asse X con arduino per fresa

Messaggio da McMax »

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

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
lelef
TORNITORE E FRESATORE
Messaggi: 6028
Iscritto il: lun mar 09, 2009 23:14
Località: Frejus-Milano

Re: motorizzazione asse X con arduino per fresa

Messaggio da lelef »

vi do' 2 idee di materiale che ho usato
https://forum.v1engineering.com/t/joyst ... rlin/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
Gioco con macchine e moto di modellismo e non da 1,5cc agli 8000cc
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

Re: motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

@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.
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: motorizzazione asse X con arduino per fresa

Messaggio da Davide Resca »

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:
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: motorizzazione asse X con arduino per fresa

Messaggio da McMax »

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

Codice: Seleziona tutto


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

“None of us can change the things we’ve done. But we can all change what we do next.” – Fred Johnson

fulminato in tenera età
Avatar utente
Davide Resca
CAPO OFFICINA
Messaggi: 13863
Iscritto il: lun feb 29, 2016 11:29
Località: Ustica & Dintorni saltuariamente Bologna o Pesaro
Contatta:

Re: motorizzazione asse X con arduino per fresa

Messaggio da Davide Resca »

"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 :???:
Gli errori sono per i principianti, noi esperti puntiamo al disastro !!!
Le conoscenze acquisite, sono proporzionali al DANNO PRODOTTO !!! ( esperienza personale...)
youtube



Immagine 2°socio TIRATOSAURO CLUB ITALIAN
raunarde
SON PASSATO AI TRAPANINI
Messaggi: 114
Iscritto il: lun nov 04, 2019 12:49
Località: tra i laghi zona Varese

Re: motorizzazione asse X con arduino per fresa

Messaggio da raunarde »

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
Rispondi

Torna a “Elettronica ed elettrotecnica”