Vai al contenuto
PLC Forum


Arduino E G-Code


walterword

Messaggi consigliati

sto facendo degli studi su stepper motors , driver e motion controller

Il motion controller lo sto vedendo basato su arduino uno , spesso viene bypassato il framework dell'ide per avere piu velocità e performances dal micro .

Per quanto riguarda la produzione del g-code ci sono vari progammi che producono questi programmi di lavoro , i cosi detti Cad/Cam , dove Cam e' la parte di elaborazione dei programmi g-code

Lato HMI un'applicazione in java o c# che apre un programma g-code e lo visualizza e ne gestisce il flusso verso il controller .Nel caso di pcb elettronici , si parte dal file gerber o dai files gerber e si scannerizza ogni riga con un parsere che sto provando in python in quanto molto veloce e molto pratico per le stringhe e le regular expression e da qui si produce il programma g-code .Tutto questo seppur complesso ed articolato ha un target raggiungibile

Nel controller il lavoraccio in quanto il micro deve ricevere in modo sincronizzato ogni riga di g-code , farne il parsing in C/C++ ed interpretare i comandi .

Per esempio un comando G02 significa produrre un cerchio a partire dal punto iniziale e al punto finale , considerare l'arcotangente (atan o atan2) , calcolare velocità ect , insomma il motion

Qui ci sono le interpolazioni, le estrapolazioni , curve di bezier , sviluppi in serie di taylor e tante belle cosette di matematica, algebra lineare , matrici ect

Ora , quello che chiedo , e' se tra di voi c'e' qualcuno che saprebbe indicarmi un sito o link dove poter capire bene l'interpretazione del g-code e poi discutere su come impostare l'architettura software da far girare nel microcontrollore

Link al commento
Condividi su altri siti


  • Risposte 52
  • Created
  • Ultima risposta

Top Posters In This Topic

  • walterword

    36

  • Livio Orsini

    12

  • bigalex

    2

  • AlexB

    1

per esempio un codice G facile ....G1

Questo comando deve essre interpretato nel senso che si traccia una linea dal punto attuale P(x,y) al punto P1(x1,y1)

Ragionando da un punto di vista vettoriale è abbastanza semplice calcolare lo spostamento e in base all'accelerazione e alla velocità lineare imposta calcolare le due velocità dei due assi x e y .

Pero come si potrebbe gestire la cosa nell'interrupt timer handler ?

Link al commento
Condividi su altri siti

ho trovato una libreria che mi permette di avviare diversi timer di arduino DUE e di modificarne il settaggio.

#include <DueTimer.h>
#define tempo_uS 200
int myLed = 13;
int limite=0;
int count=0;

bool ledOn = false;
void myHandler()
{
        count+=tempo_uS ;
        if(count >= limite)
        {
	   ledOn = !ledOn;
	   digitalWrite(myLed, ledOn);
           count=0;
        }   
}

void setup()
{
        Serial.begin(9600);
	pinMode(myLed, OUTPUT);

	Timer3.attachInterrupt(myHandler);
	Timer3.start(tempo_uS ); //  Interrupt ogni 200 uS
}

void loop()
{
           if(Serial.available() >0)
           {
               limite=Serial.parseInt();
               if(limite==1500000)
               {
                 Timer3.stop();
               }  
               else
               {
                 Timer3.start(tempo_uS );  
               }
           }
}

Con questo codice ho in interrupt ogni 200 uS e dalla seriale vario la frequenza del PWM .Come test se arriva il valore 1500000 fermo il timer per poi ripartire a qualsiasi altra frequenza .

L'errore massimo e' quello del tempo di interrupt , all'interno della funzione di handler del timer controllo con un contatore la frequenza

Questo potrebbe essere buono per la routine di pilotaggio motori stepper

Sto mettendo giu le giute formule per un movimento di due assi , x e y .I concetti vettoriali sono noti e sulla carta per ora mi torna tutto

Di ogni spostamento considero vettorialmente lo spazio , la velocità di avanzamento dell'utensile (feed) , l'accelerazione ect .Poi tramite calcoli con arcotangente, seno e coseno ricavo tutte le componenti relative ai due assi X ed Y che essendo ortogonali tra loro rendono facile le operazioni .Anche perche se non fossero ortogonali sarebbe una cnc di m....a :D Moto rettilineo con accelerazine costante

comunque l'errore potrebbe sparire se il valore impostato e' un multiplo del tempo di interrupt , ma questi sono controlli e conticini che si fanno senza problemi , adesso voglio testare con l'oscilloscopio ....se la cosa sta in piedi lo prendo come base

Arduino Due e' una bomba !

Modificato: da walterword
Link al commento
Condividi su altri siti

Walter dove l'hai trovata la libreria?

Però a questo punto ti conviene usare la suite di Atmel per programmare i loro micro con il plug-in per arduino.

