Forum: Mikrocontroller und Digitale Elektronik Bascom CNC G-Code


von Lothar K. (lothark)


Lesenswert?

Hallo,

ich habe mir vor einigen Jahren mal eine Leiterplattenbohrmaschine 
gebaut.
Als Steuerung verwende ich einen ATMega32. Das Programm läuft unter 
BASCOM. War wegen der Komplexität für mich einfacher als Assembler. (Das 
ganze Programm verbraucht erst 40% des Speichers)

Die Schnittstelle zur Steuerung erfolgt seriell und funktioniert 
perfekt.

Meine Software setzt normalen G-Code in einen für meine Steuerung 
lesbaren String um. Ich übertrage

3 Zeichen Programm, (Entscheidung, welche Select-Anweisung umgesetzt 
wird)
6 Zeichen X 4,2 Stellen
6 Zeichen Y 4,2 Stellen
6 Zeichen Z 4,2 Stellen
4 Zeichen Speed un µs

Der String hat also stets eine feste Größe vom 25 Zeichen.

Der Prozessor entscheidet anhand der ersten 2 Zeichen, welche Routine er 
abarbeiten soll. Nach Beenden der Routine sendet der Controller eine 
Kennung an den Computer und dieser sendet danach den nächsten G-Code 
Befehl.
Die Größe der Rampe berechnet der Controller intern.

Ob eine richtige CNC-Steuerung so arbeitet, weiß ich nicht. Funktioniert 
aber hochgenau,


Für die Achsen habe ich Spindeln mit 1mm Steigung und die Motoren haben 
400 Stepps. Dadurch ergibt sich eine hohe (theoretische) Genauigkeit. 
Optische Ungenauigkeiten der Bohrungen sind nicht erkennbar.

Jetzt habe ich mir eine kleine Proxxon zugelegt und an die 3 Achsen 
Stepper gefriemelt.

Die Fräse arbeitet sehr gut mit der Steuerung. Jetzt stehe ich aber vor 
einem Problem:

Den G-Code G2 kann ich nicht umsetzen.
Einen Vollkreis fräsen habe ich implementiert und war mittels Sinus und 
Cosinus einfach. Der Kreis ist sogar fast Rund. Bei 15 mm Durchmesser 
4/10el von X zu Y. Damit kann ich für meine Belange leben.

Im Moment habe ich keine Ahnung, wie ich einen Teilkreis, beginnend von 
X0/X0 nach X1/Y1 mit vorgegebenem Radius. Der Bresenham-Algorithmus ist, 
so denke ich, hier nicht anwendbar.
Hat jemand so was schon mal gemacht? Vielleicht gibt es ja hier sogar 
jemanden, der das schon mal programmiert hat. Natürlich soll die 
Berechnung nur über 2 Achsen, (X/Y) erfolgen.

Danke schon mal an alle die, welche sich den Text bis unten durchgelesen 
haben.

Gruß LotharK

von Walter T. (nicolas)


Lesenswert?

Lothar K. schrieb:
> Der Bresenham-Algorithmus ist,
> so denke ich, hier nicht anwendbar.

Tatsächlich ist er das. Der Standard-G-Code für G02/03 mit Offset I,J 
ist ja genau so gebastelt worden, dass I und J schon die passenden 
Parameter für den Algorithmus sind.

Beim Vollkreis interpolierst Du die Gleichung x^2 + y^2 = const. Beim 
Teilkreis dagegen (x-i)^2 + (y-j)^2 = const. bis zur Abbruchbedingung 
Zielposition.

Beitrag #5710250 wurde von einem Moderator gelöscht.
von Walter T. (nicolas)


Lesenswert?

Mist. Meine Bearbeitung meines Beitrags von oben wurde von der 
Forensoftware geschluckt. Ich wollte ergänzen:

Ich gehe mal davon aus, daß Du nicht den Wikipedia-Bresenham nutzt, der 
immer einen Schritt in x-Richtung erzeugt und an den Quadranten 
gespiegelt wird, sondern den, der von einem unabhängigen Parameter 
Schritte in x und y erzeugt. Ansonsten hättest Du ja schon beim 
Vollkreis nicht hinbekommen - schließlich läßt sich an einer Steuerung 
die Bahn nicht spiegeln und die Bahngeschwindigkeit wäre auch nicht mal 
ansatzweise konstant.

von Egon D. (Gast)


Lesenswert?

Lothar K. schrieb:

> Einen Vollkreis fräsen habe ich implementiert und
> war mittels Sinus und Cosinus einfach.

Hmm. Also das würde ich mir überlegen. Du berechnest
tatsächlich Sinus und Cosinus für jeden einzelnen
Bahnpunkt?
Bei Kreisapproximation kann man allen möglichen
Schabernack machen, zumal Du ja nur eine endliche
Genauigkeit brauchst. Wahrscheinlich wäre sogar eine
Polygonzug-Näherung machbar, wenn man hinreichend
viele Stützstellen nimmt.

Eine praktikablere Variante wären Splines. Das läuft
rechentechnisch letztlich darauf hinaus, Sinus und
Cosinus durch eine quadratische bzw. kubische Parabel
anzunähern.

