PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgangswerte Beschleunigungssensor Sparkfun ADXL322



jevermeister
02.05.2011, 15:55
Hi,
ich hab grad mal ne Frage an alle die sich mit diesem Sensor auskennen:

Ich fliege einen Tricopter der diesen Sensor für die Lageregelung im Hover nutzt.
Nun bin ich dabei einen Gier und roll Ausgleich für meine Kamera zu basteln, weil ich das mal alleine entwickeln möchte.
Im Basic Quellcode des Arduino werden die Ausgangswerte des Sensor in Variablen übernommen die bis +/- 25400 gehen und es wird damit weitergerechnet. Wenn ich mir die Berechnungen für z.B. die Regelabweichung anschaue wird dieser Wert z.B. einfach mit der Auslenkung der Sticks verglichen. Also welchen Winkel will ich haben und welchen habe ich.
Das spricht ja für eine Lineare Ausgangskurve, sprich 25400/2 sind 45°.
Im Datenblatt allerdings verstehe ich das so, dass der Ausgangswert in g angegeben ist und man mit dem Arcsin den Winkel errechnen muss. Das wären bei halbem Ausgangswert dann 30°.
Mein Problem mit dem Verständnis ist: Halte ich den Sensor 45° dann habe ich ja 1g auf die beiden Komponenten zerlegt also kann ich über den Satz des Pythagoras diese Werte errechnen und das spräche für den Arcsin um an die Winkel zu kommen oder?

Wenn jetzt die Sache mit Arcsin errechnet werden muss, dann ist die Übernahme der Werte in der Tricoptersteuerung ja auch nicht richtig oder?

Ich kann mir aber nicht vorstellen, dass das übersehen worden ist.

Kann mich da mal jemand aufklären bevor ich jetzt vollmundig behaupte ich hab einen Fehler gefunden und die Pferde scheu mache? Und hinterher lachen all...

Gruß
Nils

Bammel
02.05.2011, 20:56
alleine die werte vom acc werden dir nicht reichen!

dann selbst ebi einer seitwärtsbewegung (windstoss) hast du eine seitliche beschleunigung.
du musst die acc und gyrowerte vermischen oder verrechnen. wie genau das funzt kann ich dir nicht sagen.

kannst du dir net einfach die werte raussuchen bei denn das offset mit verrechnet wird!?

achja die willst bestimmt die roll und nick bewegungen kompensieren und nicht die gier ;)

Klebwax
03.05.2011, 00:44
Hi,
ich hab grad mal ne Frage an alle die sich mit diesem Sensor auskennen:

Ich fliege einen Tricopter der diesen Sensor für die Lageregelung im Hover nutzt.
Nun bin ich dabei einen Gier und roll Ausgleich für meine Kamera zu basteln, weil ich das mal alleine entwickeln möchte.
Im Basic Quellcode des Arduino werden die Ausgangswerte des Sensor in Variablen übernommen die bis +/- 25400 gehen und es wird damit weitergerechnet. Wenn ich mir die Berechnungen für z.B. die Regelabweichung anschaue wird dieser Wert z.B. einfach mit der Auslenkung der Sticks verglichen. Also welchen Winkel will ich haben und welchen habe ich.
Das spricht ja für eine Lineare Ausgangskurve, sprich 25400/2 sind 45°.
Im Datenblatt allerdings verstehe ich das so, dass der Ausgangswert in g angegeben ist und man mit dem Arcsin den Winkel errechnen muss. Das wären bei halbem Ausgangswert dann 30°.
Mein Problem mit dem Verständnis ist: Halte ich den Sensor 45° dann habe ich ja 1g auf die beiden Komponenten zerlegt also kann ich über den Satz des Pythagoras diese Werte errechnen und das spräche für den Arcsin um an die Winkel zu kommen oder?

Wenn jetzt die Sache mit Arcsin errechnet werden muss, dann ist die Übernahme der Werte in der Tricoptersteuerung ja auch nicht richtig oder?