Link al commento
Condividi su altri siti

Ciao Walter.

Per la specifica del G code (standard) puoi dare un'occhiata a questo documento .

Oppure guarda questo documento è in inglese (scritto dall'ente governativo NIST (roba seria)) per una trattazione più

approfondita e rigorosa.

Poi la normativa/standard di riferimento per il G code è la RS274NGC nelle sue varie versioni e declinazioni e di materiale in rete dovresti trovarne a volontà .

Poi come tu ben saprai di firmware specifici per Arduino e G code (principalmente per stampanti 3D) ce ne sono diversi già fatti con tanto di interprete già implementato (ovviamente con gli adattamenti del caso).

bigalex :blink:

Link al commento
Condividi su altri siti

grazie a tutti pe rl'interessamento , grazie bigalex

Livio , io e' quasi un anno che uso Atmel Studio 6.2 + Visual Micro , con sotto Arduino IDE ovviamente .

Questo mi permette di lavorare in modo professionale .Con l'ide faccio solo i test preliminari

Ma ti dirò di piu ......

Con Atmel Studio puo' lavorare con ASF che sarebbe atmel software framework in C/C++ , in pratica arduino due e' considerato come una board atmel con la differenza che invece di comprare un SAM ice o Atmel ICE , lo posos progammare direttamente da atmel studio tramite la configurazione di un external tool che usa il bossac.exe ( mentre per le piattaforme uno , mega ect usa avrdude.exe )

Il processore e' una bomba , possiede anche una ROM da 16k e tante altre cose tra le quali diversi canali DMA , timers a 32 bit ect ect

Questo perche finche si fanno dei test o comunque le applicazioni sono "lente" , e molte possono esserlo tranquillamente , va bene di tutto .Ma quando devi fare lavori veloci su interrupt diciamo "real time " allora bisogna valutare che la semplicità e l'utilità per cui e' nato arduino vanno messe in discussione ...esempio ....lo sai quanti cicli macchina e quanti bytes ti portano via le due chiamate digitalRead e digitalWrite ? Una marea , ma proprio una marea

Bene per alcune cose , ma se devi azionare qualcosa ed eseguire un handler interrupt ...capisci bene che le cose diventano un po critiche , molto critiche

Per cui c'e' la possibilità di gestire il progetto in moduli , gestire meglio le librerie in c++, ed usare in forma mista o unica le funzioni sulle porte , periferiche in generale ect

Questo e' gia in preventivo , sta di fatto che non mi metto ad iniziare un qualcosa tipo cnc con digital write e quant'altro ....usero' le classiche macro e magari rifaccoi una mappa in qualche file .h

Modificato: da walterword
Link al commento
Condividi su altri siti

pensa che avendo anche la udoo con un arduino due embedded , posso programmare sia un DUE solo che embedded nella udoo con il bossac che ho scaricato

Per usare il bossac.exe devi quindi creare un external tool da atmel studio e dare le giuste direttive , tra cui un file batch che o scritto cosi

mode %1:1200,n,8,1
sleep 1
"C:\Program Files (x86)\Arduino\hardware\tools\bossac.exe" --port=%1 -U false -e -w -v -b %2 -R

Questo mi permette di caricare software Atmel in arduino due .Diciamo cosi ....ho una scheda di sviluppo che si chiama arduino due , c'e' un atmel arm cortex e la programmo come un ARM

Link al commento
Condividi su altri siti

bigalex

Molto interessanti i due documenti , soprattutto per scrivere il parser di g-code che dovrà risiedere in arduino due e anche l'interpretazione di questi comandi ;)

Gli aspetti da considerare solo molti , pero' se riesco ad impostare bene la cosa a livello modulare , posso sempre implementare man mano le codifiche aggiunte .

Tra l'altro provavo ieri il free RTOS di atmel per Arduino Due , non dimentichiamoci che un processore ARM e' indicato per sistemi operativi embedded :smile:

comunque Livio con quella libreria di sopra si puo' gia tirar fuori uno scheduler fatto come si deve .... <_<

Si potrebbero anche implementare dei pezzi di codice assembly volendo , e' un assembly molto potente e veloce

Modificato: da walterword
Link al commento
Condividi su altri siti

:thumb_yello: buono !

Molto fluido come tutorial

In effetti vengono applciati i principi dei quali parlavo sopra , moto rettilineo ect .

Le cose per il DUE sono un po diverse , e' un ARM e se programmato col framework arduino vengono sprecate un sacco di risorse e performances , ma questo e' un altro discorso

Modificato: da walterword
Link al commento
Condividi su altri siti

Se usi stepper e non vuoi sprecare risorse del micro per generare i passi dello stepper è meglio far ricorso ad un integrato specifico come lo LM297, però poi si aprono altre problematiche per il conteggio impulsi e variazione della frequenza.

E' una problematica che sto valutando in questo periodo.

Può essere che tiri fuori qualche casa tra un po', se nel frattempo non mi prende la scimmia per qaulche altra applicazione. :P

Visto che adesso posso divertirmi a fare quello che mi piace, seguo l'estro del momento. :lol:

Link al commento
Condividi su altri siti

per quanto riguarda il pilotaggio degli stepper credo di farlo su interrupt del timer come ti ho spiegato sopra , poi seguono un driver per stepper ai quali passo per ogni asse il pwm generato nell'interrupt e la direzione

Pero' sto facendo dei calcoli nel senso che se decido di impostare il tempo di interrupt del timer a 200 uS ho le seguenti frequenze

1) 1/0,0002 = 5KHz

