ELS (Electronic Lead Screw) - progetto con ARDUINO

Moderatore: Junior Admin

eolobiccolo
APPRENDISTA E ADDETTO ALLE PULIZIE
Messaggi: 9
Iscritto il: lun dic 17, 2018 21:50
Località: Matelica

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da eolobiccolo »

Beh... in parte hai ragione, ma qualche vantaggio ce l'ha:
1) Non bisogna stare a cambiare ingranaggi per passi particolari.
2) A fine passata si ferma da solo evitandoti casini.
Al momento la mia era più che altro curiosità, ma non nego che se tu progettassi una versione che comanda anche il trasversale un pensierino ce lo farei. Magari con la scheda ST di cui spesso parli. ;)
Vuoi mettere fare filettature ed altro in automatico invece che in manuale?
Io ho un vecchio divisore meccanico professionale per la fresa (rimediato da un rottamaio a 2 soldi).
Beh, stufo di star ogni volta a fare conti e girare decine di volte la manovella per acchiappare il buco giusto, me ne sono costruito uno comandato da arduino e quello meccanico ormai sta solo a prendere polvere in un angolo.
Sono appassianato sia di meccanica che di elettronina, e a volte le cose le faccio solo per il piacere di farle (tempo permettendo).
Il tuo e' un bel progetto ed ha attirato la mia curiosità.
sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da sbinf74 »

McMax,
mi sono incaponito nel cercare di capire perchè utilizzando il movimento libero dell'ELS escono dei valori che non corrispondono alla realtà.

Leggendo il codice mi sembra che torni tutto

Codice: Seleziona tutto

Posizione = ((float(absolute_steps)/one_turn_screw_steps)*float(NORTON_feed))/100;
Ma stranamente facendo dei test i valori non corrispondono....ho aggiunto allora alcuni print su seriale per capire quali valori uscivano a caxxo e ho visto che la variabile NORTON_feed mi mette 44!!
Ora mi chiedo ma da dove lo pesca che ho messo 300 ovunque?
:-|

Ho fatto altre prove e pare che il valore limite definito come centesimi giro sia 250 poi mette numeri a cavolo.
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da McMax »

Premetto che sono con lo smartphone quindi non riesco a vedere il mio codice completo ma leggendo ciò che scrivi e pensando, non é che forse ho definito la variabile NORTON_feed come byte?

Tornerebbe con il limite di 250 (dovrebbe essere 255 per la precisione). In effetti pensandola per il caser che ha avanzamenti Norton molto corti ci può stare che l'abbia definita come byte.

Il problema é che quel parametro lo salvo in Eeprom quindi non basta ridefinirlo come intero per sistemarlo ma va modificato tutto il salvataggio in eeprom..... posso sistemarlo comunque.
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à
sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da sbinf74 »

Grande McMax beccato!... nel movimento libero era definito come byte.....ora modifico e riprovo

Sistemato ora funziona perfettamente :) Grazie

Codice: Seleziona tutto

void MovimentoLibero()        //moves the stepper motor freely using the joystick. It returns the carriage position calculated on the actual NORTON gearbox ratio
                              