Ich kann mir aber nicht vorstellen, dass das übersehen worden ist.

Kann mich da mal jemand aufklären bevor ich jetzt vollmundig behaupte ich hab einen Fehler gefunden und die Pferde scheu mache? Und hinterher lachen all...

Gruß
Nils

Hallo,

ich denke, wenn du den Winkel haben willst, liegst du mit dem Arcsin richtig.

Funktioniert die Tricoptersteuerung? Wenn ja, dann benötigt die Steuerung den Winkel in Grad nicht. Ich würde auch immer versuchen, vor allem wenn's schnell gehen soll, ohne Umrechnung von Sensorwerten auszukommen.

Beobachte dich mal selbst, wenn du mit einem Auto eine Kurve fährst. Du lenkst ein, siehst wie das Auto fährt, und korrigierst ohne die Räder zu sehen oder den Winkel zu brechnen, korrigierst weiter, bis es stimmt. "stimmt" heißt, der Winkel zwischen Auto und Straße ist 0. Ich denke, daß die Tricoptersteuerung so funktioniert.

MfG Klebwax

jevermeister
03.05.2011, 07:38
Hi Klebwax,
deine Aussage macht Sinn,
der Tricopter fliegt ja und damit belasse ich es dabei.
Ich habe mittlerweile bestätigen können, dass der Sensor nicht den Winkel liefert, du hattest also Recht
für pan /tilt (Danke Bammel) muss ich also den arcsin berechnen, das klappt auch schon ganz gut.

Einziges Problem das ich habe sind die Normierungen.
Ich will ja wissen welcher Wert am Eingang des arduino für wieviel Grad steht. Dazu muss ich wissen, was 90° wären um die Werte dadurch zu teilen, allerdings steht ich grad total auf dem Schlauch.
Wenn ich in der Tricoptersteuerung den wert einlese liegt er von -21000 bis zu 21000 und in meinem eigenen Programm geht er von 460 bis 66, wobei 500 die Nullage ist.
Ich bin relativ frisch in dieser sensorik, kann das deshalb nicht einschätzenw arum das so unterschiedlich ist...

Ich beutze in beiden Programmen:

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'avcc reference @ arduino =5V

Gruß
Nils

Bammel
03.05.2011, 07:50
Benutzt du nun einen weiteren µC? oder steuerst du die zwei servos aus der triguide heraus?

also um einen exakten wert zu bekommen musst du schon den acc mit dem gyro zusammen betrachten. es mag evtl für den anfang gehen nur den acc zu verwenden aber im flug bei seitenwinden und somit anderen beschleunigungen wird dir die kamera wegschwenken. aber ich weiß garnet ob sich das überhaupt bemerkbar macht.

normalerweiße musst du dir doch echt nur der wert des hover-modes vorknöpfen. nja wnen ich zuhause bin werd ich mal einen blick in den source waagen ;) vllt finde ich ja was interessantes.

so hat mir doch keine ruhe gelassen ;)
schau dir mal den folgen part an:

