Newsgroup: it.hobby.elettronica.digitale
Titolo: G-Code e Motori

Salve a tutto il NG
Sto cercando di realizzare una macchina CNC a tre assi XYZ
Ho già realizzato sia l'elettronica per muovere i motori passo passo
che la struttura. 
Adesso ho bisogno di  realizzare il software necessario a coordinare i
movimenti dei motori in funzione del lavoro che deve fare la macchina
ed ho saputo che si usa convenzionalmente il codice GERBER  per le
coordinate.
 
a questo punto mi serve, e qui sta il problema, avere una routine in
VBasic per convertire i vari codici in segnali di bit da inviare alla
porta parallela. 
Qualcuno può segnalarmi un indirizzo a cui riferirmi oppure inviarmi
del codice sorgente ? 
Grazie 

 coordinate.
Ho il tuo stesso problema e mi sto studiano dil G-Code ISO.
Il vero problema non è tanto interpretare il g-code, che è semplice e
linare, ma gestire la porta parallela con tre clock diversi per ogni motore.
Per cominciare ti conviene usare qialche programma già fatto. La maggior
parte sono per DOS dove si riesce a gastire meglio la LPT a basso livello.
Tra i tanti ti consiglio TurboCNC della DAK engineering, freeware scritto in
Turbo Pascal (
http://www.dakeng.com/
). Se paghi 20$ ti danno anche i
sorgenti.
Olivier.

Anch'io ho in progetto qualcosa del genere, ma per il futuro... con "3
clock" intendi tre clock asincroni tra loro? E perché 3 per ogni motore? Non
ne basta uno per ogni passo-passo?
Ciao


In effetti mi sono espresso male come al solito.
Intendevo tre clock UNO per ogni motore. Ciao!
Olivier.

Qual è il problema? Alzi o abbassi la fresa (asse Z) poi ti muovi in X di un
certo numero di step. Idem per Y. Come clock basta usare 3 pin di uscita
della parallela: ad esempio 2-3-4 (rispettivamente db0, bd1 e bd2) Per
decidere lo stato logico (ttl) di un pin di uscita bastano poche linee di
codice sotto dos. Se è questo di cui hai bisogno ti posto queste poche righe
Ciao


Questo è abbastanza banale da fare in effetti. Quello che sto cercando
invece di programmare è un movimento *contemporaneo* dei tre assi, in modo
da realizzare un percorso (rettilineo) inclinato nello spazio in modo
arbitrario (e non orientato secondo uno  degli assi).
Dare tre clock asincroni contemporaneamente vuol dire saper usare a basso
livello uno dei timer interni del processore, cosa che (in dos) comporta
l'uso dell'assembler ben oltre le mie capacità di programmatore della
domenica!
Olivier.

http://pageperso.aol.fr/CarlierJN/ninosen.htm
oppure kcam
"Olivier" <ilgalla@MAPS_ONlibero.it> ha scritto nel messaggio
news:Fs2vb.129517$vO5.5...@twister1.libero.it...


Il Tue, 18 Nov 2003 10:52:41 +0100, Gianni <gli...@NOStiscalinet.it>
ha scritto:
Potrebbe essere semplice, ma non utile, dare i tre clock, solo che
bisogna raccordarsi a degli standard. 
Non ho ancora approfondito bene, ma alcuni programmi di cad, dopo aver
fatto il disegno, consentono di trasformare il tutto in codice gerber,
cd. G-Code, da li in poi ce bisogno di convertire il codice in impulsi
necessari alle misurazioni, e quindi, qui stava la domanda, dove
possibile trovare del codice, per approfondire ?  

 oppure kcam
Interessante, si parlava cmq di *scrivere* software!  =)
Olivier.

