Pseudo-Jog-DRO: Comandare un singolo asse con un volantino

Sezione dedicata all'elettronica in generale.
Rispondi
Avatar utente
walgri
God
God
Messaggi: 4735
Iscritto il: giovedì 13 gennaio 2011, 18:37
Località: Cagliari

Pseudo-Jog-DRO: Comandare un singolo asse con un volantino

Messaggio da walgri » sabato 5 novembre 2011, 1:34

Voglio condividere questo piccolo esperimento didattico, ma funzionante, di elettronica. Poichè sto partendo esattamente da zero come conoscenze elettroniche non son certo sia esente da errori :wink:

Si tratta di una possibile elettronica di gestione per la movimentazione di un asse tramite motore passo-passo, alla stregua di quello che molti hanno realizzato motorizzando gli assi di fresatrici e tornii senza però arrivare a renderle cnc.

Questo Pseudo-Jog-DRO mette a disposizione queste funzionalità :

Movimentazione di un motore passo passo tramite un volantino encoder rotativo
Gestione dei due fine-corsa
Una rudimentalissima procedura di home
Una rudimentalissima visualizzazione della coordinata dell'asse (da calibrare scrivendo la risoluzione nel codice sorgente)
Pseudo-jog-dro_1_Rid.png
Come si può vedere il cuore del sistema è una scheda Arduino.
Ai pin 1 e 2 della scheda sono collegati i segnali A e B dell'encoder, i segnali vengono letti in quadratura tramite procedure assegnate a interrupt. Nel mio caso, l'encoder è stato recuperato da una vecchia stampante HP DeskJet 500.

Una foto del circuito ancora in una forma incompleta (mancano i pulsanti per Home e azzeramento coordinata):
Immagine 005 r.jpg
Dai pin 11 e 12 dell'Arduino si possono prelevare rispettivamente i segnali di DIR e STEP da collegare al driver del motore passo passo. In fase di debug, ho voluto mettere in parallelo a questi segnali dei led che mi indicassero che effettivamente i segnali (non ho un oscilloscopio).

I pin 6 e 7 sono deputati ai fine corsa, che devono essere di tipo normalmente chiuso e devono essere a massa quando il fine-corsa non è ingaggiato.

Come potete vedere qui sotto, l'"asse" su cui ho condotto gli esperimenti è un carrello di una stampante:
Immagine 006 r.jpg
Immagine 007 r.jpg
Infine, ai pin 4 e 8 sono collegati rispettivamente l'azzeramento del pseudo-visualizzatore, e il lancio della bizzarra procedura Home. Bizzarra perchè dopo aver toccato entrambi i finecorsa, manda i segnali per spostare l'asse al centro, senza peraltro gestire alcuna forma di rampa di accelerazione e decelerazione.

La funzione di visualizzazione è decisamente acerba in quanto il programma dell'Arduino non fa altro che rimandare al computer, attraverso la USB, una stringa di testo contenente la coordinata attuale ogni frazione di secondo. Quindi il visualizzatore è il pc con un progamma di terminale (il monitor dell'IDE di Arduino, o Hyperterminal se aveve un sistema operativo Windows, o simili)

Questo è il codice dello sketch di Arduino:

Codice: Seleziona tutto

#define STEP_PIN      12
#define DIR_PIN       11
#define QUAD_A_PIN    2
#define QUAD_B_PIN    3

#define X_INF_LIM_PIN 6
#define X_SUP_LIM_PIN 7  

#define ZERO_BTN_PIN  4
#define HOME_BTN_PIN  8

volatile long pos_x = 0;
long max_pos_x = 0;
float risol_x = 0.026560424966799469; // mm/passo

const int STEP_DUR = 10;
const int PAUSE_DUR = 100;