Deine Sinus/Cosinus-Varianten muss sich aber auch
entsprechend pimpen lassen. Man muss halt Anfangs-
und Endpunkt in einen entsprechenden Winkel
umrechnen und sich über den richtigen Umlaufsinn
Gedanken machen.

Bissl exotisch zur Kreisberechnung ist der Höhensatz,
aber auch das ist numerisch schön machbar.

von Micha (Gast)


Lesenswert?

Lothar K. schrieb:
> Das Programm läuft unter BASCOM. War wegen der Komplexität für mich
> einfacher als Assembler. (Das ganze Programm verbraucht erst 40% des
> Speichers)

Ja dann poste doch mal den Code!

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Den Teil mit Sinus/Kosinus habe ich tatsächlich überlesen. Ich habe bei 
CNC automatisch an die klassischen Schrittverfahren gedacht. Mit 
trigonometrischen Funktionen ist es doch noch einfacher.

Der Startwinkel phi = arctan(j/i) + pi (bitte für alle vier Quadranten 
überprüfen), und die Stoppbedingung ist, dass die aktuelle Position 
hinreichend dicht am Zielpunkt liegt.

: Bearbeitet durch User
von STK500-Besitzer (Gast)


Lesenswert?

Walter T. schrieb:
> Der Startwinkel phi = arctan(j/i) + pi (bitte für alle vier Quadranten
> überprüfen), und die Stoppbedingung ist, dass die aktuelle Position
> hinreichend dicht am Zielpunkt liegt.

Wenn man den Start- und den Endpunkt hat, kann man doch den 
Kreismittelpunkt  bestimmen (der hat ja zu beiden Punkten den selben 
Abstand ==> Pythagoras).
Dann braucht man nur noch den Radius (beide Punkte sollen ja auf einem 
Kreis mit dem vorgegebenen Radius r liegen).

Die Teilkreissegmente kann man dann durch simple if-Abfragen bestimmen 
(links/rechts, ueber/unter Mittelpuhnkt). Man muss halt die 
"Drehrichtung" des Kreises bzw. des Fraseser beachten.

Meiner Meinung nach ist kein Arcus-Irgendwas noetig.

von Walter T. (nicolas)


Lesenswert?

STK500-Besitzer schrieb:
> kann man doch den
> Kreismittelpunkt  bestimmen

Das ist sogar noch einfacher: Der Kreismittelpunkt ist die letzte 
Stop-Position x, y + i, j.

Wenn er über Winkelfunktionen interpolieren will, braucht er irgendwie 
den Startwinkel. Praktischerweise kann er das schon offline vor dem 
Bewegungsvorgang berechnen, weil alle Positionen bekannt sind. Aber um 
irgendeine inverse Winkelfunktion (und wenn es über Newton-Verfahren 
etc. aus sin, cos, tan berechnet wird) wird er nicht herumkommen.

Deswegen wird normalerweise nicht über die Winkelfunktion interpoliert, 
sondern die Kreisgleichung x^2 + y^2 - r^2 = 0 direkt interpoliert.

von Lothar K. (lothark)


Lesenswert?

Hallo,

Danke für Eure Beiträge. Ich hätte nicht gedacht, dass das so viele 
tangiert.

@c-hater
warum greifst Du mich so dermaßen an?

c-hater schrieb im Beitrag #5710250:
> dass schon dein Kreis
> im zusammengeklauten (aber offensichtlich nicht verstandenen) Code
> eigentlich vier Mal den Bresenham benutzt. Nämlich für jeden Quadranten
> des Kreise einen.

Das was ich bisher programmierte, ist sicher nirgends geklaut.

Das was ich programmierte, ist mein Wissen (oder Unwissen)

Den Kreis berechne ich so:

 For I = 0 To Pi Step Stp
   Xfakt = Sin(i)
   Xfakt = Xe * Xfakt

   Yfakt = Cos(i)
   Yfakt = Xe * Yfakt
   Xtmpe = Lcdx - Xtmpe
   If Xtmpe > 0 Then Cwx = 0 Else Cwx = 1 ' Richtung X
   Xtmpe = Abs(xtmpe)

   Ytmpe = Lcdy - Ytmpe
   If Ytmpe > 0 Then Cwy = 0 Else Cwy = 1 ' Richtung Y
   Ytmpe = Abs(ytmpe)

   Do

   If Xtmpe > 0 Then
   Taktx = 1
   Xtmpe = Xtmpe - 1
   End If

   If Ytmpe > 0 Then
   Takty = 1
   Ytmpe = Ytmpe - 1
   End If

   Waitus Taktpause
   Taktx = 0
   Takty = 0
   Waitus Ss

Das ist nur ein Auszug.....Ich sehe hier nirgends Teile eines Bresenham.
Ob der Code gut ist - sicher nicht.
Übrigens, die Ungenauigkeit des Kreises resultiert aus dem Umlenkspiel 
der Proxxon.
Würde ich den Tisch fester einstellen, müsste ich stärkere Motoren 
nehmen. Ich werde aber real nie etwas damit fräsen. Nachdem alles 
funktioniert, verschwindet die Maschine in der Versenkung. Wenn ich 
wirklich ein Frästeil benötige, lasse ich es bei uns fertigen. :-)