'-Mix components-
If Motors_on = 1 Then 'only when motors are running
'-MOTOR 1- (front left)
Ms_l_i = Sempf(throttlechannel) + Vorwahl 'throttle stick (3-228) + Vorwahl(20)
If Ms_l_i > 247 Then 'throttle clipping
Ms_l_i = 247
End If
Ms_l_i = Ms_l_i + P_set_roll_int 'add the gyro measurements (note the differences in "+" and "-")
Ms_l_i = Ms_l_i + P_set_nick_int
Ms_l_i = Ms_l_i + I_set_roll_int
Ms_l_i = Ms_l_i + I_set_nick_int
Ms_l_i = Ms_l_i + D_set_roll_int
Ms_l_i = Ms_l_i + D_set_nick_int
If State = 2 Then 'add DD term in hover mode
Ms_l_i = Ms_l_i + Dd_set_roll_int
Ms_l_i = Ms_l_i + Dd_set_nick_int
End If
'-MOTOR 2- (front right)
Ms_r_i = Sempf(throttlechannel) + Vorwahl
If Ms_r_i > 247 Then
Ms_r_i = 247
End If
Ms_r_i = Ms_r_i - P_set_roll_int
Ms_r_i = Ms_r_i + P_set_nick_int
Ms_r_i = Ms_r_i - I_set_roll_int
Ms_r_i = Ms_r_i + I_set_nick_int
Ms_r_i = Ms_r_i - D_set_roll_int
Ms_r_i = Ms_r_i + D_set_nick_int
If State = 2 Then
Ms_r_i = Ms_r_i - Dd_set_roll_int
Ms_r_i = Ms_r_i + Dd_set_nick_int
End If
'-MOTOR 3- (back)
If Ms_h_i > 247 Then
Ms_h_i = 247
End If
Ms_h_i = Sempf(throttlechannel) + Vorwahl
Ms_h_i = Ms_h_i - P_set_nick_int
Ms_h_i = Ms_h_i - I_set_nick_int
Ms_h_i = Ms_h_i - D_set_nick_int
If State = 2 Then
Ms_h_i = Ms_h_i - Dd_set_nick_int
End If
'when yawing very fast, throttle for the motor at the back is increased
Tailgas = Yaw_gyro_scale_int + Yaw_gyro_i_scale_int 'if these values are big, the motor at the back was tilted
Tailgas = Abs(tailgas) / 100
Ms_h_i = Ms_h_i + Tailgas
Else 'motors off
Ms_l_i = 0
Ms_r_i = 0
Ms_h_i = 0
End If

Evtl. könnte es so gehen: Servo(Tilt) = Servo(Tilt) + P_set_nick_int
oder so ähnlich ;)

die servoansteuerung für das heckservo findest du direkt unter dem vom mir geposteten part. das ist denke ich ein gutes beispiel wie das dann funktionieren könnte.

PS.: wenn du das ganze in die triguide integrierst könnte man das ganze ja so amchen das man die pan/tilt funktion entweder über die trigui oder über stickbewegungen beim start aktivieren kann.

jevermeister
03.05.2011, 08:08
Hi Bammel,
ich beutze schon beide zusammen, so wie für den Hovermode berechnet, allerdings ist der wert ja falsch, davon berechnene ich also nochmald en Arcsin. Nur nützt das nichts, wenn ich nicht den Eingangswert für 90° kenne.
Soll ich den Sensor mal auf 45° halten und auslesen was ich dann bekomme oder wie macht man das normalerweise?

Also gestern ging es schon ganz gut, halt nur noch etwas ugnenau...
ich benutze, sofern noch welche frei sind, zwei Ausgänge vom arduino, werde den Servos aber eine Eigene Stromversorgung geben.

Bammel
03.05.2011, 08:22
du brauchst keinen winkel errechnen wie klebwax schon erwähnt. ich mache selbst auhc imemr den fehler und denke so. aber der winkel ist einfach nur eine andere einheit. den weg kann man sich sparen.

Also du musst nur den mittelwert für den servo finden. so das dieser grade steht. evtl ein offset einplanen. ist das selbe prinzip wie mit den x und y offset beim hovermode.

die werte in den P_set_nick_int usw. sind nur errorwerte. diese solltets du nicht direkt aufs servo geben.

jevermeister
03.05.2011, 08:55
Hallo Bammel,
das sehe ich etwas anderes, bei der Lageregelung mögt ihr da beide Recht haben, aber in diesem Fall soll der servo ja eine Gegenbewegung ausführen.
Die Lageregelung des Tricopters sorgt ja dafür, dass der Tri wieder elvelt, das geht über Regelung.
In meinem Fall muss ich wissen, welchen Winkel der Tricopter hat, um diesen mit dem neuen servo gezielt auszugleichen, dafür muss ich den Winkel des TRI wissen um den Korrekturwinkel des Servo zu berechnen.
Steht der Tri 30% muss der Servo -30% stehen um das zu korrigieren.