void setup() {                
  // inìzializzazione
  Serial.begin(19200);
  Serial.println("TEST LETTURA ENCODER");
 
  pinMode(QUAD_A_PIN, INPUT);
  digitalWrite(QUAD_A_PIN, HIGH); //Attivo la resistenza  interna di pull-up
  
  pinMode(QUAD_B_PIN, INPUT);
  digitalWrite(QUAD_B_PIN, HIGH); //Attivo la resistenza di pull-up
  
  pinMode(STEP_PIN, OUTPUT);  
  pinMode(DIR_PIN, OUTPUT); 
  
  pinMode(X_INF_LIM_PIN, INPUT);
  pinMode(X_SUP_LIM_PIN, INPUT);
  digitalWrite(X_INF_LIM_PIN,HIGH); 
  digitalWrite(X_SUP_LIM_PIN,HIGH); 
  
  pinMode(ZERO_BTN_PIN, INPUT);
  digitalWrite(ZERO_BTN_PIN,HIGH);
  
  pinMode(HOME_BTN_PIN, INPUT);
  digitalWrite(HOME_BTN_PIN,HIGH);
  
  attachInterrupt(0, leggi_A, CHANGE); 
}

void loop() {
  Serial.println(pos_x * risol_x, DEC);
  
  if(digitalRead(ZERO_BTN_PIN) == LOW){
   pos_x = 0;
  }
  
  if(digitalRead(HOME_BTN_PIN) == LOW){
   perform_homing();
  }
  
  delay(500);
}

void perform_homing()
{
  Serial.print("Performing HOMING -- Max X:");
  digitalWrite(DIR_PIN, LOW);
  while(digitalRead(X_INF_LIM_PIN) == LOW){
    do_step();
    delayMicroseconds(PAUSE_DUR);
  }
  max_pos_x = 0;
  
  digitalWrite(DIR_PIN, HIGH);
  while(digitalRead(X_SUP_LIM_PIN) == LOW){
    do_step();
    delayMicroseconds(PAUSE_DUR);
    max_pos_x += 1;
  }
  pos_x = max_pos_x;
  Serial.println(max_pos_x, DEC); 
  
  digitalWrite(DIR_PIN, LOW);
  for (int i = 1; i < max_pos_x / 2; i++){
    do_step();
    delayMicroseconds(PAUSE_DUR);
    pos_x -= 1;
  }
}


void do_step(){
  digitalWrite(STEP_PIN, HIGH);
  delayMicroseconds(STEP_DUR); 
  digitalWrite(STEP_PIN, LOW);
}
  

void leggi_A(){
  if (digitalRead(QUAD_A_PIN) == digitalRead(QUAD_B_PIN)) {
    if (digitalRead(X_SUP_LIM_PIN) == LOW) {
      pos_x++;
      digitalWrite(DIR_PIN, HIGH);
      do_step();
    }
  } else {
    if (digitalRead(X_INF_LIM_PIN) == LOW) {
      pos_x--;
      digitalWrite(DIR_PIN, LOW);
      do_step();
    }
  }

}
Alcuni filmati:
Movimento manuale: http://www.youtube.com/watch?feature=pl ... 7pEQ2W8YCQ
Procedura di Home: http://www.youtube.com/watch?feature=pl ... r94-IJ6n-c
Il "Visualizzatore": http://www.youtube.com/watch?feature=pl ... p6pE09Btao

Invito tutti a non risparmiare commenti e critiche.
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » sabato 5 novembre 2011, 2:14

Scusate, l'encoder non è letto in quadratura, vengono gestiti solo i due fronti del segnale A. Inizialmente lo leggevo A e B in quadratura, ma poi mi sono accorto che dando uno schioccata all'encoder il treno di impulsi era troppo veloce perchè il sistema lo seguisse. Accade anche in questo esempio se si dà  una schioccata energica all'asse dell'encoder.
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

paverik
Member
Member
Messaggi: 314
Iscritto il: mercoledì 17 novembre 2010, 14:15
Località: Udine
Contatta:

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da paverik » sabato 5 novembre 2011, 6:42

Complimenti proprio un bel progetto.
Anche io mi diletto ad usare arduino, non ai tuoi livelli, ma comunque mi ha dato belle soddisfazioni.
Sapendo la difficoltà  di programmazione hai realizzato una cosa non semplicissima te lo assicuro.
Mi è venuta voglia di analizzarlo più il dettaglio, ma ho già  mille domande in caso mi darai una mano.

