PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Quadrocopter



Bluesmash
14.04.2015, 23:59
Hallo Zusammen

Seit den Weihnachtsferien baue ich nun an einem Quadrocopter. Programmiert habe ich alles selber in Bascom.
Heute bin ich das erste mal richtig damit geflogen und möchte euch nun mein Projekt vorstellen.

Eckdaten:
- Atmel Atmega328
- Programmiert in Bascom
- Beschleunigungssensor/Gyro: MPU6050
- Motoren: Multistar MT2213
- Propeller: 10x4.5
- ESC: Afro 20A, angesteuert über I2C
- Akku: Turnigy nano-tech 3s 3000mAh
- Steuerung: Spektrum DX6i
- Empfänger: OrangeRx R410X

Nun habe ich aber noch folgendes Problem:
Auf der Wippe Funktioniert der ACC-Mode relativ gut, die Horizontale Lage wird relativ schnell ausgeregelt.
Im Flug dauert es aber eine gefühlte Ewigkeit bis er nach dem loslassen des Steuerknüppels wieder Horizontal steht (im ersten Video ist es ein wenig ersichtlich).
Mir ist klar, dass die Querbeschleunigungen im Flug die ACC-Winkel beeinflussen. Ich verwende einen einfachen Komplementärfilter. Habt ihr da eine Idee wie man das noch optimieren kann? Die Beschleunigungssensoren habe ich auf +/-2g Eingestellt und in der Software auf +/-1g begrenzt.


Bilder und Videos sagen mehr als Worte und fragt einfach was ihr noch wissen möchtet.

30069

Test auf der Wippe:
(In der ersten Hälfte ist der innere Regelkreis nur mit den Gyros zu sehen, danach die ACC Regelung)


https://www.youtube.com/watch?v=bZdSjWGTxaI


Hier 2 Videos vom ersten Flug:


https://www.youtube.com/watch?v=fbedHzOKWls


https://www.youtube.com/watch?v=QGdv7h7fAmI

Che Guevara
17.04.2015, 15:36
Hi,

gefällt mir sehr gut, dein Quadrocopter! Hast du die Haube selbst gemacht oder gekauft?
Zu deinem Problem:
Mit welcher Frequenz läuft den der Komp.Filter und die Sensor-Auswertung? Welche Koeffizienten hast du dafür bestimmt?
Wie ist der Regler aufgebaut? P, PI, PD, PID? Kaskadiert oder "Normal"?
Evtl willst du auch dein Programm herzeigen, da werden viele Sachen ersichtlich.
Das langsame nachziehen kann man leider (zumindest ich) eher schlecht erkennen, evtl kannst du nochmal ein Video machen, wo man es deutlicher sieht?

Gruß
Chris

Bluesmash
17.04.2015, 17:26
Hallo Chris

Die Haube habe ich aus der Bastelecke, da gibt es solche Plexiglaskugeln die aus 2 Hälften bestehen.
Der Rest ist selbst gemacht. Der Grundrahmen besteht aus Karbon Rohren und Aluminium Teilen die mir ein Freund gedreht hat. Die Rohre sind mit 2K-Epoxid eingegklebt.

Übrigens, auf dem Quadrocopter habe ich noch ein Raspberry PI A+ mit Kamera verbaut. Mit dem PI möchte ich einen Access-Point aufbauen und darauf soll ein Webserver für die Bedienung der Kamera laufen... Das ist meine nächste Baustelle ;)

Alle 5ms wird der Sensor ausgelesen, die Winkel berechnet und die PID-Regler aufgerufen.
Der Komplementär Filter läuft mit 0.98*Gyro und 0.02*ACC.
Den Regler habe ich als Kaskade aufgebaut. Der innere Regelkreis (PID) Regelt nur auf die Gyro-werte und der äussere (PI) Regelt dann den Winkel. Im Video auf der Wippe ist es gut ersichtlich (In der ersten Hälfte läuft nur der Gyro-Regler und in der zweiten wird der äussere Regler hinzugeschaltet).

Auf dem Video ist es relativ schwierig zu erkennen, da man nicht sieht wann ich den Knüpel los lasse...
Am besten sieht man es im ersten Video ab 0:12 2mal nacheinander. Da gebe ich ihm nur einen kleinen "Schupf", in dem Moment wo er kurz zurückregelt lasse ich den Knüppel los und er fliegt schräg weiter.

Hier mal der relevante Teil des Codes vielleicht verstehts du etwas ;) ich habe leider nur wenig dokumentiert...


'Sensordaten einlesen
Gosub MPU6050_read

'Gyrowinkel berechnen
'Offset abziehen
Gyr_X = Gyr_X - Gyr_X_Offset
Gyr_Y = Gyr_Y - Gyr_Y_Offset
Gyr_Z = Gyr_Z - Gyr_Z_Offset
'Winkel X-Achse
Ist_Gyr_X = Gyr_X / 32.8
Temp_s = Ist_Gyr_X * 0.005
Winkl_Gyr_X = Temp_s
'Winkel Y-Achse
Ist_Gyr_Y = Gyr_Y / 32.8
Temp_s = Ist_Gyr_Y * 0.005
Winkl_Gyr_Y = Temp_s
'Winkel Z-Achse
Ist_Gyr_Z = Gyr_Z / 32.8
Temp_s = Ist_Gyr_Z * 0.005
Winkl_Gyr_Z = Temp_s

'Beschleunigungen auf +/- 1g begrenzen
If ACC_X > 17000 Then ACC_X = 17000
If ACC_X < -17000 Then ACC_X = -17000
If ACC_Y > 17000 Then ACC_Y = 17000
If ACC_Y < -17000 Then ACC_Y = -17000
If ACC_Z > 17000 Then ACC_Z = 17000
If ACC_Z < -17000 Then ACC_Z = -17000

'ACC Winkel berechnen X-Achse
Temp2_s = ACC_Y
Temp_s = ACC_X * ACC_X
Temp3_s = ACC_Z * ACC_Z
Temp_s = Temp_s + Temp3_s
Temp3_s = sqr(Temp_s)
Temp_s = atn2(Temp2_s , Temp3_s)
Winkl_ACC_X = rad2deg(Temp_s)
'ACC Winkel berechnen Y-Achse
Temp2_s = ACC_X
Temp_s = ACC_Y * ACC_Y
Temp3_s = ACC_Z * ACC_Z
Temp_s = Temp_s + Temp3_s
Temp3_s = sqr(Temp_s)
Temp_s = atn2(Temp2_s , Temp3_s)
Temp_s = Temp_s * -1
Winkl_ACC_Y = rad2deg(Temp_s)

'Komplementärfilter 0,98*Gyro + 0.02*ACC
'X-Achse
Temp_s = Winkel_X + Winkl_Gyr_X
Temp2_s = Temp_s * Kompl_Faktor
Temp_s = 1 - Kompl_Faktor
Temp3_s = Winkl_ACC_X * Temp_s
Winkel_X = Temp2_s + Temp3_s
'Y-Achse
Temp_s = Winkel_Y + Winkl_Gyr_Y
Temp2_s = Temp_s * Kompl_Faktor
Temp_s = 1 - Kompl_Faktor
Temp3_s = Winkl_ACC_Y * Temp_s
Winkel_Y = Temp2_s + Temp3_s