Wie bereits oben erwähnt ist das alles schon am funktionieren, ich teste das zu zeit mit dem heckservo und es läuft auch schon, jetzt muss nur noch der zweite und dritte servo angeschlossen werden.

Nils

Bammel
03.05.2011, 09:14
Ja wenn das funktioniert kann der thread ja quasie geschlossen werden!

dann musst du ja alles in winkeln umrechnen!
aber wenn du tri in eine richtung neigst z.b. 30° oder 23789 stellen einer x-beliebigen einheit. dann musst du doch dem servo exakt den selben werd mit vertauschtem vorzeichen geben. zumit ist die kamera dann wieder genau waagerecht über den boden. denn das vorzeichen nicht vertauscht wäre würde sie der winkel einfach verdoppeln.

wie gesagt die umrechnerei in winkel ist unnötig! macht es aber zum verständniss wesentlich leichter, dies ist aber grade hier ein problem da mehr rechnerei (die nicht benötigt wird) das ganze programm ausbremmst und somit die regelung langsamer läuft. ob sich das nun im realen flug auswirkt weiß ich natürlich nicht.

jevermeister
03.05.2011, 09:37
1.
Die Skalierung des Eingangs ist zum einen eine ganz andere wie der Ausgang zum Servo.
2.
Am Eingang kommt lediglich eine Komponente der Gravitation an und kein Winkel und da der Servo einen Winkel benötigt, komme ich um einen Arcsin nicht herum.
Zur Lageregelung eines Tricopters ist das zwar nicht nötig, aber für den servo schon, da ich dort ja nicht 0 erreichen will.

Das eigentlich Themas ist auch erledigt, lediglich die Skalierung ist noch das Problem.

Bammel
03.05.2011, 10:05
Naja im prinzip kommt schon ein winkel an. der wird ausgerechnet mit hilfe des acc und des gyros zusammen. damit kann man ja die genaue position in einem raum bestimmen.

die scallierung ist denke ich vernachlässigbar. den bei den P, I und D werten kommt nur eine fehlersumme raus. diese sollte nicht sehr hoch sein.
die werte der sensoren liegen laut deiner aussage (ich habs nicht geprüft) bei +/- 25400, für die motoren wird aber nur ein wert von 0 bis 255 übergeben. da würde die skallierung auch nicht passen.

jevermeister
03.05.2011, 14:52
Moin,
ich habs!

Arduino Eingang: 10BIT 1024 = 111111111 @5V : 5V/1024 = 0,00488... -> 1Bit=4,88mV

Ausgang ADXL322@Vs = 5 V, the output sensitivity is typically 750mV/g -->
90°= 3,25V
0°= Vs/2 = 2,5V
-90° = 1,75


V-Ausgang Arduino Eingang
3,25V/0,00488= 666
2,50V/0,00488= 512
1,75V/0,00488= 358

Das sind die Endwerte mit denen kann ich das Signal skalieren und habe das Verhältnis vom Signal zum Endwert, davon berechne ich den Arcsin und habe dann den Winkel in dem der Sensor steht.

Voila, diesen Winkel bekommt der Servo und die Kamera steht immer Horizontal.

Willa hat die Erfassung im Code noch zusätzlich mit 99% Vom Gyro ergänzt für ein genaueres Signal.
Es ging hier aber hauptsächlich um die Skalierung des Signals, damit ich einen Winkel errechnen kann. Das funktioniert jetzt, bin gespannt auf heut Abend wie es geht.
Evtl geht die ganze Geschichte heute Abend schon!
Aber ich befürchte ja, dass ich das ganze noch mit einer Regelung versehen muss.
*schluck*

gruß
Nils