2) 1/0,0004 = 2,5 KHz

3) 1/0,0006 = 1666 Hz

4) 1/0,0008 = 1250 Hz

5) 1/0,0010 = 1000 Hz

...e cosi via .....

Quello che sto cercando di capire e' questo ..... velocità vettoriale , spostamento e accelerazione mettiamo che le conosco .COn questi dati posso tranquillamente calcolare lo spsotamento X , Y e le relative velocità

Mettiamo che per semplicità considero per ora accelerazione nulla e nessun trapezio di velocità . Considerando sempre il punto di partenza che in questo caso e' P(0,0) e il punto di arrivo come P1(X1,Y1) con la velocità vettoriale conosciuta che sarebbe la feed , tramite arcotangente , seno e coseno trovo senza problemi le velocità , ossia le componenti ortogonali del vettore velocità , come Vx e Vy

Ora mettiamo che mi trovo nel punto di origine (0,0) e devo spostarmi nel punto P(6,6) espressi in metri e che la velocità vettoriale sia V=10 m/S ricavo che -> Vx=7,0.7 m/S circa e che Vy=7,0.7 m/S

Tralasciando per ora i limiti di velocità degli stepper per quanto riguarda la coppia ho che devo azionare i due motori alle velocità appena calcolate per cui generare una frequenza nel interrupt ideonea , considero per semplicità anche che il rapporto meccanico dell'asse sia 1 cioe che per ogni passo si muova di 1 millimetro per cui devo muovere entrambe gli assi di 7070 mm circa , e' un valore ipotetico teorico non guardiamo che e' praticamente impossibile che un asse si muova cosi velocemente

Come posso fare se ho la massima frequenza a 5KHz , la successiva a 2,5 KHz ect ..... ???

Livio questo e' un bel argomento se hai voglia di impegnarti e si possono raggiungere bei traguardi e soddisfazioni .... :smile:

Tra gli algoritmi da enere in considerazione sto vedendo quello di questo signore Bresenham’s Line Algorithm

Modificato: da walterword
Link al commento
Condividi su altri siti

Livio , gli stepper drives da usare sono questi

http://www.aliexpress.com/wholesale?catId=0&initiative_id=AS_20150511083008&SearchText=stepper+motor+drive+nema23

Lasciamo perdere le librerie Adafruit che servono per giocare e per introdurre il neofita generico al mondo dei motori .

Sto guardando le librerie e mi sembrano poco idonee per fare una cosa "professionale" , senza contare il fatto che una libreria dipende dall'altra e che la cosa e' mirata per vendere prodotti della marca sopra citata .Bene i prodotti ma non e' quello che mi interessa , a me interessa tirare fuori una funzione che mi permette di generare pwm da mandare ai drives , con relativo bit di direzione .Punto .

Qua c'e 'anche un po di documentazione

http://www.aliexpress.com/item/Quality-Assurance-CNC-Router-Single-Axis-4-5A-TB6660-Stepper-Motor-Driver-12-48V-Factory-outlets/1962431544.html?s=p

Modificato: da walterword
Link al commento
Condividi su altri siti

con questa semplice modifica spettacolare posso variare il tick del timer e di conseguenza la frequenza per pilotare gli impulsi a mio piacimento e quando voglio

int freq=0;
int myLed = 13;
bool ledOn = false;

void myHandler()
{
     ledOn = !ledOn;
     digitalWrite(myLed, ledOn);
}

void myHandler2()
{
     Serial.println(freq);
}

void setup()
{
        Serial.begin(9600);
	pinMode(myLed, OUTPUT);

	Timer3.attachInterrupt(myHandler);
	Timer3.start(freq);                         //  Interrupt in base alla frequenza impostata
        Timer4.attachInterrupt(myHandler2);
	Timer4.start(1000000);                      //  Interrupt ogni 1S per visualizzare la frequenza
}

void loop(){

	while(1)
         {
           if(Serial.available() >0)
           {
               freq=Serial.parseInt();
               if(freq==1500000)
               {
                 Timer3.stop();
               }  
               else
               {
                 Timer3.start(freq);  
               }
           }
	}
}
Link al commento
Condividi su altri siti