'Trimm Wert verrechnen
Winkel_X_T = Winkel_X + Winkel_X_Trimm
Winkel_Y_T = Winkel_Y + Winkel_Y_Trimm

Che Guevara
17.04.2015, 17:42
Hi,

also 5ms funktionieren zwar, aber ich würde versuchen, es auf 2ms oder gar 1ms runterzuschrauben. Die integration der Sensoren läuft dadurch besser und das Flugbild wird insgesamt noch etwas smoother, wobei er jetzt auch schon sehr gut fliegt!
Ich hab in meinen Koptern nen MPU6000 verbaut, der hat SPI und ist dementsprechend wesentlich schneller in der Auswertung, für 7 Register brauche ich gerade mal ein paar µs (hab den Wert nicht im Kopf, denke so ca 30).
Zum einen fällt auf, dass du keine Rotationsmatrix programmiert hast (oder sie nicht gezeigt hast). Zum anderen kommen mir die Komp.Filter Faktoren etwas falsch vor und errinnern mich an ein Paper, das immer mal wieder aufgegriffen wird ;)
Ich hab bei meinem Filter (1kHz) einen Wert von 0.00028 für den Acc.
Die Werte auf 1g begrenzen würde ich nicht, da können u.U. sehr blöde Sachen rauskommen! Außerdem würde ich den Sensor auf +-4g stellen.
Wenn, dann würde ich den Komplementärfilter überspringen, wenn z.b. die Gesamtbeschleunigung mehr als 0.5g von 1g abweicht.

Gruß
Chris

EDIT:
Achja, hast du die ACC Sensoren auch kalibriert? Dein


'Trimm Wert verrechnen
Winkel_X_T = Winkel_X + Winkel_X_Trimm
Winkel_Y_T = Winkel_Y + Winkel_Y_Trimm

sieht nicht danach aus ;)
Du musst den Sensor 6x drehen und jeweils die max Werte bestimmen, daraus dann Offset & Range berechnen und bei jedem Auslesen dann mit diesen Werten verrechnen.

Bluesmash
17.04.2015, 19:27
Hallo Chris

Vielen Dank für deine Antworten.

Momentan bin ich bei ca. 3,8ms für einen Durchlauf. Eventuell kann ich dies noch ein wenig optimieren... Potential wäre auf jedenfall noch da ;)
Das kommt dann aber erst wenn ich mit allem anderen zufrieden bin...

Ich weiss ja nicht einmal was eine Rotationsmatrix ist...
Dann glaube ich nicht, dass ich diese programmiert habe ;) Kannst du mir da weiterhelfen?

Ja die Kompl. Faktoren habe ich irgendwo so übernommen, und da es auf der Wippe gut funktionierte sah ich keinen Grund diese zu ändern... aber 0.00028 :shock: ist ja extrem klein... wie hast du diesen ermittelt?
Hmmm... ein kleinerer Faktor hätte auch einen kleineren Einfluss auf die kurze Querbeschleunigung, ich denke das hilft mir weiter.

Also du meinst, wenn ACC_X+ACC_Y+ACC_Z > 1,5g oder < 0,5g nur noch den Gyro-Winkel integrieren und den ACC-Winkel ignorieren?
Das hört sich gut an!

Der Code Teil ist nur für die Trimmung...
Beim Start bestimme ich den Offset des Gyros (Mittelwert aus 500 Messungen) sollte man den ACC auch kalibrieren?

gruss Bluesmash

Che Guevara
17.04.2015, 21:02
Hi,

ich bastel seit ein paar Jahren (glaub 2011 oder 2012) an meinem Kopter, hab angefangen mit Mega328P, dann AtXMega, jetzt STM32F4.
Solange du "nur" normal fliegen willst, also ohne Kompass, GPS & Höhe, solltest du LOCKER auf 1ms kommen, weniger ist mehr ;)
Wichtig ist, dass du Divisionen vermeidest und auch floats, solange du keine FPU hast (was dein Prozessor nicht hat).
Divisionen lassen sich am besten mittels Shift ersetzen, da muss man dann ggf einwenig die Variablen skalieren, dann läufts wesentlich schneller.
Eine Rotationsmatrix (oder auch Drehmatrix) ist eine Matrix, mit der man einen Vektor drehen kann. In deinem Fall musst du die Komplementärfilter Winkel um einen bestimmten Winkel (aus GyroZ bestimmt) drehen. Schau mal bei Wikipedia, da ist das gut erklärt. Da deine Resourcen aber beschränkt sind und der Kopter sowieso nicht allzu schnell sich drehen wird, reicht da auch die Kleinwinkelnäherung.
Gedankenexperiment:
Du nickst 20° nach vorne (und bleibst da), yaw'st dann um 90° nach links (GUZ). Wie stehst du dann?

Ermittelt hab ich den Wert durch ausprobieren, ist über die Jahre so gewachsen ;) Hab aber auch einen Kalmanfilter programmiert, der gibt sehr sehr ähnliche Ergebnisse aus, also denke ich mal, dass es ein sehr guter Wert ist, im Flug isses auch super!
Du musst die Länge des Vektor bestimmen, also


TotalForce = sqrt(AccX*AccX + AccY*AccY + AccZ*AccZ)
Diff1G = 1 - TotalForce
Diff1G = abs(Diff1G)

'Hier Winkel integrieren

If Diff1G < 0.5 Then 'nur anwenden, wenn Gesamtbeschleunigung nahe 1g
'Komplementärfilter
End If


Den Acc musst du nur einmalig kalibrieren, den Gyro bei jedem Start, das machst du schon gold-richtig.

Gruß
Chris

Bluesmash
18.04.2015, 13:29
Hallo Chris

Zu deinem Gedankenexperiment:
Dann schaut der Copter nach links mit 20° Nick...?? Aber das möchte ich ja?
Wird die Drehmatrix verwendet, dass die Front des Copters immer in die selbe Richtung zeigt? Egal wie ich ihn um Yaw drehe?
Wenn ich z.B. den Knüppel nach vorne drücke, dass er immer von mir weg Fliegt? Egal wie er in der Yaw-Achse steht?

Ich habe mal den Komplementärfilter mit 0.002 versucht. Das funktioniert aber gar nicht...
Solange ich den Copter nur um eine Achse kippe und dann wieder Horzontal auf den Tisch stelle stimmen die Winkel.
Wenn ich jetzt aber den Copter "rühre" z.B. 30° Nick danach 30° Roll, -30° Nick, -30° Roll und Ihn wieder auf den Tisch stelle, steht der Nick Winkel z.B. auf 10° und Kompensiert sich ganz langsam wieder auf 0°
Das kommt von der Gyro integration wenn gleichzeitig um alle Achsen gekippt wird stimmen die Winkel überhaupt nicht mehr, ist das eigentlich normal? oder habe ich hier noch einen Fehler?


