Kreslení kružnice

ruzne programy,konverze dat, digitalizace, atd...
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

14. 4. 2016, 6:21

Dobrý den,
prosím o pomoc, dostavěl jsem svoje CNC a momentálně jsem téměř hotový s programem pro řídící jednotku. Typ není je to dělané na koleně s mikrokontrolérem Atmel.
Potřebuji naučit jednotku jak použít příkaz kružnice tedy X Y I J K tedy pro zatím stačí I a J pro frézování plošných spojů je to dostačující.
Problém je v tom, že nemůžu přijít na to jakým způsobem, když to řeknu jednoduše posunovat osy tak abych dosáhl kružnice.
Pravděpodobně je třeba vypočítat vždy před krokem každé osy budoucí bod pro danou osu ale nevím jak. Našel jsem na internetu zajímavý vzorec ale nejsem si jistý jak ho použít

x = cx + r * cos(a)
y = cy + r * sin(a)
našel jsem ho zde
http://stackoverflow.com/questions/8398 ... cumference" onclick="window.open(this.href);return false;
cx bych pochopil začátek souřadnic r je rádius ten by taky asi nebyl problém když je rádius v podstatě polovina poloměru. Ale jak má program vypočítat a=což by měl být úhel.

No možná že jsem celkově mimo s mojím postupem.
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22404
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

14. 4. 2016, 6:26

no zacal bych treba tim zda tvuj atmel umi sin() a cos()
no a tim asi i skoncis
Vsechna prava na chyby vyhrazena (E)
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

14. 4. 2016, 6:35

Můžete mi víc poradit nejsem specialista na matiku ani CNC začal jsem s tím abych si mohl dělat plošné spoje. Potřeboval bych vís vysvětlit jak teda vypočítat x a y v případě třeba příkazu X100 Y100 I50 J50. Ano můj atmel umí sin a cos.
Uživatelský avatar
robokop
Site Admin
Příspěvky: 22404
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

14. 4. 2016, 6:57

urcite to umi atmel nebo to pocita ejaka knihovna v C?

v realu se to prave dela o dost jinak napocitas si tabulku sinu a cosinu treba po 1 stupni pomoci softwarove knihovny nekdy v dobe kdy incializujes procesor
pak ty hodnoty prokladas useckama
to je +- dost presne na spoustu pouziti
zavolat knihovni (nehardwarove) sin/cos v dobe kdy generujes kroky by nebylo moc dobre
Vsechna prava na chyby vyhrazena (E)
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

14. 4. 2016, 7:01

Proč ne v runtime?
A jinak nejde prostě spočítat jaká má být další souřadnice pro X a Y před uskutečněním kroku motoru?
A jak teda vytvořit tabulku sinu a cosinu? tuším asi 2dimensionální array a do něho dosadit pomocí sin a cos hodnoty?
Uživatelský avatar
azamo
Příspěvky: 604
Registrován: 11. 4. 2014, 7:43
Bydliště: Zlín

14. 4. 2016, 7:02

Proč nepoužiješ něco hotového ?
Třeba https://github.com/grbl/grbl/wiki
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

14. 4. 2016, 7:12

Ten Github vypadá celkem zajímavě díky ale nicméně právě že je to hotové chtěl bych to mít celé vlastní silou popřípadě s pomocí ostatních :-)
Jinak snažím se najít jestli to neumí nějaká knihovna ale zatím jsem našel jen abych použil sin a cos s rádiusem a uhlem.
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

14. 4. 2016, 7:14

A ten Github zdá se že nepodporuje Atmega16 nebo tam nikde aspoň nevidím jestli ano. A navíc asi by se mi tam další knihovna nemusela vejít jsem na 67% místa pro program a ještě mi tam nějaké funkce chybějí.
bronek999
Příspěvky: 521
Registrován: 6. 3. 2014, 6:50

14. 4. 2016, 7:51

Kruh sa da kreslit aj bez sin,cos.
Aj v tom grbl myslim su procedury ktore mozes pouzit ako vzor. Alebo si daj do googlu c draw circle algoritm.
V telefone mi to nejde vlozit.
t256
Příspěvky: 2837
Registrován: 19. 1. 2012, 4:49

15. 4. 2016, 5:50

Spocitej si nejprve jestli to vubec stihnes v realnem case vypocitat. Pokud das posuv rekneme 3m/min, sroub se stoupanim 5mm, 16xmikrokrok, tak ti mezi pulzy ktere posilas driveru krokace zbyde nekolik malo stovek taktu hodin procesoru (ATmega prilis neznam, ale vykonem zrovna neoplyva).
prochaska
Sponzor fora
Příspěvky: 8167
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