und macht mich bitte nicht fertig. Meine Schulzeit liegt zugegebener 
Maßen weit über 40 Jahre zurück.

Das Ganze mache ich nicht, weil ich was für die Welt entwickeln will, 
sondern aus Freude am basteln - und wenn sich da was kreisförmig :-) 
bewegt, ist das OK für mich.

Außerdem will ich das bauen um zu verstehen und nicht weil ich gern 
fremden Code klaue.

Die Ansätze, welche von den echt konstruktiven Beiträgen kommen, werde 
ich mir mal reinziehen und versuchen, diese in Bascom umzusetzen.

Dank euch allen recht herzlich.

Eine Bitte an alle, die mich jetzt versuchen zu diffamiren. Ihr müsst 
mir nicht beweisen, dass ihr besser seid. Ich bin wirklich nur ein Laie 
mit Bastel-Ambitionen.

@EgonD Klasse Beitrag, aber doch bissel zu hoch für mich. ehrlich!

@Walter T Dir einen besonderen Dank. Ich denke, mit deinen Ansätzen kann 
ich es schaffen. Echt klasse Beiträge!!!

@Micha warum sollte ich das tun? Der steht doch gar nicht zur Debatte. 
Selbst bei dem kurzen Codeschnipsel wird es schon wieder Postings 
hageln, was da alles falsch und schlecht ist. Nene - das tue ich mir 
nicht an. Ich kenne die Forenbeiträge zur Genüge. Das tue ich mir nicht 
an.

Gruß LotharK

: Bearbeitet durch User
von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Lothar,

sei froh, bisher hat sich keiner über BasCom aufgeregt. -> Damit kann 
mann doch so etwas nicht machen! ;-)
Ich aber mache das in ASM/Pascal/Delphi....

Kleiner Tipp: Schreibe ein PC-Programm mit den selben 
Berechnungsfunktionen und lasse das Ergebnis darstellen.
Anbei mein Prog. Mit File Datei laden und mit Draw zeichnen lassen.
Dabei ist auch eine Datei die ich mal irgendwo "geklaut" habe, um zu 
sehen wie es mit Daten von anderen arbeitet.

Weiterhin viel Erfolg.

Mit Gruß
Peter

Beitrag #5711070 wurde von einem Moderator gelöscht.
von Lothar K. (lothark)


Lesenswert?

Hallo Pieter,

in der Tat mache ich das genau so. Ich verwende für solche Tests noch 
VB6. Dort ist das so easy: Screen definieren und X/Y als PSET(X,Y) auf 
dem Bildschirm ausgeben. Ohne das hätte ich die Kreisfunktion wohl nicht 
so hinbekommen.
In .NET muss man schon bissel mehr tun.

Bascom finde ich gar nicht so schlecht. Die letzten Jahre habe ich nur 
noch Bascom zum programmieren und AVR Studio 4 zum flashen benutzt. Da 
finde ich das Studio unschlagbar - ist aber vielleicht nur meine 
Meinung.

Hallo Mahner,
danke für deine aufbauenden Worte. In den 90ern habe ich selbst mal ein 
Forum mit moderiert. (VB-Fun von Detlef Schubert) Ich habe das dann 
irgend wann mal gelassen. Zu viele 20jährige mit 30 Jahren 
Berufserfahrung.

Ciao Lothar

von Walter T. (nicolas)


Lesenswert?

Lothar K. schrieb:
> Das ist nur ein Auszug.....Ich sehe hier nirgends Teile eines Bresenham.
> Ob der Code gut ist - sicher nicht.

Ich kann kein Basic - aber der erste Schritt zur Verbesserung wäre 
sicherlich, "code"-Tags im Forum zu nutzen, damit die Einrückung nicht 
verloren geht. Ich kenne jetzt Basic nicht genug, ob man bei modernen 
Varianten unbedingt die schließenden Elemente benötigt, aber für mich 
sieht es erst einmal so aus, als ob sie fehlten. Bei vernünftiger 
Einrückung vergisst man diese nicht so leicht.
1
For I = 0 To Pi Step Stp
2
    Xfakt = Sin(i)
3
    Xfakt = Xe * Xfakt
4
    
5
    Yfakt = Cos(i)
6
    Yfakt = Xe * Yfakt
7
    Xtmpe = Lcdx - Xtmpe
8
    If Xtmpe > 0 Then 
9
        Cwx = 0 
10
    Else 
11
        Cwx = 1 ' Richtung X
12
        
13
    Xtmpe = Abs(xtmpe)
14
    
15
    Ytmpe = Lcdy - Ytmpe
16
    If Ytmpe > 0 Then 
17
        Cwy = 0 
18
    Else 
19
        Cwy = 1 ' Richtung Y
20
        
21
    Ytmpe = Abs(ytmpe)
22
    
23
    Do
24
    
25
        If Xtmpe > 0 Then
26
            Taktx = 1
27
            Xtmpe = Xtmpe - 1
28
        End If