Gruss Bluesmash

Che Guevara
18.04.2015, 14:08
Hi,

nein, da denkst du falsch ;)
Der Kopter steht dann mit Nick bei 0° und Roll bei 20° nach rechts.
Überleg mal:
Wenn du den Kopter, wenn dieser nicht waagerecht ist, um die Yaw Achse drehst, verändert sich dessen Winkel (wie beim Gedankenexperiment). Der Acc bekommt diese Veränderung mit, die Gyros aber nicht, weil sie nur die Drehung um die Yaw Achse registrieren. Folge: Es dauert eine ganze Weile, bis sich die Komplementärfilter Winkel wieder an die Acc Winkel angleichen.
Du musst also die Gyro-Drehungen (welche im Körpereigenen Koordinatensystem "stattfinden") in das gleiche Bezugssystem wie die Acc Winkel bringen, welche im Erdkoordinatensystem arbeiten.
Hier hab ich mal einen Code für dich, kann sein, dass du manche Vorzeichen wechseln musst:


GyroZSin = Sin(GyroZ*0.01745) 'Drehung um Yaw Achse von Deg zu Rad konvertieren
GyroZCos = Cos(GyroZ*0.01745)

'Drehmatrix
KompFilterXTmp = (GyroZCos * KompFilterX) - (GyroZSin * KompFilterY)
KompFilterYTmp = (GyroZSin * KompFilterX) + (GyroZCos * KompFilterY)

'Werte zurückschreiben
KompFilterX = KompFilterXTmp
KompFilterY = KompFilterYTmp

Die Variablen KompFilterXYTmp brauchst du, damit nach der ersten Zeile der Drehmatrix die Variable KompFilterX noch gleich bleibt, weil der Wert noch in der zweiten Zeile gebraucht wird.
Die grundsätzliche Formel stimmt, es kann aber sein, je nachdem, in welche Richtung deine Winkel ausgelegt sind (also ob Nick positiv vorne oder hinten, Roll positiv vorne oder hinten, Yaw positiv UZ oder GUZ).
Dein oben beschriebenes Verhalten, der Kopter steuere immer von dir weg (wie zb. MK Carefree), wird damit nicht erreicht!
Um das zu realisieren braucht man zwar auch eine Rotationsmatrix, aber auch einen Kompasssensor, welchen du glaube ich nicht verbaut hast?

Ich denke, dein beschriebenes Verhalten (rühren) hängt mit der fehlenden Rotationsmatrix zusammen. Probier das mal aus und berichte dann.

Gruß
Chris

EDIT:
Achja, deine Homepage funktioniert irgendwie nicht?

Bluesmash
18.04.2015, 17:08
Vielen Dank für deine Hilfe!

Irgendwie macht es bei mir nicht "klick" ;(
Wenn ich doch um die Yaw-Achse drehe, ist der einzige Sensor der eine Änderung feststellt, der Gyro von der Yaw-Achse?
Der Copter behält ja seinen Winkel (einfach um die Yaw-Achse gedreht) und somit bleiben doch die Werte der ACC gleich, oder?

Ah ja danke, ich war schon seit jahren nicht mehr aktiv hier, ich muss mir noch nen neuen Platz für meine Homepage suchen...

Gruss Bluesmash

Che Guevara
18.04.2015, 17:24
Hi,

ja, wenn die Platine / der Kopter / Sensor waagrecht ist, ändert sich nur die Yaw-Achse.
Wenn er aber schief steht und du dann um Yaw drehst, verändern sich die Acc-Werte, weil er dann anders im Raum steht!
Is jetzt schwierig zu erklären, evtl probierst dus nochmal mit dem Gedankenexperiment, eigentlich sollte es da klar werden.

Gruß
Chris

Bluesmash
18.04.2015, 18:47
Ahhh.... endlich, jetzt hats klick gemacht :)
Ich hatte das die ganze zeit falsch im kopf... jetzt macht alles einen Sinn :)
Ich muss mir das jetzt mal aufzeichnen damit ich deinen Code verstehe...

Eine Frage habe ich noch:
GyroZ, ist das die Winkeländerung seit der letzten Berechnung?

Gruss Bluesmash

Che Guevara
18.04.2015, 18:58
Super, manchmal steht man eben auf dem Schlauch.
GyroZ ist einfach die Drehung um die Z-Achse (Yaw), die der Sensor ausgibt. Also der ganz normale Gyrowert, minus Offset.
Kommt drauf an, wie du das implementierst, könnte sein, dass es besser ist, wenn du die Rotationsmatrix nur alle 5ms (zb) anwendest und bis dahin die Werte immer aufsummierst.

Gruß
Chris

Bluesmash
18.04.2015, 19:32
OK, vielen Dank schon mal!

Ich werde das mal versuchen.
Jetzt ist mir auch klar warum ich keine Kurve fliegen konnte und er immer irgendwie dagegen steuerte...

Ich habe so nen mini quad von Revell, damit klappt das fliegen schon recht gut...
Für den mini habe ich mir einen Adapter gebaut damit ich ihn mit der Spektrum steuern kann. Damit ich auch ein Gefühl für die Steuerung erhalte... ich habe sonst keinerlei Flugerfahrung...

Gruss Bluesmash

Bluesmash
19.04.2015, 21:53
Hallo Chris

Ich habe mal versucht mich ein wenig mit der Thematik auseinanderzusetzen, da bin ich auf folgende Seite gestossen:
http://mathebibel.de/drehmatrix
Da ist die gleiche Formel wie von dir für eine Drehung im 2D-Raum. Da sind aber X und Y die koordinaten, bei deiner Formel sind es aber die X-, Y-Winkel...
Hast du eventuell einen Link wo deine Fromel einigermassen einfach erklärt wird?
Ich habe sie auch mal auf meinem copter ausprobiert... funktioniert aber bis jetzt noch nicht, da ich auch nicht weiss wie ich die Vorzeichn bestimmen soll...

Gruss Bluesmash

Che Guevara
19.04.2015, 23:10
Hi,

in dem Fall sind es die Winkel, aber du musst die Winkel wie Koordinaten behandeln ;)
Also dadurch nicht verwirren lassen, die Koordinaten sind in dem Beispiel zur Erklärung.
"Meine" Formel ist also genau die gleiche wie die in dem Link, nur eben schon ausformuliert und die richtigen Variablen eingesetzt.
Im einfachsten Fall orientierst du dich am Koordinatensystem in deinem Link, X ist dann dein Roll-Winkel, Y dein NickWinkel. Du musst jetzt einfach nur die Werte so einsetzen (ggf X_Winkel & Y_Winkel in meiner Formel tauschen oder Vorzeichen wechseln), dass deren Richtung die gleiche wie in deinem Link im KS ist. Der GyroZ Wert sollte positiv sein, wenn du GEGEN den Urzeigersinn drehst.
Ich hoffe, du probierst das, indem du debuggst und nicht im Flug? :D