Ciao!
Facciamo conto che la configurazione sia la seguente: B0=clk1, B1=clk2,
B2=clk3. Ok? Allora se mandi in uscita 000 hai fronte positivo di clock su
nessuno dei 3 clock. Se invece mandi 001, 010, 100 hai un impulso di clock
prima sul motore_1, poi sul motore_2 ed infine sul motore_3. Ma nessuno ti
vieta di mandare i uscitta 111 per ottenere un impulso di click sui 3 motori
contemporaneamente! Non trovi? :) Forse però non ho ancora capito bene che
vuoi ottenere, perchè per fare via software quello che ti ho appenda
proposto non è poi difficile... cmq tieni conto che anche quello che alla
"vista" sembra simultaneo non sempre lo è. Se vogliamo è un po' il concetto
di multitasking... Il movimento in diagonale o circolare lo ottieni con una
serie di passi nelle varie direzioni, anche se i passi non avvengono in
parallelo ma in sequenza. Ad esempio: se ti vuoi muovere lungo la diagonale
di un quadrato dovrai fare 1 passo in X, poi 1 in Y e ripetere questa
sequenza. Gli step non avvengono contemporaneamente e in realtà non disegni
una linea retta ma una spezzatta. Ma siccome una rotazione angolare di
qualche grado corrisponderà a qualche decimo di millimetro lineare,
praticamente ottieni una linea retta! Poi se anzichè volerti muovere a 45
gradi vuoi muoverti ad altre angolazioni è necessario fare intervenire la
trigonometria con i suoi SIN() e COS(). Non so se in realtà si usa questo
sistema ma io risolverei il problema così
Fammi sapere


Ciao,
In realtà quello che intendo fare è il contrario di quello che dici tu: non
voglio muovere i motori in sequenza ma *contemporaneamente*. faccio un
esempio. Mettiamo che mi deva muovere dal punto (0,0) al punto (0,10).
Attivero il clock del motore in x alla massima frequenza (200hz) contando i
colpi di clock che dovranno essere 2000 (200 al mm, per esempio).
Ora ipotizziamo che mi debba muovere da (0;0) a (10;10): attiverò questa
volta *entrambi* i clock dei due motori alla massima frequenza e conterò
2000 passi in x e 2000 in y.
Ora voglio muovermi da (0,0) a (10;5): questa volta devo dare nello stesso
tempo due clock diversi: nell'asse X darò 200Hz, nell'asse Y invece solo
100Hz. In questo modo i motori si muoveranno insieme percorreno una linea
retta da un punto all'altro (ok, la linea non è retta perchè sono motori
passo-passo, però il movimento degli assi è coordinato e non alternato).
Ora il discorso è analogo per qualsiasi coppia di punti , per esempio da
(10;5) a (15.32;4.99), bastano due conti e un po di trigonometria
(probabilmente basta solo il teorema di pitagore...).
Il difficile è: come cavolo faccio a dare questi clock? Come faccio in un
ambiente multitasking come può essere il dos a generare tre cicli
indipendenti nello stesso tempo?
Olivier.

 indipendenti nello stesso tempo?
Se ho ben capito il tuo problema:
fai un unico ciclo alla frequenza massima in cui decidi ogni volta quali
piedini cambiare di stato per fare i vari clock.
--
...:::Zmaster:::...
DSL powered
zmast[ANTISPAMSYSTEM]@
freemail.it
www.zmaster.tk
Collaboratore del Media Player Project

 piedini cambiare di stato per fare i vari clock.
Come faccio con le temporizzazioni? come faccio a sapere quanto dura un
ciclo per poter contare n cicli tra un colpo e l'altro del clock?
Olivier.

 ciclo per poter contare n cicli tra un colpo e l'altro del clock?
Questo è già più complicato :)
Non sono la persona più adatta a darti una risposta a questo, in quanto non
programmo molto in piattaforme x86, cmq mi hanno detto che windows riesce a
gestire circa tempi multipli di 10 ms +/- 10ms.
Adesso non so di che precisione hai bisogno esattamente, ma io fossi in te
farei una scelta:
1) se pensi di usare il PC solo per comandare questo apparato, usa DOS, so
che in qualche modo si riescono a ottenere temporizzazioni molto migliori,
che dovrebbero essere accettabili per fare quello che devi fare.
Se riesci a prevedere una routine che stia in attesa tot ms la inserisci
all'inizio del ciclo e sei a posto.
2) se pensi di usare il PC anche per sbrogliare, o fare qualche altra cosa
che richieda windows e ti seccherebbe dover passare ogni volta a dos, io mi
farei una schedina con un microcontrollore collegata via seriale, che riceva
le coordinate e che provveda a comandare opportunamente i motori
passo-passo.


 passo-passo.