effettuati test con oscilloscopio a partire da 1 secondo mi sono spinto fino a 4 microSecondi .

Esempio con interrupt ogni 50 uS i dati visualizzati sull'oscilloscopio sono i seguenti

Rise < 3.00 uS Fall < 3.00 uS

Periodo = 100.0 uS Frequenza= 10 KHz

+Duty = 50.0 %

- Duty = 50.0 %

Le prestazioni sono ottime fino a 4 uS dopodiche' iniziano ad essere instabili in quanto c'e' del software che gira soprattutto nella routine di handler interrupt considerando che digitalWrite() si prende una paccata di cicli macchina .

Per questo tipo di applicazioni real time devo assolutamente trovare i registri e le funzioni per gestire le porte del micro direttamente senza troppi giri di libreria arduino

Cosa ne pensi Livio ?

Va bene o no il sam8E ARM Cortex si arduino due ?

Io dico che e' una bomba , non pecca di un picosecondo azzzzz

;)

Modificato: da walterword
Link al commento
Condividi su altri siti

In linea di principio è un ottimo lavoro.

In questi giorni non ho molto tempo per analizzare in dettagli la faunzione.

Colgo l'occasione per domandarti se tu la suite atmega che usi è quella free o hai integrato acquistando le licenze.

Link al commento
Condividi su altri siti

io ho installato arduino ide 1.5.7

Dopo di che Atmel Studio 6.2 ultima versione

Poi Visual Micro per Atmel Studio 6.2

Per il debug ho visto che qualcuno lo riesce a fare ma non ho approfondito .comunque con una licenza da 17 euro si puo scaricare il debug di visual micro

Atmel Studio e' prevalentemente gratuito , compreso il free RTOS

Link al commento
Condividi su altri siti

sto implementando due interrupt timer per gestire la generazione degli impulsi per l'asse x ed y

COn interrupt entrambe a 50uS , periodo=100 uS , Frequenza=10 KHz ottengo

+Duty=50%

-Duty= 50 %

Il ritardo di fase ,se cosi si puo' chiamare , tra i due segnali e' di 2 uS , lo sto vedendo sull'oscilloscopio a due tracce .Considerando le poche istruzioni che dovranno eseguire credo di rimanere entro i 5-10 uS

Ottimo !

Modificato: da walterword
Link al commento
Condividi su altri siti

comunque questa cosa non e' un problema , a frequenza piu basse non sono mai sincronizzati in egual modo

Al limite uno dei due motori inizierà prima , un passo o due , dell'altro anche perche se viaggiano a velocità diverse quindi frequenze diverse saranno sempre sfasati

Ma questo non credo che sia un problema a livello finale di interpolazione

Link al commento
Condividi su altri siti

verificando con l'oscilloscopio i tempi di esecuzione di alcune macro istruzioni di arduino sto notando che otlre a digitalWrite c'e' una mangeria di tempo con la serial.print

Se ad un certo punto il programma arriva a 130 uS , dopo la chiamata ad una serial.Println si aggiungono svariate decine di millisecondi a 9600 .

Modificando a 115200 le cose si decimano ma rimangono comunque tanti millisecondi ....

Per cui bisogna vedere come usare il DMA con la seriala nativa ...

Link al commento
Condividi su altri siti

Si in arduino, per motivi facilmente comprensivi, l'interrupt di seriale è ad alta priorità; non solo ma la seriale si attiva anche in trasmissione a tempi fissi, anche se non c'è nulla da trasmettere.

Dovresti provare a disattivare/attivare la seriale a tempi più lunghi, però perdi in risposta ai comandi inviati da seriale.

Link al commento
Condividi su altri siti

non 'e' proprio cosi perche se commento la serial.print ottengo l'esecuzione del programma in uS

La Available che verifica se sono arrivati bytes , in caso che non sia arrivato nulla , trova il buffer vuoto e va a controllare qualche registro

Il problema e' la print e println che fanno un sacco di controlli e formattazione .E' li che mangia troppo

comunque ci sono 6 canali dma ect , bisogna riuscire a farli funzionare , altrimenti e' come avere un camion rimorchio e caricarci sopra un bancale di matotni tutto sparpagliati a caso e la cosa non ha senso

Link al commento
Condividi su altri siti

non 'e' proprio cosi perche se commento la serial.print ottengo l'esecuzione del programma in uS

Appunto. Se togli il richiamo della periferica tutti idrivers relativi sono inoperosi.

Sto facendo quelche cosa di simile al tuo, dedicandoci poco tempo, ma usando una scheda Arduino Mega

Link al commento
Condividi su altri siti

devo studiare bene le API di atmel per programmare il due in modo piu performante , e questo si puo' fare tranquillamente bypassando le librerie arduino per quello che serve che sia veloce

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...