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 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 ... Apri un post che provo a seguirti |
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 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 ... |
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 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/ |