Questa è un'altra soluzione interessante e credo che una volta finita la
parte meccanica mi ci metterò. Una eeprom per memorizzare il codice e poi
ottengo una fresa stand-alone!
Olivier.


--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Non so se ho "beccato" tutti i messaggi di questo thread, ma penso di aver
capito che qualcuno cerchi di pilotare un movimento XYZ usando un controller
collegato alla parallela del PC. Uno di quelli che usano due bit per ogni
motore, uno per la direzione e l'altro per il passo del motore.
Il problema afforntato in questo modo non ha soluzione. Non e' possibile
scrivere byte sulla LPT a frequenze diverse contemporaneamente. Cioe' non
posso alzare un bit della porta LPT a 200 Hz e un altro a 123 Hz (per
esempio). E questo nemmeno in DOS (non parliamo poi di Windows.... qualsiasi
versione).
Pero' il problema di Olivier di risolve cambiando approccio.
La questione da spiegare e' molto lunga ma da implementare e' facilissima.
Basta cercare su Internet documentazione sull' algoritmo di Bresenham per la
rasterizzazione dei vettori. Si trovano esempi di codice gia' pronti. Io ho
fatto cosi' e il software ha  funzionato perfettamente. Adesso ho dei casini
con l'hardware. Pero' se il thread e' ancora vivo se ne puo' sempre
riparlare.
Ciao !!!
Sandro


 riparlare.
Ho dato una rapidissima occhiata all'algoritmo di Bresenham ma non capsco
come possa essere utile in questo caso. Si potrebbe cominciare un nuovo
thread sull'argomento..
Olivier.

 Olivier.