{
  boolean stay = true;
  unsigned long stepperSpeed;
  float Posizione = 0.00;
  unsigned int joy;
  int NORTON_feed;
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: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da Davide Resca »

Cioè fatemi capire, con arduino trasformate una variabile da byte a word e la salvate nella epron senza nessun artificio ?
Io per scrivere nella epron una word ho duvuto scomporla, salvarlacome byte in due celle attigue della eprom, leggere i valori e ricomporla ... :shock:
Parliamo di10 anni fa ...microchip pic 16f84... :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
umbez
TORNITORE E FRESATORE
Messaggi: 1895
Iscritto il: lun set 29, 2008 23:19
Località: Cologno Monzese

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da umbez »

Avide, c'è una libreria che lo fa, se ti fossi scritto una libreria anche tu oggi non te ne saresti lamentato ;P
lol
Ù.
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: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da Davide Resca »

ma sta buono ...lassame sta' :muro:
:risatina:
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
sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da sbinf74 »

Ultimo nato e questo per ora è mio :mrgreen:

realizzato su scatola gewiss 44206 per il joy ho usato un elemento singolo al posto della solita schedina, ed aggiunti i pulsanti metallici la scatola è stata abbassata di 1 cm per renderla esteticamente più piacevole. Il coperchio è stato verniciato ed ho applicato delle etichette a rilievo fatte con la stampante 3D. Supporti display e joy sempre realizzati con la stampante 3D es incollati per evitare di forare.
Sto facendo delle modifiche al software per sempificare i menu.
Per ora ho fatto in modo che il menu delle impostazioni compaglia solo se si tiene premuto il tasto reset durante l'avvio.
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
tarzan
SON PASSATO AI TRAPANINI
Messaggi: 87
Iscritto il: mer ago 13, 2014 09:21
Località: Pordenone

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da tarzan »

Ciao ragazzi, i lavori procedono a rilento ma sono riuscito a muovere i primi passi.

Ho collegato per ora stepper e vite madre utilizzando due ingranaggi di serie del tornio da 40 ed 80 perchè per puro caso combaciano perfettamente ( sto riciclando il più possibile ! )
Più avanti provvederò con cinghia e pulegge :mrgreen:

Devo però ancora montare stabilmente l'encoder e lo sto facendo girare con un elastico per prova.
Vorrei chiedervi di migliorare alcuni punti del sw.

1- In "Movimento Libero" la precisione è pazzesca, col comparatore sul carro i movimenti rispecchiano al centesimo il display ;)
Ho bisogno però di maggior sensibilità col joystick perchè mi tocca tenerlo fermissimo per sfruttare l'incredibile precisione ottenibile ed è quasi impossibile riuscirci..
Pensavo che sarebbe fantastico poter abbinare un tasto + movimento per ottenere una funzione lento-veloce !
A meno che non si riesca a renderlo più lineare modificando i parametri già impostati . ( anche se temo che la sua corsa sia fisicamente limitata per ottenere una prima parte lenta e la restante veloce..)

2-In Filettatura il ritorno dopo la passata è lentissimo; come si può dargli una mossa? ( senza alzare i giri motore..)


Intanto basta così... e grazie di tutto
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da McMax »

sbinf complimenti per la realizzazione, e ottima anche l'idea di entrare in impostazioni con la pressione del tasto in avvio!

Tarzan:
si è possibile aggiungere dei tasti, ci avevo pensato, ma come per altri 200 cose che mi passano per la testa non ho mai tempo di mettermi a farlo. Non è complicato, s mastichi un po di C e ti sai arrangiare con aurduino puoi farlo tu stesso

Il ritorno in filettatura è tanto più lento quanto più veloce gira il mandrino. Il motivo è semplice, ogni impulso encoder mandrino genera un interrupt che rallenta l'esecuzione del codice e quindi influisce sulla frequenza con cui vengono inviati gli impulsi di step per far girare il motore stepper sulla vite. Non è possibile ovviare a questo inconveniente perché in filettatura il software deve tenere traccia in modo continuativo del posizione del mandrino altrimenti perdi il sincronismo angolare.
Una soluzione è quella di prevedere un encoder con index ed usare sempre quello come impulso di start per il filetto.... in questo modo al posto di avere 1000 interrupt a giro ne avremmo uno solo e il movimento di ritorno sarebbe molto più fluido. Gli encoder con index però sono più difficili da trovare quindi quando ho sviluppato il software ho preferito sceglierne uno senza.
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à
sbinf74
TORNITORE E FRESATORE
Messaggi: 1349
Iscritto il: ven nov 21, 2008 14:34
Località: Roma

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da sbinf74 »

Grazie Max!
considera che dalle prove che ho fatto riesco a mandarlo in programmazione anche quando viene scritto la prima volta (valori non corretti nella EPROM)