Gruß
Chris

Bluesmash
19.04.2015, 23:53
Hi Chris

Danke für die Erklärung! Jetzt funktioniert es, ich musste x/y tauschen. Ich hatte vorher nur versucht die Vorzeichen zu tauschen.
Geniale Sache! jetzt kann ich den Kopter auf die Seite stellen und "gieren" und die Winkel werden schön auf x oder y übertragen. Besten Dank!
Natürlich versuche ich das nicht im Flug ;) ansonsten könnte ich jetzt zum x-ten mal einen neuen bauen ;)
Ich hoffe ich kann nächste Woche einmal einen Flugversuch machen...

Ich habe noch etwas festgestellt.
Ich habe mal die Filter abgeschaltet und nur die Gyro integration laufen lassen. Solange ich um eine Achse kippe und ihn wieder auf dem Boden stelle stimmen die Winkel.
Wenn ich jetzt aber folgende Bewegung ausführe (Video) stimmt der Winkel um 10-20° nicht mehr.
Hast du eine Idee was da nicht simmen könnte? oder ist das normal?


https://www.youtube.com/watch?v=U8E-wbokfzo

Gruss Bluesmash

Che Guevara
20.04.2015, 00:54
Hi,

na also, ist doch gleich viel besser oder? :D
Hm wenn du sagst "hab den Filter abgeschaltet", was hast du dann abgeschaltet? Also nur den Komplementärfilter oder auch die Rotationsmatrix?
Wenn nur der Komp Filter aus ist, hab ich grad keine Lösung parat, das müsste man näher untersuchen.
Falls die Rot Matrix auch aus ist, würde mich das Verhalten nicht wundern, kleinere Drehungen kommen immer vor, auch wenn mans nicht sieht.

Gruß
Chris

Bluesmash
20.04.2015, 10:04
Hallo Chris

Nachdem die Rotationsmatrix funktionierte, habe ich den Kompl. Filter auf 0.002 ACC eingestellt.
Dann ist mir bei der oben gezeigten Bewegung aufgefallen, dass nach der Bewegung eine Achse (um die gekippt wurde) einen Fehler von ca. 15° hat (Alle Filter sind eingeschaltet). Der sich dann langsam über den Kompl.Filter wieder abbaut.
Bei 0.01 ACC wird der Fehler sehr schnell korrigiert und ich habe wieder vernünftige Werte.
Damit komme ich nicht mal Ansatzweise an die 0.00028 von dir... (Ich vermute bei meinen 200Hz müsste ich ca. 0.0014 verwenden damit ich den gleichen Wert wie bei dir bei 1kHz habe)

Als test habe ich dann mal alle Filter abgeschaltet und nur den Gyro integrieren lassen. Dann habe ich gesehen, dass der Fehler direkt vom Gyro kommt. Es ist mir klar, dass gewisse Abweichungen durch das Integrieren entstehen wenn nur der Gyro aktiv ist, aber so extrem? Beim Versuch der gezeigten Bewegung habe ich auch versucht möglichst keine "Gier-Bewegungen" zu machen...

Vielleicht liegt es auch am DLPF des MPU6050...
Ich hatte am Anfang den Copter mit standard Alu-Profilen aufgebaut. Da hatte ich den DLPF auf 44Hz eingestellt, damit funktionierte es relativ gut.
Nachdem ich den Copter auf die Carbon-Rohre umgebaut hatte. Musste ich feststellen das ich relativ hohe Störfrequenzen auf dem Rahmen habe und ich grosse Abweichungen bei den Winkeln hatte. Erst bei 5Hz DLPF war Ruhe und so ist er jetzt auch noch eingestellt...

Gruss Bluesmash

Bluesmash
21.04.2015, 08:35
Ich habe gestern einen Kurzen Testflug gemacht, leider hatte es ein wenig Wind...
Das Fliegen einer Kurve funktioniert jetzt, vielen Dank an dich!
Mein Problem vom Anfang mit dem Nachziehen besteht aber immer noch. Wenn ich jetzt z.B. Nick -30° gebe und nach ca. 1sec wieder 0° fliegt er nach vorne und es dauert einige Sekunden bis er wieder die Horizontale Lage erreicht hat. Meistens Regelt er dann zu weit und fliegt dann Rückwärts...

Was mir ja noch fehlt in der Software ist eine saubere Achskopplung:
Wenn ich jetzt 90° Nicke und danach Rolle verändere ich ja den Roll-Winkel nicht... Im Moment wird dieser aber einfach aufintegriert und somit stimmen die Winkel nicht mehr.
Kann man diese Achskopplung (Nick- und Rollachse) jetzt in der gleichen Art in die Software integrieren wie das Drehen um die Gier Achse?

Gruss Bluesmash

-- Edit --
Hmmm... wenn ich mir das Beispiel nochmals anschaue würde bei 90° Nick die Roll-Steuerung gar nicht mehr funktionieren, da der Rollwinkel dann immer 0 währe... bin gerade verwirrt...

Che Guevara
21.04.2015, 11:53
Hi,

ich glaube, dass der DLPF mit 5Hz viel zu stark eingestellt ist! Ich verwende 42 / 44 Hz, wie die meisten anderen Projekte auch (MultiWii, Autoquad, APM).
Solltest du dabei Probleme mit Schwingungen haben, würde ich eher versuchen die Ursache zu bekämpfen (Motor / Prop wuchten).
Wie hast du den deine Steuerplatine befestigt? Es gibt sog Schwingungsdämpfer, die funktionieren ganz gut und entkoppeln so deine Sensoren vor den Schwingungen.
Hast du evtl die Möglichkeit, die Daten der Sensoren graphisch darzustellen und hier zu posten? Da könnte man sicherlich was erkennen.

Deine Frage bzgl. Achskopplung (das Wort errinert an MK) verstehe ich nicht.
Nur soviel: Da du mit Euler-Winkeln arbeitest, entsteht bei 90° Nick ein Gimbal Lock -> nicht gut! Ich würde die Nick & Roll Winkel in der Software auf zb 40° begrenzen.

Gruß
Chris

Bluesmash
21.04.2015, 12:21
Hallo Chris

Die Platine ist mit Gummipuffer mechanisch entkoppelt. Die Motoren und Propeller habe ich gewuchtet.
Welche Daten wären sinnvoll? Während dem Flug mit dem Problem des "Nachziehens"? muss mal versuchen die Daten Graphisch aufzubereiten.

Meinst du die Begrenzung der Winkel-Vorgabe über die Fernsteuerung? Diese habe ich auf 45° begrenzt.

90° war ein schlechtes Beispiel. Ich versuche es nochmals anders:
Wenn ich den Copter 45° um die Rollachse neige und danach 45° um die Nickachse und ihn dann auf direktem Weg Horizontal auf den Tisch lege haben die Gyros nicht 0° sondern irgendwas um 15° auf beiden Achsen und dies muss dann der ACC kompensieren...