L'algoritmo in questione viene usato per la rasterizzazione. Cioe' per
riprodurre su un dispositivo tipo uno schermo di un computer  (che ha una
risoluzione elevata fin che si vuole ma comunque finita) un vettore (quindi
ad esempio un segmento). Una macchina a CNC va pensata come una matrice di
punti !! a due o tre dimensioni a seconda dell'applicazione ma comunque
sempre ad una matrice  Ecco il trucco !!!!
Faccio un esempio: La mia macchinetta  usa dei motori da 48 passi per giro
che fanno girare una barra filettata da 1 mm di passo. Quindi ogni volta che
il motore fa un passo, la meccanica si muove di 1/48 mm cioe' circa 2
centesimi di millimetro (al netto di giochi, tolleranze e via dicendo). Ho
una corsa utile di circa 800 mm Quindi il mio asse X ha 38400 punti
indirizzabili, ciascuno di 2 centesimi di mm. Sull'asse Y valgono le stesse
considerazioni solo che e' piu' corto : 500 mm. alla fine dei conti. Ognuna
delle due meccaniche XY la vedo come una matrice di 38400 X 24000 punti !
Cominci a capire ?
In un piano XY si puo muovere il motore delle X oppure quello delle Y oppure
tutti e due i motori insieme. Quindi la traiettoria che si vuole realizzare
viene approssimata. Piu' piccola e' la dimensione del singolo passo,
migliore e' l'approssimazione. Anche le macchine CNC da centinaia di milioni
(di lire) funzionano secondo questo principio. Hanno risoluzioni di
millesimi di millimetro ma il concetto non cambia. Quindi con gli algoritmi
di rasterizzazione non c'e' bisogno di pilotare alcuni bit della porta
parallela a frequenze diverse da altri bit della stessa porta ! Esistono
vari tipi di algoritmo per rasterizzare le primitive piu' disparate. Nella
mia applicazione uso solo segmenti archi e cerchi per cui per altri tipi di
primitive non saprei dire. Personalmente uso l'algortimo di Bresenham con
qualche ottimizzazione ma nulla di piu' complesso. Posso mandarti il codice
della funzione se vuoi.
Nel tuo approccio mi pare di capire che tu  dica :
1) Supponiamo che voglia disegnare un segmento di coordinate 0,0 10,7
(mettiamo millimetri)
2) Supponiamo che il motore A piloti le X e il motore B piloti le Y
3) I motori sono associati a due pin qualsiasi della porta parallela.
4) Supponiamo che la meccanica sia come la mia: a ogni passo di un motore
corrispondono 2 centesimi di millimetro
5) la velocita' sulla traiettoria voglio sia 5 millimetri al secondo.
Per semplicita' ignoriamo l'angolo che fa il ns segmento con l'origine.
Questo servirebbe per calcolare l'effettiva velocita' sugli assi.
I dati:
La lunghezza del segmento e' 12.20 mm circa  Il motore A dovra' muoversi di
10 mm (500 passi) e il motore B di 7 mm (350 passi). Queste operazioni
devono avvenire contemporaneamente in 2.44 secondi.
Vediamo cosa salta fuori:
Motore A: >> 500 passi in 2.44 sec -> 204.9 passi al secondo  In pratica 205
Hz  o 1 passo ogni 4.8 millisecondi
Motore B: >> 350 passi in 2.44 sec -> 143.4 passi al secondo. In pratica 143
Hz  o 1 passo ogni 6.9 millisecondi
In parole povere al motore A devo inviare un impulso ogni 4.8 msec e
CONTEMPORANEAMENTE al motore B uno ogni 6.9 msec !!
Le cose si complicano !! Se il mio controller richiede che l'impulso sia
mantenuto alto per diciamo... 2.5 msec che salta fuori ? Vediamo !
1) metto a 1 il bit della porta parallela che corrisponde al motore A.
2) Aspetto 2.5 msec minimo altrimenti il controller non riuscira' a "capire"
che quello e' il comando di muovere il motore.
3) Dopo 2.5 msec rimetto il bit a 0. tutto bene il motore ha fatto un passo.
4) Adesso aspetto 2.3 msec (4.8 - 2.5)
5) Sono passati 4.8 msec dal punto 1. E ora di partire con il secondo dei
500 passi !!
6) alzo il bit della porta parallela che corrisponde al motore A.
7) Aspetto ancora 2.5 msec prima di rimetterlo a 0.
8) Sono passati i 2.5 msec. E ora di rimetterlo a 0. Un momento !! Dal passo
1 sono passati 7.3 msec !!! 0.4 msec fa avrei dovuto alzare il bit del
motore Y aspettare i suoi 2.5 msec e rimetterlo a 0 !!!
Capisci perche' cosi' non si puo' fare ? Non con questo tipo di controller e
di sistema operativo DOS - Windows quello che vuoi !! Nemmeno con i RTOS
multitasking  si puo' fare con garanzia del risultato !
Il metodo che uso io usa un altro approccio:
Stessi dati di prima.
1) Calcolo quale asse deve fare piu' passi. In questo caso l'asse X (500
passi). Mi serve per ricavare la frequenza di pilotaggio. Io uso quella
dell'asse che deve fare piu' strada e che avra' la frequenza piu' alta !
2) L'algoritmo di Bresenham e' un loop che ti dice quali sono i passi da
fare in X e Y per approssimare al meglio il segmento in questione. In
pratica dice una sequenza di:
 . Fai un passo in X