Codice: Seleziona tutto

void loop() 
{
  if (digitalRead(RESET) == PRESSED || !(one_turn_mandrel_steps >= 1000) ) { SHOW_Impostazioni = true; delay(5000);} //Verifico se è premuto il tasto RESET o se ci sono valori non validi nella EPROM
  char scelta;
  if ( SHOW_Impostazioni ) {

    lcd.clear(); Impostazioni();
  }
  else
  {
  while (true)
  {
    scelta = Principale();
    switch (scelta) {
      case 1: lcd.clear(); Avanzamento(); break;
      case 2: lcd.clear(); Filettatura(); break;
      case 3: lcd.clear(); MovimentoLibero(); break;
      case 4: lcd.clear(); MandrelSpeed(); break;
      case 5: lcd.clear(); PosizioneAngolare(); break;
      //case 6: lcd.clear(); Impostazioni(); break;     
    }   
    }  
  }
}

ho fatto un'altra modifica mettendo nelle impostazioni anche il valore OFF alla scatola NORTON (indice 4) così facendo vado a rimuovere tutti i menu relativi e semplifico il menu avanzamento.
Per non incasinare il software a indice 4 la variabile NORTON_gearbox viene impostata a 0

Codice: Seleziona tutto

 EEPROM.get(32, NORTON_gearbox);          //NORTON GEARBOX POSITION
  if ( NORTON_gearbox == 4 ) { NORTON_gearbox = 0; NORTON = false;}
la semplificazione dei menu l'ho fatta con un case.

Codice: Seleziona tutto

  if ( !NORTON ) // Se la scatola norton è disattivata salto i menu
     {
       switch (previous) {

      //disabilito menu trasversale 1 e menu norton 4 e il menu 6 empty space
      case 1: previous = 5; Current = 2; next = 3;  break;
      case 2: previous = 2; Current = 3; next = 5;  break;
      case 3: previous = 3; Current = 5; next = 2;  break;
      case 4: previous = 5; Current = 2; next = 3;  break;
      case 5: previous = 5; Current = 2; next = 3;  break;
      case 6: previous = 2; Current = 3; next = 5;  break;
         
       }
      }
desdemone1976
APPRENDISTA E ADDETTO ALLE PULIZIE
Messaggi: 7
Iscritto il: mar lug 06, 2021 07:44
Località: Ancona

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da desdemone1976 »

Ciao a tutti...
Mi sto cimentando nella realizzazione di questo progetto...ma sto avendo un problema con il sistema...
Cioè il motore non gira...
Premesso che sto usando un Arduino Mega che avevo in casa ed è tutto acrocchiato al momento, ma ho fatto la prova di creare un programmaccio banale per provare il motore e driver e FUNZIONA.
Il dubbio ce l'ho sulla generazione del segnale PWM sul pin 9...
Ho fatto anche una verifica attaccando un oscilloscopio al pin mentre stavo eseguendo un avanzamento libero ma NON leggevo niente!
Ammetto che arduino lo conosco ma non cosi bene e non sono riuscito a capire benissimo come viene gestito il PWM dal sorgente... sono abituato a comandi più spartani come un "analogWrite(pwm, duty)" ma non ho trovato niente di simile nel codice...
Avatar utente
onorino
CAPO OFFICINA
Messaggi: 41550
Iscritto il: mar mar 23, 2010 22:18
Località: Artena(Roma)
Contatta:

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da onorino »

desdemone aggiungi la residenza al profilo utente.
la democrazia funziona fino a quando fate quello che dico io!
Mc Mazzafrusten meccanico mannaro
il riparatore di riparazioni
er robin hood de no'antri
tagliatore scelto di puntarelle
http://www.lievitoedintorni.it/phpbb/index.php
Avatar utente
McMax
CAPO OFFICINA
Messaggi: 9023
Iscritto il: dom gen 31, 2010 21:46
Località: Bussero (MI)

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da McMax »