Gruss Bluesmash

Che Guevara
23.04.2015, 12:50
Hi,

gut wäre zb, wenn du den Kopter so bewegst, wie dus geschildert hast und dabei die Gyro und Acc Winkel aufzeichnest, sodass man den Fehler in den Daten sehen kann.
Ja, das meinte ich. Ich würd evtl noch um 5° runter gehen, bei 45° wirds schon gefährlich.

Gruß
Chris

Bluesmash
23.04.2015, 13:24
Hallo Chris

Ich werde mal versuchen, die Daten aufzuzeichnen.

Ich habe mich noch über die Drehmatrix schlau gemacht.
Um die Gyros richtig zu verrechnen, müsste man die Drehmatrix ja auf alle Achsen anwenden und nicht nur auf die "Gier-Achse".
Wie hier auf der 1. Seite beschrieben:
http://www.itm.uni-stuttgart.de/courses/madyn/Merkblaetter/M08.pdf

Die Formeln sind aber für mich relativ kompliziert und bräuchten auch einiges an Rechenpower...
Hast du bei deinen Coptern die Komplette Drehmatrix im 3D-Raum implementiert?

Ich denke, dass meine Abweichungen daher kommen, weil ich in der Drehmatrix nur die "Gier-Achse" berücksichtige.

Ich habe jetzt eine Bewegung gefunden bei der man es am deutlichsten sieht (du kannst es ja mal mit deinem Copter versuchen):
Den Copter auf ca. 50° in der Roll-Achse stellen (am besten auf dem Boden oder Tisch). Danach den Copter relativ schnell Horizontal zum Erd-Koordinatensystem ca 90° drehen (nicht Gier). So das Roll immer 50° hat und Nick 0°. Nach der Drehung steht der Nick Winkel aber nicht mehr auf 0° sondern auf ca. 10°-20°

Gruss Bluesmash

Che Guevara
23.04.2015, 13:38
Hi,

ja das ist richtig, eigentlich sollte man alle Achsen drauf anwenden, ABER die von dir beschriebene Bewegung wird in der Realität nicht auftretten!
Auch ist es bei mir so, dass die angezeigte Drehung richtige Ergebnisse ausgibt.
Ich vermute mal, bei dir liegt da irgendwo ein Fehler vor. Evtl willst du ja deinen gesamten Code hier reinstellen, dann könnte ich mal drüberschauen, wenn du willst.

Gruß
Chris

Bluesmash
23.04.2015, 23:42
Hallo Chris

Ich habe mal versucht die Bewegung aus dem Video aufzuzeichnen villeicht kannst du in der Aufzeichnung etwas erkennen. Man sieht schön, dass der Winkel-Y am Ende der Bewegung nicht auf 0 ist...

Kennst du SerialChart? Kann man da irgendwo die Zeit/Pixel einstellen? Bei schnellen Bewegungen ist alles so zusammengedrückt, dass man nichts erkennen kann. Ich würde das gerne Horizontal auseinanderziehen.

30093

Gruss Bluesmash

- - - Aktualisiert - - -

Hier mal die relevanten Teile aus dem Code...
Ich hoffe du verstehst ihn ein wenig ;) ist leider nicht so schön programmiert ;)




Gosub MPU6050_init

'Hauptschleife
Do

'Alle 5ms Neue Sensordaten lesen, Filter, PID, Motoren beschreiben
'Variable Berechnen wird in einem 5ms Timer Interrupt gesetzt
If Berechnen = 1 Then

Berechnen = 0

Gosub Neue_Daten


'PID Regler Gyro X-Achse
Call PID_Cal(Soll_Gyr_X, Ist_Gyr_X, PID_out_G_X, Kp_G_X, Ki_G_X, Kd_G_X, eSum_G_X, eAlt_G_X)
'PID Regler Acc X-Achse
Call PID_Cal(Winkel_X_SW, Winkel_X_T, PID_out_X, Kp_X, Ki_X, Kd_X, eSum_X, eAlt_X)

'PID Regler Gyro Y-Achse
Call PID_Cal(Soll_Gyr_Y, Ist_Gyr_Y, PID_out_G_Y, Kp_G_Y, Ki_G_Y, Kd_G_Y, eSum_G_Y, eAlt_G_Y)
'PID Regler Acc Y-Achse
Call PID_Cal(Winkel_Y_SW, Winkel_Y_T, PID_out_Y, Kp_Y, Ki_Y, Kd_Y, eSum_Y, eAlt_Y)

'PID Regler Gyro Z-Achse
Call PID_Cal(Soll_Gyr_Z, Ist_Gyr_Z, PID_out_G_Z, Kp_G_Z, Ki_G_Z, Kd_G_Z, eSum_G_Z, eAlt_G_Z)

'Serielle Daten senden (alle 5ms 1 Wert)
'If send_data = 1 Then
Gosub Daten_Senden
'End if

'....ESC's beschreiben
'....Analogwerte Spannung/Strom verarbeiten
'....Diverse Funktionen RC-Empfänger
Loop

Neue_Daten:

Gosub MPU6050_read

'Gyrowinkel berechnen
'Offset abziehen
Gyr_X = Gyr_X - Gyr_X_Offset
Gyr_Y = Gyr_Y - Gyr_Y_Offset
Gyr_Z = Gyr_Z - Gyr_Z_Offset
'Winkel X-Achse
Ist_Gyr_X = Gyr_X / 32.8
Temp_s = Ist_Gyr_X * 0.005
Winkl_Gyr_X = Temp_s
'Winkel Y-Achse
Ist_Gyr_Y = Gyr_Y / 32.8
Temp_s = Ist_Gyr_Y * 0.005
Winkl_Gyr_Y = Temp_s
'Winkel Z-Achse
Ist_Gyr_Z = Gyr_Z / 32.8
Temp_s = Ist_Gyr_Z * 0.005
Winkl_Gyr_Z = Temp_s


'ACC Winkel berechnen X-Achse
Temp2_s = ACC_Y
Temp_s = ACC_X * ACC_X
Temp3_s = ACC_Z * ACC_Z
Temp_s = Temp_s + Temp3_s
Temp3_s = sqr(Temp_s)
Temp_s = atn2(Temp2_s , Temp3_s)
Winkl_ACC_X = rad2deg(Temp_s)
'ACC Winkel berechnen Y-Achse
Temp2_s = ACC_X
Temp_s = ACC_Y * ACC_Y
Temp3_s = ACC_Z * ACC_Z
Temp_s = Temp_s + Temp3_s
Temp3_s = sqr(Temp_s)
Temp_s = atn2(Temp2_s , Temp3_s)
Temp_s = Temp_s * -1
Winkl_ACC_Y = rad2deg(Temp_s)