15. 4. 2016, 5:36

Taky se dá použít algoritmus, který se používal v dávnověku, kdy byly řídící systémy stavěné z TTL obvodů. Takový hardwarový kvadratický interpolátor je jenom kaskáda sčítaček, kde do registru X2 se pořád přičítá konstanta, například 1 (takže hodnota X2 je postupně 1, 2, 3, 4, 5, ...) a do registru X1 se přičítá hodnota X2 (takže X1 je postupně 0, 1, 3, 6, 10, 15, ...). Obdobně, ale v obráceném sledu se totéž dělá s Y2 a Y1. Vektor [X1, Y1] tak postupně obsahuje souřadnice bodů ležících na jednom kvadrantu kružnice, mezi nimiž se již interpoluje lineárně. Z toho je taky krásně vidět, proč jsou v G-kódu od samého počátku funkce G17, G18, G19 (jen přepínaly se kterými dvěma ze tří registrů se pracuje) a proč se kruhový oblouk přednostně programuje formou počátek, konec, radius, smysl (konec oblouku určuje jednoduchý komparátor a nic se nemusí vypočítávat, radius se zase přímo použije jako druhá diference).
Aleš Procháska
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

16. 4. 2016, 11:06

Prosím ještě zkoušel jsem do simulátoru napsat následující
G02 X50 Y50 I30 J10
G01 X0 Y0
z důvodu jestli správně chápu kreslení rádiusů s příkazem I a J
vytvořilo mi to viz obrázek příloha.
Neměl by koncový bod rádiusu ležet na přímce od bodu X0,Y0 a X50,Y50_?
Nebo špatně chápu ten příkaz?
Přílohy
obr1.png
prochaska
Sponzor fora
Příspěvky: 8167
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

16. 4. 2016, 11:24

Tohle se obvykle řeší tak, že když koncový X, Y neleží (skoro) přesně na kružnici dané poloměrem R a souřadnicemi středu I, J tak má přednost R a udělá to oblouk z aktuální pozice na pozici X, Y o poloměru R a na I, J se to vykašle. Jinými slovy, pokud víš R, nemusíš už vypočítávat souřadnice středu a ani je do příkazu psát. Pokud naopak víš jen I, J, nemusíš dopočítávat R.

Pokud takový oblouk pomocí X, Y, R nejde zkonstruovat, řs zpravidla hlásí chybu.

Ale můžeš to udělat i jinak, G kód není zrovna moc jednotný :-) Jedna z možností je například zastavení interpolace v okamžiku, kdy jedna ze souřadnic dosáhne buď X nebo Y, i když bod X,Y přímo neleží na oblouku.
Aleš Procháska
hlinskoelektrikar
Příspěvky: 8
Registrován: 14. 4. 2016, 6:10

16. 4. 2016, 11:42

No v podstatě mi jde o to, abych pochopil chování simulátoru na tento příkaz a naprogramoval stejně můj řídící mikrokontrolér který tuto proceduru bude provádět. Jinak příkazy psát já nebudu jsou generované automaticky z programu na převod například z obr do GCODE takže jestli je tam místo R použito I a J musí to podle toho jet.

Takže bych potřeboval vědět jak je možné že simulátor přejede přímku mezi X0,Y0 a X50,Y50_?
Když to řeknu ještě takto jak přišel simulátor na to že má jet ještě x bodů pod přímku vždyť příkazem X50 Y50 I30 J10 neudávám zvlášt délku oblouku ale jen rádius daný I a J takže by měl automaticky končit na té přímce ne?
prochaska
Sponzor fora
Příspěvky: 8167
Registrován: 16. 7. 2006, 12:33
Bydliště: Praha Bohnice + Roudnice nad Labem
Kontaktovat uživatele:

16. 4. 2016, 12:51

Aha, já odpovídal asi na něco trochu jiného než se ptal, myslel jsem, že píšeš ten simulátor.

S tím simulátorem na obrázku mi to taky není moc jasné. Asi nastal ten případ, kdy si to autor může vyřešit tak chce, protože chování v případě, kdy ta kružnice nevychází přesně, není definováno. Případá mi to, jako kdyby kreslil oblouk po segmentech a v okamžiku, kdy zjistil, že se na konec nedostane obloukem (hodnota x začala klesat, takže je jasné, že na konec už nikdy nedojede), tak to vzal přímo :-) Obecně nemusí na spojnici bodů končit, už proto, že to je výpočetně složité.
Aleš Procháska
Odpovědět

Zpět na „Ostatní software“