Ciao Desdemone; non ho mai provato a portare il codice su arduino mega quindi non so dirti se ci sono problemi o meno.
Il segnale di uscita per il passo sul pin 9 viene generato in 2 modi, in funzione di quello che si sta facendo. Mi spiego meglio, nel caso in cui si stia filettando è richiesto un controllo preciso del passo pertanto ogni chiamata di funzione genera un singolo passo che per comodità viene controllato con un timer come fosse un PWM, questa la parte di codice interessata:

Codice: Seleziona tutto

void SetOneShot()
{
  ICR1 = 0;                                                 // Set ICR1 register to 0. ICR1 is the TOP of the timer counting which means the timer is stuck to 0
  OCR1A = 65534;                                            // Set OCR1A to 65534 in order to fire a pulse of 2 cycle clock (8us)
  TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(WGM11);          //OC1A set for PWM with CLEAR at BOTTOM and SET at MATCH (inverted mode)
  TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11) | _BV(CS10); //WGM set for Fast PWM with ICR1 used as TOP value. Prescaler set to clk/64 (4uSec cycle)
                                                            // Timer1 start HERE  
}

void FireStep()
{
  TCNT1 = 65533;                // Force the Timer1 value to 65533 in order to hit the MATCH of OCR1A after one clock cycle
}
con SetOneShot() si impostano in timer e il registro di comparazione invece con FireStep() si fa in modo che il timer raggiunga il valore (e si fermi) del registro OCR1A dopo 2 cicli di clock. In questo modo il comando FireStep() non è bloccante per il codice che eseguirà un impulso da circa 8 microsecondi senza bisogno di impostare alcun delay (che bloccherebbe il codice...).
Queste due funzioni vengono utilizzare per muovere il motore in filettatura.

Per muovere invece il motore senza controllo del passo viene impostato un PWM sempre facendo uso del timer ma in questo caso non esiste un controllo su ogni singolo passo bensì sulla frequenza, queste le funzioni interessate:

Codice: Seleziona tutto



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 
}

void ClearPWM()  //Clear the PWM and stops 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()    //Sets the PWM and starts Timer1
{
  ICR1 = 65535;                        //(65535)set TOP at maximum value in order to get minumun frequency on the motor with prescaler clk/64
  OCR1A = 3;                           // Set OCR1A register to 1 which means that the CLEAR of the OC1A pin is done after 2 timer1 cycle.
                                       // means 8us with clk/64 prescaler
  TCCR1A = _BV(COM1A1) | _BV(WGM11);   //OC1A 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

}


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--;    
}

Questa parte è gestita con un interrupt sul timer1 in modo che la generazione del PWM non sia bloccante per il codice.
Nelle funzioni che usano il PWM per muovere il motore in pratica si imposta il Timer1 come PWM, si attiva l'interrupt e si carica un valore nella variabile TOP che viene passato al registro ICR1 che regola la frequenza del PWM e quindi la velocità del motore.
Scusa per i commenti del codice un po' in Italiano e un po' in Inglese ma l'ho scritto in tempi diversi e commentavo come mi girava :risatina:
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à
tarzan
SON PASSATO AI TRAPANINI
Messaggi: 87
Iscritto il: mer ago 13, 2014 09:21
Località: Pordenone

Re: ELS (Electronic Lead Screw) - progetto con ARDUINO

Messaggio da tarzan »

Scusa se ne approfitto McMax, se ricordi qualche post sopra ti chiedevo di inserire un sistema per rendere più preciso il movimento manuale, sia libero che in filettatura.
Senza utilizzare combinazioni di tasti mi è venuta un'altra ideona :mrgreen:
Ho visto che in quei campi ovviamente viene utilizzato solamente l'asse X del joy mentre Y non ha altre funzioni.

Si potrebbe associarlo ad un movimento più preciso ? <> normale e up down Fine
Ultima modifica di tarzan il ven lug 23, 2021 20:08, modificato 2 volte in totale.
Bloccato

Torna a “Elettronica ed elettrotecnica”