Ciao riccardo
per divertirsi un pò con delle letture "leggere" (no profit): http://www.icaos.it

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » sabato 5 novembre 2011, 18:56

Ciao Riccardo, grazie !

Sarò lieto di condividere quello che conosco.

Devo intanto ringraziare publicamente Billielliot che ha impiegato un bel po' di tempo a spiegarmi il collegamento degli encoder.

Adesso vorrei aggiungere un altro paio di cosette a questo progetto, in ordine sparso:

aggiungere un display lcd per la visualizzazione
sostituire l'encoder con un motorino cc "passivo" e utilizzare un input analogico anzichè digitale
gestire le rampe di accelerazione e decelerazione

Ciao !
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » sabato 5 novembre 2011, 19:43

E, a dirla tutta, forse ricominciando adesso e praticamente a parità  di prezzo, proverei a lavorare su una scheda ChipKit e non su un Arduino.
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

elettromirco
Senior
Senior
Messaggi: 869
Iscritto il: domenica 14 febbraio 2010, 19:08
Località: Romentino (NO)

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da elettromirco » sabato 7 gennaio 2012, 1:11

=D> =D>

nel primo filmato hai fatto proprio quello che volevo io!

un volantino!

mi sa che mi avvicino anch'io ad arduino!
Ciao Mirco ;)

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » sabato 7 gennaio 2012, 1:32

Grazie elettromirco !

Nel frattempo ho recuperato uno schermettino lcd per implementare il visualizzatore.

Arduino è sicuramente attraente, per una applicazione semplice come questa si può acquistare il modello più economico, o uno dei suoi cloni.

Se vuoi restare su Pic e magari vuoi più potenza di calcolo (da usare in altre applicazioni) puoi dare una occhiata alla UBW (PIC18) o UBW32 (PIC32). Basata sul PIC32 è la scheda ChipKit di Digilent, che utilizza la stessa IDE e lo stesso "linguaggio" di Arduino. Più o meno allo stesso prezzo.

Buone sperimentazioni e mostraci quello che fai !

Ciao
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

elettromirco
Senior
Senior
Messaggi: 869
Iscritto il: domenica 14 febbraio 2010, 19:08
Località: Romentino (NO)

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da elettromirco » sabato 7 gennaio 2012, 12:45

per ora ho un programmatore pic 8/18/28/40 pin ed anche24lcxxx
che va bene per tutta la serie pic16xxxxx
visto che l'ho pagato 65 eurozzi lo vorrei fondere prima di abbandonarlo .
ma arduino mi intriga!
Ciao Mirco ;)

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » sabato 7 gennaio 2012, 12:48

Mooolto ragionevole :)

Per completezza: anche UBW e UBW32 non hanno bisogno di programmatore, usano la usb per il caricamento del programma.
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

turbina

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da turbina » sabato 7 gennaio 2012, 15:36

Buon skill per costruirci sù qualcosa :wink: , in realtà  però con la funzione void leggi_A() la lettura viene fatta in quadratura ma alla velocità  di 2x invece che 4x, in gergo italiano potremo chiamarla "mezza quadratura"
Un altra nota è quella di mettere 2 pullup esterne da 10k o meno su ingressi encoder open collector se i fronti di salita sono troppo poco ripidi per effetto delle capacità  parassite degli ingressi e i pullup interni non bastano.
Se con la "schioccata" vedi che perdi i passi....lo avrai capito?..E' perchè gli step del motore hanno la stessa accelerazione degli impulsi encoder, per ovviare a questo inconveniente bisogna rendere indipendente il moto del motore dal moto dell'encoder, cioè con l'encoder aggiorni la variabile di posizione, ma da un'altra parte del programma aggiorni il movimento del motore includendo la rampa fino alla sua massima accelerazione possibile, una volta debugged il programma puoi ritornare a leggere l'encoder in quadratura x4.
:wink:
Altra cosa: Includendo le rampe è elegante se una volta aquisito la posizione del limite superiore e inferiore consideri questi limiti al fine di decellerare il motore all'approssimarsi di questi limiti e quindi evitare di oltepassare i limiti e quindi perdere la posizione. :wink:

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » sabato 7 gennaio 2012, 16:02

