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
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.
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.
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.
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!
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
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.
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.
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
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.
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
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.
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
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
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
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
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!
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.
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
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
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
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
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.
Egon D. schrieb: > Normalerweise gibts eine Funktion atan2 Wieder etwas gelernt. Damit kann man sich ein paar unangenehme Fallunterscheidungen ersparen.
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
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?
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
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
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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.