'Gesamtbeschleunigung berechnen
Temp_s = ACC_X * ACC_X
Temp3_s = ACC_Z * ACC_Z
Temp_s = Temp_s + Temp3_s
Temp3_s = ACC_Y * ACC_Y
Temp_s = Temp_s + Temp3_s
Temp2_s = sqr(Temp_s)
ACC_Total = Temp2_s / 16383
ACC_Dif1g = 1 - ACC_Total
ACC_Dif1g = abs(ACC_Dif1g)

'Komplementärfilter 0,98*Gyro + 0.02*ACC
'Nur ausführen wenn gesammtbeschleunigung nahe 1g
'X-Achse
Temp_s = Winkel_X + Winkl_Gyr_X
if ACC_Dif1g < 0.5 then
Temp2_s = Temp_s * Kompl_Faktor
Temp_s = 1 - Kompl_Faktor
Temp3_s = Winkl_ACC_X * Temp_s
Winkel_X = Temp2_s + Temp3_s
Else
Winkel_X = Temp_s
End if
'Y-Achse
Temp_s = Winkel_Y + Winkl_Gyr_Y
if ACC_Dif1g < 0.5 then
Temp2_s = Temp_s * Kompl_Faktor
Temp_s = 1 - Kompl_Faktor
Temp3_s = Winkl_ACC_Y * Temp_s
Winkel_Y = Temp2_s + Temp3_s
Else
Winkel_Y = Temp_s
End if

'Drehmatrix um Z-Achse
Temp_s = deg2rad(Winkl_Gyr_Z)
GyroZSin = Sin(Temp_s) 'Drehung um Yaw Achse von Deg zu Rad konvertieren
GyroZCos = Cos(Temp_s)
Temp_X = GyroZCos * Winkel_X
Temp_Y = GyroZSin * Winkel_Y
Temp2_s = Temp_Y + Temp_X
Temp_X = GyroZSin * Winkel_X
Temp_Y = GyroZCos * Winkel_Y
Temp3_s = Temp_Y - Temp_X
'Werte zurückschreiben
Winkel_X = Temp2_s
Winkel_Y = Temp3_s

'Trimm Wert verrechnen
Winkel_X_T = Winkel_X + Winkel_X_Trimm
Winkel_Y_T = Winkel_Y + Winkel_Y_Trimm
Return

'---------- Beschleunigungssensor auslesen ----------
MPU6050_read:

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H3B 'Register h43 auswählen
I2cstop

I2cstart
I2cwbyte &HD1 'Leseadresse

I2crbyte Msb , Ack 'ACC X (Register 3B + 3C)
I2crbyte Lsb , Ack
ACC_X = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'ACC Y (Register 3D + 3E)
I2crbyte Lsb , Ack
ACC_Y = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'ACC Z (Register 3F + 40)
I2crbyte Lsb , Ack
ACC_Z = Makeint(Lsb,Msb)

I2crbyte Msb , Ack 'Temperatur (Register 41 + 42)
I2crbyte Lsb , Ack

I2crbyte Msb , Ack 'Gyro X (Register 43 + 44)
I2crbyte Lsb , Ack
Gyr_X = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'Gyro Y (Register 45 + 46)
I2crbyte Lsb , Ack
Gyr_Y = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'Gyro Z (Register 47 + 48)
I2crbyte Lsb , Nack
Gyr_Z = Makeint(Lsb,Msb)

Return

'---------- Beschleunigungssensor Initialisieren ----------
MPU6050_init:

'Sensor aktivieren
I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H6B 'Register h6B Powermanagement
I2cwbyte &H00 'Wert 0 schreiben
I2cstop

waitms 200
Toggle LED_R
toggle LED_H

'Filter konfigurieren
' ACC Gyro
'Wert Bandbreite Delay Bandbreite Delay
'0 260Hz 0.0ms 256Hz 1.0ms
'1 184Hz 2.0ms 188Hz 1.9ms
'2 94Hz 3.0ms 98Hz 2.8ms
'3 44Hz 4.9ms 42Hz 4.8ms

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1A 'Register h1A Filter
I2cwbyte 6 'Wert schreiben
I2cstop

waitms 200
Toggle LED_R
toggle LED_H

'Gyro Bereich festlegen
'Wert Bereich
'0 +/- 250°/s
'8 +/- 500°/s
'16 +/- 1000°/s
'24 +/- 2000°/s

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1B 'Register h1B Gyro konfig
I2cwbyte 16 'Wert schreiben
I2cstop

waitms 200
Toggle LED_R
toggle LED_H

'ACC Bereich festlegen
'Wert Bereich
'0 +/- 2g
'8 +/- 4g
'16 +/- 8g
'24 +/- 16g

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1C 'Register h1C ACC konfig
I2cwbyte 0 'Wert schreiben
I2cstop

waitms 200
Toggle LED_R
toggle LED_H

Gyr_X_Offset_Sum = 0
Gyr_Y_Offset_Sum = 0
Gyr_Z_Offset_Sum = 0

For i = 1 to 200
gosub MPU6050_READ
Gyr_X_Offset_Sum = Gyr_X_Offset_Sum + Gyr_X
Gyr_Y_Offset_Sum = Gyr_Y_Offset_Sum + Gyr_Y
Gyr_Z_Offset_Sum = Gyr_Z_Offset_Sum + Gyr_Z
waitms 1
next
Gyr_X_Offset = Gyr_X_Offset_Sum / i
Gyr_Y_Offset = Gyr_Y_Offset_Sum / i
Gyr_Z_Offset = Gyr_Z_Offset_Sum / i

Toggle LED_R
toggle LED_H
waitms 200
LED_R = 0
toggle LED_H
Return

Bluesmash
30.04.2015, 13:40
Hallo Chris

Heute hatte ich endlich wieder mal Zeit einen kurzen Testflug zu machen.
Den Komplementärfilter habe ich jetzt auf 0.001 ACC eingestellt, jetzt fliegt er schon um Welten besser! Danke für deinen Tipp!
Das war das Problem mit dem "Nachziehen". Der ACC hat bei der Querbeschleunigung einfach zu viel korrigiert...

Jetzt muss ich noch die ACC-Kalibrierung einbauen...

Hier noch ein Video (leider in der Garage da es draussen zu viel Wind hatte):


https://www.youtube.com/watch?v=zOTDsEv3jcM

Gruss Bluesmash

Che Guevara
30.04.2015, 14:02
Hi,

na das sieht doch schon vielversprechend aus!
Der Faktor wird wohl auch viel besser passen, die 0.02 die du anfangs hattest, wären wohl eher für ne Trägheitsnavigation geeignet, was ich aber definitiv anders machen würde, falls du diesen Schritt überhaupt machen willst.
Was sind den deine Ziele mit dem Projekt?
Gps, Kamera, Höhe halten?

Gruß
Chris

Bluesmash
30.04.2015, 14:53
Hallo Chris