'. Fai un passo in X
' fai un passo in X e uno in Y
.Fai un passo in Y
.
.
. E cosi' via.
A ognuma di queste operazioni corrisponde una scrittura sulla porta
parallela alzando gli opportuni bit.
In questo modo ogni 4.8 msec so che devo fare dei passi specifici. Potra'
capitare che un motore faccia un passo e l'altro stia fermo ma si tratta di
millesimi di secondo. Il tutto e' molto semplice e non c'e' alcun bisogno di
prevedere frequenze di pilotaggio diverse. Ne basta una sola.
Implementare un solo tipo di  ritardo e' fattibile. Senza alcun problema in
DOS, con qualche riserva in Windows 98/ME,  con NT/2000/XP e' meglio
lasciare perdere.
Alla fine salta fuori un segmento approssimato in teoria al massimo a 1 o
due step (da 2 a 4 centesimi di mm nel mio caso). Non male e comunque per me
piu' che sufficiente.
Uso lo  stesso sistema per "sincronizzare" DUE piani XY e funziona !
Ovviamente nell'esempio non sono tenute in conto le approssimazioni i
recuperi dei passi e via dicendo, cosa che nel programma invece ci sono. Era
solo per spiegare un po'. Poi volendo ci sono tutte le ottimizzazioni da
fare (Accelerazioni/Decelerazioni Fermo motore in coppia e cosi' via). Come
dicevo ti posso mandare il codice della funzione che uso io. Caso mai lo
studi e lo adatti alle tue esigenze.
Sandro

 riprodurre su un dispositivo tipo [..]
Ti ringrazio per la mega spiegazione chiarissima e molto interessante.
Ho capito bene come funziona il tuo metodo che è in effetti abbastanza
semplice e logico, anche se l'algoritmo per farlo non è così intuitivo nello
spazio come può essere nel piano.
Ora ti racconto come ho fatto io in win2k e come penserei di fare in DOS.
Il primo metodo è veramente brutale, ma tutto sommato funziona oltre le mie
aspettative: scritti tre programmini, uno per asse che si occupano di dare
il clock alla parallela in un solo pin, li lancio contemporaneamente tramite
un programma principale ogni volta che devo fare uno spostamento, e senza
saper nè leggere nè scrivere tramite l'OS (windows 2k) multitasko il tutto
abbastanza bene. I tre programmini possono essere sostituiti da una DLL e
chiamati da un programma principale per esempio.
Il secondo metodo per DOS è un po più raffinato e richiede qualche riga di
assembler. Esistono in un computer una manciata di timers, come il
performance counter delle cpu post MMX, il timer del beeper, il 8254
eccetera. Una volta calcolate con un po di trigonometria spicciola le tre
frequenze a cui mi devo muovere, una volta nota la frequenza di
aggiornamento del timer, "programmo" le accensioni/spegnimenti dei vari pin
in funzione della lettura del timer (che avverà in un loop).
Un esempio su 2 assi:
Il timer ha una frequenza di aggiornamento di 100Hz.
La frequenza del clock in X è 5Hz, con un up time di 0.05s
La frequenza del clock in Y è 3Hz, con un up time di 0.05s
Programmo le accensioni come segue:
    Leggo T0 (valore del timer)
    Accendo entrambi i pin
    loop sulla lettura di T
    {
    Quando T >= T0+5 spengo i pin
    Quando T >= T0+25 accendo X
    Quando T >= T0+30 spengo X
    Quando T >= T0+33 accendo Y
    Quando T >= T0+38 spengo Y
    ecc...
    }
In questo modo non devo aspettare il falling edge di un clock prima di
cominciarne un altro su un altro pin, e posso anche compiere più operazioni
nello stesso ciclo. I timers delle cpu penso che lavorino a qualche
centinaia di migliaia di Hz, decisamente più di quello che serve. Il
problema è che come programmatore della domenica pomeriggio io non so fare
tutte queste cose, sopratutto leggere i timers in DOS. La realtà è che non
lo voglio fare, avendo già trovato un programmino open source che fa
esattamente questo e lavora benissimo!
Olivier.

Visto che sei piu' hardwarista di me (che non ne so mezza come si dice a
Bologna), ti chiedo una dritta: sto cercando uno schemino che preveda di
interfacciare un PIC alla seriale del PC.
In pratica vorrei poter mandare via seriale dei comandi al PIC. Ho trovato
le AN774 di Micochip che mi danno un buono spunto per il software.
Credo serva il PIC un MAX232 e pochi altri componenti. Pensavo di usare un
PIC 18 perche' mi risulta abbiano circa un migliaio di byte di ram per i
dati e hanno anche un bel po' di pin di I/O.
Ti spiego cosa voglio fare:
Il mio software per il taglio delle lastre mandera' dei comandi al PIC via
seriale. IL PIC usera' 8 pin di I/O per gsetire i motori passo passo. Agli 8
pin di I/O sara' collegata la scheda che uso adesso. In questo modo posso
accedere alla scheda via seriale usando i driver  standard di Windows XP. Se
poi i lcircuito prrevedesse magari anche una RAM esterna di quelle seriali
tanto meglio. Sai dove posso trovarlo ? (In bocca al lupo con il tuo
progetto !!)
Sandro
"Olivier" <ilgalla@MAPS_ONlibero.it> wrote in message
news:JQJzb.163275$vO5.6...@twister1.libero.it...


 progetto !!)
E' una buona idea, ci ho pensato anch'io. Una volta ottenuta una versione
definitiva della meccanica, lavorerò sull'elettronica e farò qualcosa di
simile: macchina comandata via seriale con eprom su cui memorizzare il
g-code: carichi il codice e poi la macchina lavora stand-alone! wow!
Olivier.