Liste der Anhänge anzeigen (Anzahl: 1)
Quadrocopter
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.
Anhang 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
Liste der Anhänge anzeigen (Anzahl: 1)
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.
Anhang 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 ;)
Code:
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
Liste der Anhänge anzeigen (Anzahl: 2)
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.
Anhang 30107
Der Gyro der Y-Achse ist relativ stabil. Die X-Achse driftet aber extrem.
Hier noch eine Grafik im direkten Zusammenhang Temperatur/Offset:
Anhang 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
Liste der Anhänge anzeigen (Anzahl: 4)
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:
Anhang 30787
Anhang 30788
Anhang 30789
Anhang 30790
https://youtu.be/94cC_pz9oFk