29
        
30
        If Ytmpe > 0 Then
31
            Takty = 1
32
            Ytmpe = Ytmpe - 1
33
        End If
34
        
35
        Waitus Taktpause
36
        Taktx = 0
37
        Takty = 0
38
        Waitus Ss

Bei den Namen.... Xe scheint von der Formel ein Radius zu sein, sieht 
aber vom Variablennamen nach irgendetwas aus, was zur X-Koordinate 
gehört.

Dann gibt es noch den folgenden Klassiker: 
https://nerd4life.studio/blogs/nerd4life-comic/what-makes-code-bad

Und zum dritten: In der Schleife wird an zwei Stellen gewartet, ohne daß 
das, was dazwischen passiert, irgendwelche Timing-Anforderungen hat. Ob 
Dein Bascom eine Art Scheduler im Hintergrund hat, so dass Warten keine 
böse Sache ist, oder ob das wie bei klassischer µC-Programmierung ein 
absolutes No-Go ist, kann ich nicht beurteilen. Aber spontan würde ich 
alle Wartezeiten, wenn schon nicht ganz vermeiden, dann so weit wie 
möglich zusammenpacken, um die Übersicht nicht zu verlieren.

Lothar K. schrieb:
> Das Ganze mache ich nicht, weil ich was für die Welt entwickeln will,
> sondern aus Freude am basteln - und wenn sich da was kreisförmig :-)
> bewegt, ist das OK für mich.

Das ist sinnvoll. Es gibt schon ganz gute Open-Source-Steuerungen, an 
die man als Einzelgänger eh nicht dran kommt. GRBL in klein, LinuxCNC in 
groß. Aber man beim Selbermachen viel lernen.

Lothar K. schrieb:
> Eine Bitte an alle, die mich jetzt versuchen zu diffamiren. Ihr müsst
> mir nicht beweisen, dass ihr besser seid. Ich bin wirklich nur ein Laie
> mit Bastel-Ambitionen.

Tja, leider ist der Ton hier sehr rauh - aber nicht wohlmeinend-rauh, 
sondern eher toxisch-rauh. Vielleicht bist Du mit Deinem Projekt in der 
Zerspanungsbude oder in Plexxarts Bastelstube besser aufgehoben? Da gibt 
es auch mehrere User, die aktuell oder in der Vergangenheit ein 
ähnliches Projekt durchgezogen haben. Außerdem ist der Umgangston unter 
Metallern und Handwerkern generell etwas angenehmer als mit Softwerkern. 
Das ist lustigerweise auch wenig im echten Leben ähnlich, aber da findet 
man für gewöhnlich in 10...60 Minuten einen Modus Operandi zur 
konstruktiven Kommunikation. Im Forum klappt das nicht.

von Lothar K. (lothark)


Lesenswert?

Hallo WalterT,

danke für den Hilfeversuch, aber ging bissel in die Hose. lach

Das mit dem Formatieren - OK, ich sehe soeben erst, wo das hier geht. 
Ist wohl so groß, dass ich es übersah.

Der Code ist ein Auszug aus BASCOM. Also kommt in den Controller. Das da 
Variablen zweckentfremdet sind hat den Grund, dass ich natürlich nicht 
unendlich viele im Prozessor definieren kann.

Das Timing ist natürlich einer der wichtigsten Punkte. Der regelt die 
Vorschubgeschwindigkeit.

Übrigens, als Hilfesuchender und Bittsteller in einem Forum kann man 
nichts richtig machen. Selbst in perfekt funktionierendem Code wird der 
eine oder andere Fehler hineininterpretieren.

Für meinen Teil habe ich ja gute Hilfe bekommen. Leider konnte ich diese 
mangels Wissen noch nicht umsetzen. Den Bresham-Code aus der WIKI habe 
ich am PC umgesetzt, verstehe aber nicht, wie ich diesen umschreibe, 
dass er von 0/0 zu X/Y fährt.


Gruß Lothar

von Walter T. (nicolas)


Lesenswert?

Lothar K. schrieb:
> Den Bresham-Code aus der WIKI habe
> ich am PC umgesetzt, verstehe aber nicht, wie ich diesen umschreibe,
> dass er von 0/0 zu X/Y fährt.

Der Standard-Bresenham funktioniert so, dass ein y aus einem x gebildet 
wird (und daraus eine Steigung dy/dx gebildet wird). Der Pseudocode 
kommt von Wikipedia:
1
plotLineLow(x0,y0, x1,y1)
2
  dx = x1 - x0
3
  dy = y1 - y0
4
  yi = 1
5
  if dy < 0
6
    yi = -1
7
    dy = -dy
8
  end if
9
  D = 2*dy - dx
10
  y = y0
11
12
  for x from x0 to x1
13
    plot(x,y)
14
    if D > 0
15
       y = y + yi
16
       D = D - 2*dx
17
    end if
18
    D = D + 2*dy