Auf dem Copter habe ich ein Raspberry Pi A+ dieses möchte ich zusammen mit der Kamera für Foto und Filmaufnahmen verwenden. Der Pi soll als AccessPoint laufen und darauf der RPi Cam Control Webserver. Dieser funtioniert bereits, es stürzt aber immer wieder ab und in den Videos habe ich ruckler drinn :( Für die Kamera möchte ich mir noch ein "SuperSimpleGimbal" nachbauen.

Ich habe letztens noch ein neues 10-DOF Sensorboard gekauft. (MPU6050 + HMC5883L + MS5611)
Damit möchte ich eine "Höhe-halten" Funktion programmieren, ob ich den Kompass auch integrieren werden weiss ich noch nicht.

GPS wäre auch ein sehr intressantes Thema. Aber momentan ist es noch nicht auf meiner ToDo Liste...

Auf jedenfall muss ich noch meinen Code optimieren, damit Mehr Zeit für anderes bleibt. Momentan ist alles mit Float programmiert, da muss ich noch einiges ändern...


Gruss Bluesmash

Che Guevara
30.04.2015, 15:23
Hi,

soll darauf auch ne "inteligentere" Software laufen, also zb Gesichtserkennung zum Folgen oder solche Späße?
Ja, du solltest, wenn du noch mehr reinpacken willst, unbedingt auf Festkommaarithmetik umstellen, da geht dann noch einiges mehr!
Wenn du GPS haben willst, brauchst du dafür auch nen Kompass, sonst gehts nicht.

Gruß
Chris

Bluesmash
30.04.2015, 20:15
Mal schauen was noch alles kommt ;)
Am Anfang war eigentlich nur das Ziel einen Qadrocopter zu bauen und programmieren der einigermassen gut fliegt, da mich einfach einfach die Technik intressierte...
Mal schauen welche spielereien ich noch einbauen werde.... aber momentan ist der Pi nur für die Kamera gedacht...

Gruss Bluesmash

Bluesmash
01.05.2015, 13:55
Umso mehr man sich mit den Details beschäftigt, umso mehr Probleme tauchen auf ;)

Das nächste Problem, Temperaturdrift der Gyro's.

Da sich unter der Abdeckhaube auch der Raspberry befindet, wird es unter der Haube sehr warm. Jetzt bei ca. 23° Raumtemperatur knapp 50°C. Ohne Himbeere ca. 40°C.

Zum Drift habe ich jetzt mal eine Aufzeichnung gemacht. Jede Sekunde wird ein neuer Offset (Mittelwert über 200 Messungen) des Gyro gebildet und zusammen mit der Temperatur aufgezeichnet.

Hier mal der Verlauf über die Zeit:
Am Anfang ist die Abdeckhaube drauf. Beim Einbruch der Temperatur habe ich die Haube entfernt und später wieder draufgelegt.

30107

Der Gyro der Y-Achse ist relativ stabil. Die X-Achse driftet aber extrem.

Hier noch eine Grafik im direkten Zusammenhang Temperatur/Offset:

30108

Bei beiden Kurven habe ich eine Lineare Trendlinie (Rot) in Excel hinzugefügt. Der Drift sieht sehr linear aus.
Könnte ich jetzt diese Kurve als Offset im Programm hinterlegen? oder gibt es noch andere Enflüsse die auf den Offset wirken, so dass sich diese Kurve wider verschieben würde...?

Gruss Bluesmash

Che Guevara
01.05.2015, 14:04
Hi,

jap, das ist meistens so ;)
Ob du den Drift mit soner Annäherung wegrechnen kannst, kann ich dir nicht sagen. Wäre aber mal sehr interessant, das auszuprobieren!
Als erstes müsste man wohl prüfen, ob und welche Faktoren in den Offset mit reinspielen. Das lässt sich überprüfen, indem man an versch Uhrzeiten / Tagen den Offset berechnet und dann mal vergleicht.
Dann wäre es gut zu wissen, warum die eine Kurve stärker vom Drift betroffen ist als die andere. Hast du evtl einen der beiden Gyros als PLL-Source ausgewählt?
Außerdem sollte man prüfen, ob dieser Zusammenhang sich auf andere MPU60x0 übertragen lässt, da kann ich dir gerne behilflich sein, wenn du mir deinen Offset-Quellcode zukommen lässt.
Du könntest aber auch eine dynamische Drift-Korrektur einbauen, so hab ich das gemacht:
Es gibt zwei weitere Variablen 'DriftWinkelX' und 'DriftWinkelY', diese sind das selbe wie die normalen Komp.Filter Winkel nur eben werden diese ausschließlich aus den Gyros berechnet. Alle xx ms (z.b. 500) werden dann die Werte verglichen (DriftWinkelX & KompWinkelX, DriftWinkelY & KompWinkelY) und daraus wird dann ein Korrekturfaktor errechnet.

Gruß
Chris

Bluesmash
01.05.2015, 20:33
Ich werde mal ein paar Messungen zum Vergleich machen.

Was verstehst du unter PLL Source? Ich finde es komisch das der einte Gyro praktisch keinen Drift hat und der andere so extrem.

Eine Idee wäre noch, nicht die Fixe Kurve zu verwenden, sondern beim Start den Start Offset und Temperatur speichern und danach anhand der Temperaturdifferenz zum Start und dem Start Offset den korrigierten Offset anhand der Kurve berechnen. Ich hoffe du verstehst was ich meine ;)

Das Problem ist mir auch erst jetzt aufgefallen mit dem kleinen ACC Anteil (0.001) beim Komplementärfilter, jetzt hat der ACC-Anteil zu wenig "Kraft" den Winkel zu korrigieren und er läuft mir langsam davon wenn der Gyro wegdriftet... bei einem Anteil von 0.02 hatte der ACC genug "Kraft" den Absoluten Winkel zu korrigieren, obwohl der Gyro langsam wegdriftete....

Ja es wäre sehr intresssant einen Vergleich zu haben. Ich mache einfach einmal pro Sekunde einen Mittelwert und zeichne diesen auf
Hier mal ein paar Code Ausschnitte:



Dim LSB as Byte
Dim MSB as Byte
Dim Gyr_X as Integer
Dim Gyr_Y as Integer
Dim Gyr_Z as Integer
Dim Temperatur as Integer
Dim Gyr_X_Offset as Integer
Dim Gyr_Y_Offset as Integer
Dim Gyr_Z_Offset as Integer
Dim Gyr_X_Offset_Sum as Long
Dim Gyr_Y_Offset_Sum as Long
Dim Gyr_Z_Offset_Sum as Long
Dim i as Word


'Offset berechnen, Mittelwert aus 300 Messungen
Gyr_X_Offset_Sum = 0
Gyr_Y_Offset_Sum = 0
Gyr_Z_Offset_Sum = 0
For i = 1 to 300
gosub MPU6050_READ
Gyr_X_Offset_Sum = Gyr_X_Offset_Sum + Gyr_X
Gyr_Y_Offset_Sum = Gyr_Y_Offset_Sum + Gyr_Y
Gyr_Z_Offset_Sum = Gyr_Z_Offset_Sum + Gyr_Z
next
decr i
Gyr_X_Offset = Gyr_X_Offset_Sum / i
Gyr_Y_Offset = Gyr_Y_Offset_Sum / i
Gyr_Z_Offset = Gyr_Z_Offset_Sum / i