Grazie Turbina,

è un profondo onore per me averti qui !

Mezza quadratura ci sta benone !

Sarò sincero: non so cosa voglia dire pull up open collector ma ci studio sopra. In generale, sempre che sia quello che mi stai indicando, avevo anche provato a mettere le pullup sulla breadboard, poi mi son reso conto (qui: https://www.cncitalia.net/forum/viewtopi ... 21&t=33901) che gli encoder le avevano già  e le ho rimosse, visto che l'accrocchio funzionava.

Se mi indichi che ci son dei vantaggi a metterle, vuol dire che devo approfondire e lo farò con piacere.

Mi piacerebbe a questo punto conoscere come vanno i fronti, ma per il momento non ho un oscilloscopio e vedrò se iniziare con l'Arduinoscope o con un mini dso.

Grazie per le indicazioni sulla gestione separata di encoder e step. In effetti è in programma, anche perchè non riesco a immaginare altro modo per gestire le rampe e perché vorrei implementare semplici comandi tipo foratura, tasca circolare e simili (ovviamente in una versione evoluta con più di un asse :) ).

Sempre per giocare, ho anche intenzione di usare la riga ottica a nastro di un'altra stampante e realizzare una specie di loop chiuso, molto rudimentale, evidentemente senza PID.

Grazie, buona serata
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

turbina

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da turbina » mercoledì 11 gennaio 2012, 11:15

Siccome non si può sapere a priori se l'encoder che userai ha oppure non ha le resistenze di pullup (cioè tra i +5v e il pin) sui segnali A e B ...allora è meglio metterle..tanto male non fà , se l'encoder non le ha e non si mettono esternamente allora l'unica resistenza di pullup rimane quella interna al micro che tù hai attivato che mi pare vale dai 35 ai 50kohm ..TROPPO alta per garantire un fronte ripido di salita , ce se ne accorge solo con un oscilloscopio. :wink:
Ah grazie di cuore per la considerazione 8)

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » lunedì 30 aprile 2012, 0:05

Piccolo aggiornamento: ho utilizzato questo esperimento per provare i driver per motori DC di marcosin (questi qui: https://www.cncitalia.net/forum/viewtopi ... =8&t=22136 ), dopo aver installato le resistenze di pullup da 10 kOhm come consigliato da turbina.
ArduinoSMDCDriver.jpg
Funziona tutto benone. Un piccolo filmato: http://www.youtube.com/watch?v=XsTnQm5ufA8

Bravo Marco e grazie !
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

Avatar utente
marcosin
Senior
Senior
Messaggi: 840
Iscritto il: mercoledì 27 giugno 2007, 23:11
Località: Arezzo
Contatta:

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da marcosin » martedì 15 maggio 2012, 12:54

Bravo di cosa? L'hai fatto andare tu, mica io!!! :D
Per informazione, i drive possono essere configurati anche direttamente con il comando in quadratura invece che step e dir, quindi basta collegargli l'encoder diretto, senza avere circuiti aggiuntivi esterni.
Comunque il tuo circuito è interessante per pilotare drive stepper classici. Ottimo lavoro... =D>

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

Re: Pseudo-Jog-DRO: Comandare un singolo asse con un volanti

Messaggio da walgri » martedì 15 maggio 2012, 13:22

Grazie Marco, in effetti nasce proprio per pilotare gli stepper.

Usando il moltiplicatore presente nel tuo driver poi si potrebbe anche regolare la sensibilità /velocità  una tantum senza altra circuiteria.


(un moderatore a strisce passando per caso ha corretto il link, meglio usare il punto esclamativo per richiamare l'attenzione :wink: )
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

Rispondi

Torna a “Elettronica”