Du willst X und Y unabhängig berechnen. Also führst Du einen 
unabhängigen Zeit-Parameter T ein, der die Stelle von X einnimmt. Dann 
werden X und Y unabhängig voneinander in Abhängigkeit von T getaktet. In 
Pseudocode sieht das ungefähr so aus (Tippfehler sind garantiert 
enthalten):
1
plotLineXY(t0,x0,y0,t1,x1,y1)
2
  dt = t1 - t0
3
  dx = x1 - x0  // Wichtig: dt >> dx
4
  dy = y1 - y0  // Wichtig: dt >> dy
5
6
  // Initialisierung x(t)
7
  xi = 1
8
  if dx < 0
9
    xi = -1
10
    dx = -dx
11
  end if
12
  Dx = 2*dx - dt
13
  x = y0
14
  
15
  // Initialisierung y(t)
16
  yi = 1
17
  if dy < 0
18
    yi = -1
19
    dy = -dy
20
  end if
21
  Dy = 2*dy - dt
22
  y = y0
23
24
  for t from t0 to t1
25
    plot(x,y)
26
    
27
    // Stepping X
28
    if Dx > 0
29
       x = x + xi
30
       Dx = Dx - 2*dt
31
    end if
32
    Dx = Dx + 2*dx
33
    
34
    // Stepping Y
35
    if Dy > 0
36
       y = y + yi
37
       Dy = Dy - 2*dt
38
    end if
39
    Dy = Dy + 2*dy

Je größer dt gegenüber dx und dy ist, desto genauer sind die Schritte.
Nebeneffekt: Du hast schon einen Geschwindigkeitsparameter, der bei den 
Beschleunigungsrampen später hilfreich sein wird.

Da bitte darauf achten, den "Divisionsrest" Dx und Dy ebenfalls 
upzudaten, wenn dt geändert wird - aber das ist ein Thema, das erst 
später interessant wird.


P.S.: Doch kein grober Fehler drin. In Matlab ist das Ergebnis wie 
erwartet.

: Bearbeitet durch User
von Lothar K. (lothark)


Lesenswert?

Hallo Walter T.

sicher hast Du es gleich dicke mit mir. Den BRESENHAM verstehe ich 
teilweise und bei einer Linie ist das ja einfach.

Ich habe nur das absolute Problem mit dem Teilkreis. Bresenham 
funktioniert im 1/8el Kreis. So habe ich es jedenfalls in der WIKI 
verstanden.

Mein Problem ist: Ich habe I und J. Das ist der Kreismittelpunkt. Dann 
habe ich die Ausgangsposition X und Y. also die Stelle, an der der 
Fräser steht.
Dann habe ich noch X und Y, die Position, wo ich am Ende hin will. Der 
Beginn kann ja auf dem Kreis irgendwo zwischen  0 und 359° liegen.

Also zwischen 0 und 2PI. Wenn ich anhand der vorhandenen Daten (180° 
wären dann quasi PI) den Einsprung-Punkt für die Berechnung hätte, 
könnte ich mit Sinus und Cosinus den Kreis bis zur Abbruchbedingung X/Y 
fahren. Leider ist mein Mathe so lange her, dass ich echt "Jugend 
Forscht" betreiben muss. Da ist in der Vergangenheit zu viel 
verschwunden.

Ich weiß, mein Lösungsansatz ist unkonventionell, aber sehr leicht 
umzusetzen.

Gruß LotharK

von Walter T. (nicolas)


Lesenswert?

Okay, das sind jetzt zwei Themen. Zum Ansatz mit den Trigonometrischen 
Funktionen habe ich ja schon oben die Lösung gemalt.

Lothar K. schrieb:
> Also zwischen 0 und 2PI. Wenn ich anhand der vorhandenen Daten (180°
> wären dann quasi PI) den Einsprung-Punkt für die Berechnung hätte,

Walter T. schrieb:
> er Startwinkel phi = arctan(j/i) + pi


Zum Kreis mit dem Bresenham:

Lothar K. schrieb:
> Ich habe nur das absolute Problem mit dem Teilkreis. Bresenham
> funktioniert im 1/8el Kreis. So habe ich es jedenfalls in der WIKI
> verstanden.

Die Wikipedia-Variante funktioniert nur im 1/8-Kreis, weil er als y(x) 
gebildet wird. Da dy kleiner als dx sein muss, funktioniert das nur im 
untersten Oktant (ab da ist nämlich dx = dy).

Wird stattdessen (genau wie bei der Gerade) x(t), y(t) gebildet, 
funktioniert er rundherum. Da muß man nur eben zweimal x und y 
unabhängig interpolieren. Dafür entfallen die ganzen lästigen 
Fallunterscheidungen.

Man kann jede Gleichung von einem einzigen Parameter mit dem 
Bresenham-Algorithmus abbilden. Einzige Einschränkung: die unabhängige 
Größe muss immer schneller wachsen als die Abhängige.

: Bearbeitet durch User
von Thomas Malwinter (Gast)


Lesenswert?

Hallo Lothar,

ich versuche auch gerade mit BASCOM einen G-Code-Treiber zu basteln!

Wärst du so nett mit mir deinen Code zu teilen? Gerne auch per PN!

von c-hater (Gast)


Lesenswert?

Lothar K. schrieb:

