Autor Beitrag
unrealer
Hält's aus hier
Beiträge: 11

Windows Vista
Delphi 2005 Prof
BeitragVerfasst: Mi 22.10.08 22:59 
Hallo alle zusammen,

ich arbeite gerade an einem Programm mit welchem man Servos steuern kann, welche dann einen Kreis beschreiben sollen. Ich habe also zwei Servos (einen für die x-achse und einen für die y-achse) und einen Einstellwinkel von jeweils 0- 105 Grad. Wie beschreibe ich damit einen (fast) perfekten Kreis?
Danke schon mal im voraus !!!!
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Do 23.10.08 00:04 
Wenn Du die Größe des Kreises (Radius r) hast, kannst Du die Koordinaten und damit die Schrittdifferenzen der Motoren mit der Formel dx^2+dy^2=r^2 berechnen. Dabei sind dx und dy die Abstände zum Mittelpunkt.

ub60
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 23.10.08 06:04 
Hallo,

geht es um Modellbauservo's , da Du von einem Drehwinkel schreibst?
Wie wird dann die x/y -Achse angesteuert um eine Linaerbewegung zu erzeugen, siehe Bild.

Gruß Horst
EDIT:
Anbei eine Exceldatei um zu zeigen, wie sich der parallele Abstand d der Linearführung auswirkt.
Optimal ist zwischen 0,5 bis 0,6 x des überstrichenen y-Bereiches der Kurbel/Servohebels .
Ein normaler Kurbeltrieb hat ja d = 0.
0,6 hat ausser bei Endlagen-Winkeln die geringste Abweichung bei (Kurbel/Pleuel = 1 zu 4 )
Einloggen, um Attachments anzusehen!
unrealer Threadstarter
Hält's aus hier
Beiträge: 11

Windows Vista
Delphi 2005 Prof
BeitragVerfasst: Do 23.10.08 21:16 
Danke für eure schnellen Antworten !!!
Diese Formel x^2 * y^2 = r^2 hab ich auch schon gefunden, nur irgendwie ergibt sich bei meinem Quellcode daraus kein Kreis. Hier der Code :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
if mode = true then
 y1_neu:= y1_neu + 1;
if mode = false then
 y1_neu:= y1_neu - 1;
if y1_neu = 104 then
 mode := false;
if y1_neu = 1 then
 mode:=true;
 x1_neu:= (round(sqr(y1_neu* -1) + 2704));


Was stimmt bei mir nicht???
ub60
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 765
Erhaltene Danke: 130



BeitragVerfasst: Do 23.10.08 21:49 
Der Hauptfehler liegt in der letzten Zeile.
So sollte es gehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.BitBtn1Click(Sender: TObject);
var i, x1_neu, y1_neu, Radius : Integer;
    mode : Boolean;
begin
  y1_neu:=0;
  mode:=True;
  Radius:=52;
  for i:=1 to 4*Radius do
    begin
      if mode
        then y1_neu:= y1_neu + 1
        else y1_neu:= y1_neu - 1;
      if y1_neu = 104 then
        mode:= false;
      if y1_neu = 0 then
        mode:=true;
      if mode
        then x1_neu:= 52+round(sqrt((Sqr(Radius)-(sqr(Radius-y1_neu)))))
        else x1_neu:= 52-round(sqrt((Sqr(Radius)-(sqr(Radius-y1_neu)))));
      Image1.Canvas.Pixels[x1_neu, y1_neu]:=clBlack;
      Application.ProcessMessages;
      Sleep(10);
    end;
end;

ub60
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Do 23.10.08 22:16 
Hallo,

was ich sagen wollte, das der Winkel und der Weg x nur dann proportional sind, wenn die Ansteurung über die Drehbewegung einer Kreisscheibe(segment passiert.
Der Druckkopf der meisten Tintenstrahldrucker wird von einem Zahnriemen gezogen, der mittels einer Zahnriemenscheibe auf einem Schrittmotor angetrieben wird.
Bei einer Ansteuerung mittels Schubstange oder Gleitstein in Führungsschiene, ist der Bezug Wegstrecke und Drehwinkel etwas sinusförmiges.
Es fehlt eine Skizze von Dir, wie du die Linearbewegung aus der Drehbewegung bestimmt's

Für's erste kannst du ja mal einfach die Additionstheoreme nutzen.
Sei die kleinste Auflösung des Gerätes 1 und der Radius r ein Vielfaches davon.
Dann ist der sinus des kleinsten Winkels d
dsin(d)=1/r
dcos = sqrt(1-dsin^2(d))

Für einen Vollkreis fängt man einfach bei 0 Grad an.
Dort ist der Sinus 0 und der Cosinus 1.
Da wir den Wert spaäter aber immer mit Radius multiplizieren müssen tue ich das jetzt schon;
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
//Startwerte
dsin:=1/r;
dcos := sqrt(1-dsin^2(a));
si := 0;
co:= r;
//Da sin(phi) ~ Phi für kleine Winkel ~0.1 im Bogenmas (5,7 Grad)
schritte := 2*pi*r;// Ach genau, der Umfang des Kreises ;-)

For i ;= 1 to Schritte do
  begin
  BewegeZu(co,si);//zeichne x+r,y+r zum Beispiel als Test auf ein canvas zeichnen, deshalb verschoben um r
  //nächster Wineklschritt:
  tmpSi:= si;
  //sin (a+d)
  si := si*dcos+co*dsin;
  //cos(a+d);// tmpSi weil si ja schon geändert
  co := co*cosd-tmpSi*sind;

  end;

Dass kann man noch verbessern indem man linean ABschnitte mit einer minimalen Abweichung von einem halben Punkt bestimmt.Dannn braucht man eine Linienroutine . Da die Harware aber eh langsam ist, kann man rühig Punkt für Punkt anfahren.

Gruß Horst