'---------- Beschleunigungssensor auslesen ----------
MPU6050_read:

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H3B 'Register h43 auswählen
I2cstop

I2cstart
I2cwbyte &HD1 'Leseadresse

I2crbyte Msb , Ack 'ACC X (Register 3B + 3C)
I2crbyte Lsb , Ack
ACC_X = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'ACC Y (Register 3D + 3E)
I2crbyte Lsb , Ack
ACC_Y = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'ACC Z (Register 3F + 40)
I2crbyte Lsb , Ack
ACC_Z = Makeint(Lsb,Msb)

I2crbyte Msb , Ack 'Temperatur (Register 41 + 42)
I2crbyte Lsb , Ack
Temperatur = Makeint(Lsb,Msb)
Temperatur = Temperatur / 34
Temperatur = Temperatur + 365

I2crbyte Msb , Ack 'Gyro X (Register 43 + 44)
I2crbyte Lsb , Ack
Gyr_X = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'Gyro Y (Register 45 + 46)
I2crbyte Lsb , Ack
Gyr_Y = Makeint(Lsb,Msb)
I2crbyte Msb , Ack 'Gyro Z (Register 47 + 48)
I2crbyte Lsb , Nack
Gyr_Z = Makeint(Lsb,Msb)

Return


'---------- Beschleunigungssensor Initialisieren ----------
MPU6050_init:

'Sensor aktivieren
I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H6B 'Register h6B Powermanagement
I2cwbyte &H00 'Wert 0 schreiben
I2cstop

waitms 200
Toggle LED_R
toggle LED_H

'Filter konfigurieren
' ACC Gyro
'Wert Bandbreite Delay Bandbreite Delay
'0 260Hz 0.0ms 256Hz 1.0ms
'1 184Hz 2.0ms 188Hz 1.9ms
'2 94Hz 3.0ms 98Hz 2.8ms
'3 44Hz 4.9ms 42Hz 4.8ms

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1A 'Register h1A Filter
I2cwbyte 6 'Wert schreiben
I2cstop

waitms 200
Toggle LED_R
toggle LED_H

'Gyro Bereich festlegen
'Wert Bereich
'0 +/- 250°/s
'8 +/- 500°/s
'16 +/- 1000°/s
'24 +/- 2000°/s

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1B 'Register h1B Gyro konfig
I2cwbyte 16 'Wert schreiben
I2cstop

waitms 200
Toggle LED_R
toggle LED_H

'ACC Bereich festlegen
'Wert Bereich
'0 +/- 2g
'8 +/- 4g
'16 +/- 8g
'24 +/- 16g

I2cstart
I2cwbyte &HD0 'Schreibadresse
I2cwbyte &H1C 'Register h1C ACC konfig
I2cwbyte 0 'Wert schreiben
I2cstop

waitms 200
Toggle LED_R
Toggle LED_H

Return



Gruss Bluesmash

Bluesmash
02.05.2015, 22:00
Hallo Chris

Ich habe jetzt mal testweise die Temperaturkompensation anhand der gemessenen Kurven implementiert.
In ein paar Testversuchen zwischen ca. 23°C und 45°C bleibt der Absolute Kopterwinkel sehr stabil +/-0.1-0.2° (Der Kopter stand immer unbewegt auf dem Boden)
Ohne die Kompensation hatte ich bei einer Erwärmung von 23°C auf ca. 40°C eine Abweichung von ca. 4° auf der X-Achse...

Ich hoffe jetzt mal, der Temperatur-Drift bleibt in der nächsten Zeit konstant damit man dies nicht alle paar Tage anpassen muss... Natürlich muss man den Drift bei jedem einzelnen MPU6050 separat bestimmen...
Mal sehen wie sich der Drift über einen längeren Zeitraum verhält.
Ich habe nur einen kurzen Flug in der Küche absolviert und abgesehen von den Turbulenzen die in einem kleinen Raum entstehen, fliegt der Kopter jetzt sehr stabil :)

gruss Bluesmash

Bluesmash
24.05.2015, 13:26
Hallo

In letzter Zeit habe ich noch einige Optimierungen am Code vorgenommen. Ich habe jetzt noch das Problem, dass wenn wenig Last auf den Motoren ist (Sinkflug) die Regler sich ein wenig aufschaukeln und er in der Luft ein wenig "zappelt". Da muss ich noch an den PID-Parameter schrauben. Hat da gerade jemand eine Idee in Welche Richtung ich schrauben soll? P und I verkleinern?

Ich habe jetzt auch den Luftdruck Sensor (MS5611) in Betrieb genommen und berechne damit die Höhe. Wenn er ruhig auf dem Boden steht schwankt die Höhe so um ca. +/- 10cm. Wenn ich jetzt aber die Motoren starte (Copter steht auf dem Boden) fällt die Höhe um ca. 1-2m. Durch die Propeller gibt es unter dem Copter einen Überdruck und dadurch sinkt natürlich die Höhe. Den Drucksensor habe ich mit Schaumstoff eingepackt.
Nun meine Frage, wie verhält sich das dann in der Luft? Wie sind da so die Erfahrungen? Ändert sich der Druck auch bei mehr oder weniger Schub?
Und wie sind die Erfahrungen bei einem Höhenregler? Reicht es auf den Luftdruck zu Regeln oder sollte ich den Luftdruck über einen Komplementärfilter mit den ACC-Sensoren koppeln?

Gruss Bluesmash

Bluesmash
11.10.2015, 21:29
Hallo Zusammen

Da mein Grosser schon relativ gut fliegt brauchte ich eine neue Herausforderung.
Daher habe ich mir noch einen kleinen Quad für indoor gebaut.
Die Platine habe ich selber gezeichnet und geätzt.

Dies ist aber schon die zweite Version. Bei der ersten habe ich einige Design-Fehler bei der Platine gemacht und die Motoren hatte ich nur mit einer Lasche befestigt. Diese sind aber nach und nach durch die Vibrationen abgebrochen... :(

Mit den Motoren bin ich aber nicht 100% zufrieden. Irgendwie machen einige komische Geräusche. Wie wenn die Lager bereits defekt wären, dabei haben sie erst ein paar Flugminuten.... Irgendwelche komischen Resonanzgeräusche, auf dem Video kann man es hören...

Hier einige Eckdaten:
- Motoren: AP03 7000kv
- ESC: SuperMicro Systems Mi-3A
- Empfänger: Orange
- Akku: Turnigy nano-tech 750mah 1s
- Propeller: 3020 von Hobbyking
- Empfänger: OrangeRX NanoReceiver R616XN
- IMU: MPU6050
- Prozessor: Atmega328P

Hier ein paar Bilder:

30787

30788

30789

30790


https://youtu.be/94cC_pz9oFk