> Ich habe nur das absolute Problem mit dem Teilkreis. Bresenham
> funktioniert im 1/8el Kreis. So habe ich es jedenfalls in der WIKI
> verstanden.

Das hast du falsch verstanden. Bresenham funktioniert für einen 
Viertelkreis.

Für optimale Ergebnisse will man allerdings den berechneten Step immer 
kleiner halten als den Vorgabestep. Und dann ist's allerdings wirklich 
nur noch ein Achtelkreis.

von Lothar K. (lothark)


Lesenswert?

Hallo Thomas,

gerne zeige ich Dir meinen Source-Code.

PN wäre OK.

Gruß Lothar

von Lothar K. (lothark)


Lesenswert?

Hallo Walter T,


Walter T. schrieb:
> Startwinkel phi = arctan(j/i) + pi

Danke, ich werde es mal morgen versuchen umzusetzen.
Bist Du deutscher Mathe-Olympiade Gewinner?
Das fließt so aus dir raus.... Respekt

Das ist doch kaum Allgemeinwissen - Oder???

Gruß Lothar

von Walter T. (nicolas)


Lesenswert?

Lothar K. schrieb:
> Das ist doch kaum Allgemeinwissen - Oder???

Naja. Die Kreisformeln sind noch Schulwissen und noch einmal gründlich 
wiederholt im ersten Semester Grundstudium Maschinenbau. Da ist bei mir 
noch keine 20 Jahre her. Das wäre irgendwie peinlich, das jetzt schon 
vergessen zu haben.

Beim CNC-Kram sieht es anders aus: Die Feinheiten bei der Rasterung 
kennt man sowieso nur dann, wen man mal ein ähnliches Projekt mal selbst 
angefangen hat. Ich stecke gerade in einem ähnlichen Projekt. Da es in 
einem Werkzeugforum allerdings besser aufgehoben ist als in einem 
Mikrocontrollerforum, und auch noch kein abgeschlossenes Projekt ist, 
habe ich hier bislang mein nur Eval-Board vorgestellt: 
Beitrag "Re: Zeigt her eure Kunstwerke (2017)"

: Bearbeitet durch User
von Lothar K. (lothark)


Lesenswert?

Hallo,

<Startwinkel phi = arctan(j/i) + pi

Da stimmt was nicht, oder?

Ein typischr G2-Code sähe so aus. (Ohne Zeilennummer)

G02 X10.0000 Y30.0000 I0.0000 J10.0000

Ich müsste 10/0 rechnen.

Oder sind I und J andere Werte in der Formel Arctan(j/i) + pi?

Wenn ich den Anfangspunkt auf dem Kreis finde, könnte ich diesen als 
Bezugspunkt 0 verwenden und mittels Schleife

For I= phi TO Phi +2 * Pi Step 0.01
    X1=Sin(i) * Radius
    Y1=Sin(I) * Radius
    If X=X1 AND Y=Y1 Then Exit For
Next


bis zur Übereinstimmung von X/Y fahren.

Ich tue mich immer noch schwer, den Punkt auf dem Kreis zu finden.

Gruß Lothar

: Bearbeitet durch User
von Walter T. (nicolas)


Lesenswert?

Lothar K. schrieb:
> Ein typischr G2-Code sähe so aus. (Ohne Zeilennummer)
>
> G02 X10.0000 Y30.0000 I0.0000 J10.0000

Der sagt natürlich gar nichts aus ohne die Zeile davor (sonst kennt man 
den aktuellen Punkt ja nicht). Praktischerweise kann man aber schon im 
Kopf sagen, daß die Lösung für I=0 bei pi/2 liegen muß. Da ist der 
Tangens nicht mehr definiert.

Mal die geometrischen Verhältnisse doch einfach mal auf kariertes 
Papier.

: Bearbeitet durch User
von Egon D. (Gast)


Lesenswert?

Lothar K. schrieb:

> > Startwinkel phi = arctan(j/i) + pi
>
> Da stimmt was nicht, oder?

Dochdoch, die Formel passt schon -- nur kann man
das natürlich so nicht 1:1 in ein Programm
übernehmen, weil der Tangens bei 90° eine Polstelle
hat.


> Ich müsste 10/0 rechnen.
>
> Oder sind I und J andere Werte in der Formel
> Arctan(j/i) + pi?

Nee. Normalerweise gibts eine Funktion atan2, der
man die Argumente einzeln übergibt. Da tritt das
Problem nicht auf.


> Wenn ich den Anfangspunkt auf dem Kreis finde,
> könnte ich diesen als Bezugspunkt 0 verwenden
> und mittels Schleife
>
> For I= phi TO Phi +2 * Pi Step 0.01
>     X1=Sin(i) * Radius
>     Y1=Sin(I) * Radius
>     If X=X1 AND Y=Y1 Then Exit For
> Next
>
> bis zur Übereinstimmung von X/Y fahren.

Naja. Ich verstehe nicht, warum Du die Schleife
unbedingt um 360° (=2pi) laufen lassen willst.
Wenn Dein Startpunkt bei 90° und der Endpunkt
bei 120° liegt, dann lass doch die Schleife
einfach von 90° bis 120° laufen, und alles ist
gut.

von Walter T. (nicolas)


Lesenswert?

Egon D. schrieb:
> Normalerweise gibts eine Funktion atan2

Wieder etwas gelernt. Damit kann man sich ein paar unangenehme 
Fallunterscheidungen ersparen.

von Lothar K. (lothark)


Lesenswert?

Hallo Egon D,

na ja, klar hast Du Recht. Ich muss nicht 2Pi nehmen, aber bis zur 
Abbruchbedingung fahren wäre für mich einfacher. Ich müßte beide Punkte 
berechnen, wo ich noch nicht mal einen schaffe.

ATan2? Ich freue mich, dass ihr euch unter Mathematikern so gut 
versteht!

Ich scheitere im Moment kläglich mit meinem doch all zu lange 
vergangenem Schulwissen.

Hat denn BASCOM überhaupt die Funktion ATan?

Gruß Lothar

: Bearbeitet durch User
von Pieter (Gast)


Lesenswert?

moin,

ATan2 ist eine Erweiterung von ATAN, hier in Pascal:

Function _ATan2( Y, X:Single): Single;
Begin
  if (x = 0.0) and (y = 0.0)
  then Result := 0.0
  else Begin
       if _ABS(Y) < _ABS(X)
       then Begin
            Result := - _ATan(Y/X);
            if X < 0.0 then Result := Result - HALF_PI
                       else Result := Result + HALF_PI;
            End
       else Begin
            Result :=  _ATan(X/Y);
            if Y < 0.0 then Begin
              if X < 0.0 then Result := Result - PI
                         else Result := Result + PI;
              end
            End
       End;
End;

Sollte auch für BasCom-Leute lesbar sein.

Zu I und J Parametern: diese beziehen sich auf die Position der 
vorhergehenden Zeile. Die Zeile selber hat doch die neuen 
Zielpositionen.

Gruß Peter

@Lothar: mein Prog mal getestet?

von Walter T. (nicolas)


Lesenswert?

Lothar K. schrieb:
> ATan2?

Kannte ich vor zweieinhalb Stunden auch noch nicht. Aber Wikipedia ist 
da sehr auskunftsfreudig.

Lothar K. schrieb:
> Hat denn BASCOM überhaupt die Funktion ATan?

Tja...diese Frage hat vor Jahren schon jemand gestellt und eine typische 
Antwort bekommen:

Beitrag "Bascom atan2"

Vielleicht sagt die BASCOM-Hilfe etwas dazu? Kann man die BASCOM-Hilfe 
eigentlich irgendwo online lesen?

: Bearbeitet durch User
von Lothar K. (lothark)


Lesenswert?

Hallo Walter T,


Walter T. schrieb:
>> G02 X10.0000 Y30.0000 I0.0000 J10.0000
>
> Der sagt natürlich gar nichts aus ohne die Zeile davor (sonst kennt man
> den aktuellen Punkt ja nicht). Praktischerweise kann man aber schon im

Hier muss ich dir aber widersprechen.
Man benötigt keine Zeile davor.

Der Fräser steht aktuell bei X=0/Y=0 fom Werkzeug aus gesehen. Der 
Mittelpunkt liegt bei I=0/J/10. Das sind die X-Y Koordinaten relativ zum 
Fräserstandort.
Die Kreisbahn soll enden bei den Zielkoordinaten X=10 /Y=10.

Die Bascom-Hilfe gibt es sicher online. Ich nutze aber die interne.

@Pieter. Ich hatte mir die 3 Dateien runtergeladen und in ein 
Verzeichnis entpackt. Ich sehe zwar die 2 Dateien mit G-Code, aber nach 
dem Starten des Programms finde ich keine Möglichkeit, die Datei 
einzuladen. Das Kopieren in das Listenfeld brachte auch nichts - leider.

Deinen Code werde ich morgen mal umsetzen. Sieht erst mal gut aus.

Ich danke wirklich allen, die mir hier so mit Rat und Tat helfen. Ich 
werde mir morgen weiter Gedanken machen. Ich bin zuversichtlich, das 
umsetzen zu können.

Ich danke auch allen Störenfrieden, die nun Gott sei Dank einen Bogen um 
den Thread machen. :-)

Gruß LotharK

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

Lothar K. schrieb:
> Die Kreisbahn soll enden bei den Zielkoordinaten X=10 /Y=10.

Lothar K. schrieb:
>>> G02 X10.0000 Y30.0000 I0.0000 J10.0000

Nenn mich Nörgler, aber das wird nicht klappen.

: Bearbeitet durch User
von Pieter (Gast)


Lesenswert?

Hallo Lothar,

>> Mit [File] Datei laden und mit [Draw] zeichnen lassen...

Mit WinXP und Win7 getestet und Du hast einen Bag gefunden, erst nach 
dem laden einer Datei kann diese im Editor bearbeitet und dann 
gezeichnet werden.
[CNC] wird nach Ankopplung der Fräse via USB-HID aktiv und übertägt den 
Editorinhalt zur Fräse.
Besonderheiten:
M06D? -> nimmt den FräserDurchmesser von [Drill].
M06Dx,y wikt direkt.

G4?   -> nimmt die Werkzeugkorrektur von [RadiusKorrektur]
G40/G41/G42 wirken direkt.

#K0_1Is.CNC ist ein Demo, wie die Werkzeugkorrektur in Abhängigkeit von 
der Bearbeitungsrichtung wirkt.
Für I+J könnte man auch R angeben.
Werte von 0 brauchen nicht angegeben werden.


>>Man benötigt keine Zeile davor.

Man muß aber die Position wissen, die dort angegeben ist!

Mit Gruß
Peter

von Walter T. (nicolas)


Lesenswert?

Walter T. schrieb:
> Nenn mich Nörgler, aber das wird nicht klappen.

Mit ein paar Minuten Abstand klingt das schroffer, als es gemeint war.

Laß Dich nicht ins Bockshorn jagen. Das Thema ist komplizierter, als es 
auf den ersten Blick aussieht. Ich habe damals auch viel mit Papier und 
Bleistift geknobelt, bevor das Programm halbwegs das gemacht hat, was 
ich mir erhofft habe.

von Johannes R. (oa625)


Lesenswert?

Hallo!

Für das Prüfen/Editieren/Schreiben kann ich den "NC-Corrector" 
empfehlen:
http://nc-corrector.inf.ua/index_EN.htm

Ich prüfe damit meine NC-Programme und schreibe auch schnell mal eins 
für einfache 2D-Geometrien.

Gruß
JRo

von Lothar K. (lothark)


Angehängte Dateien:

Lesenswert?

Hallo Walter T.

Walter T. schrieb:
> Mit ein paar Minuten Abstand klingt das schroffer, als es gemeint war.

Nene - passt schon. Das ist ja eine ganz andere Liga, nicht so wie jene, 
die nur rummotzen.

Den G-Code habe ich mir ja nicht ausgedacht. Anfangs habe ich welchen 
mit
NC-Corrector geschrieben und mein Ergebnis kontrolliert.

Ich habe mal 2 Dateien angehängt.

In der 2. der G-Code. Ich habe extra diese G-Code Zeile mit verwendet.

Aus der Betrachtung heraus, dass diese Zeile ja auch die 1. sein kann, 
wird eigentlich auch klar, dass es funktionieren muss.

@ HannesR - genau, das ist für solche Zwecke prima geeignet. Zum 
Verstehen einfach großartig.

@Pieter - Klasse Programm. Ich habe es mir mal reingezogen. Einfach 
Spitze.
Auch Dein Programm setzt meinen G-Code korrekt um.
Eine kleine Anmerkung hätte ich noch. Um meine Datei zu testen, musste 
ich diese umbenennen. Einige Programme geben die Datei mit der Extension 
.nc aus. Wie überträgst Du die Daten zu der Maschine? Mein Programm 
erstellt einen String, welchen der Controller versteht und umsetzt. Die 
Koordinaten behandle ich im PC. Keine Ahnung wie das richtig geht und 
wie das andere machen. Würde mich aber stark interessieren.

Ich schaue mir Deine ATan2-Funktion jetzt mal an. Vielleicht komme ich 
einen Schritt weiter.

Gruß Lothar

: Bearbeitet durch User
von Lothar K. (lothark)


Lesenswert?

Hallo,

hiermit danke ich allen, die mir so tatkräftig geholfen haben.

Ich habe mir jetzt mal das ganze Mathematische Thema reingezogen.
War lange her, aber bissel was ist nun wieder da.
(Ich meine die Grundfunktionen +-*/ )


Hier mal noch der Code von Pieter in Visual Basic.

(Vielleicht interessiert es ja den einen oder anderen.)


1
Function ATan2(X As Single, Y As Single) As Single
2
3
Dim Pi As Single
4
Dim Result As Single
5
Pi = 3.1415962
6
7
If (X = 0) And (Y = 0) Then
8
    Result = 0
9
Else
10
    If Abs(Y) < Abs(X) Then
11
        Result = -Atn(Y / X)
12
        If X < 0 Then Result = Result - Pi / 2 Else Result = Result + Pi / 2
13
    Else
14
        Result = Atn(X / Y)
15
        If Y < 0 Then
16
            If X < 0 Then Result = Result - Pi Else Result = Result + Pi
17
        End If
18
    End If
19
End If
20
ATan2 = Result
21
22
End Function


Mit der von Pieter vorgestellten Funktion ermittle ich nun den Anfang 
und das Ende des Teilkreises. Diese Positionen kann ich nun mit Sinus 
und Cosinus abfahren. Stp ist dabei die Genauigkeit des Kreises und wird 
von mir in Abhängigkeit des Radius ermittelt.
1
FOR AnfPos TO EndPos STEP Stp
2
   X = Sin(I) * R
3
   Y = Cos(I) * R
4
   ...... Hier die Glättung für X und Y
5
   ....................................
6
   Wartezyklus für Geschwindigkeit
7
 NEXT


Na ja, das Thema ist richtig lang geworden, wird aber sicher 
nachfolgenden Lesern viel nützen.

Danke und Gruß LotharK

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.