Brushless Motor per Arduino steuern

donvido

Erfahrener Benutzer
#81
Also ich habe letzten Donnerstag erste Flugversuche mit meiner selbstgeschriebenen Flugsteuerung unternommen.
Ist vorläufig eine reine Lageregelung durch einen Zustandsregler (quasi PD-Regler). D.h. ich muss noch eine Positionsregelung einbauen um für eine Parameteridentifikation den Copter halbwegs stabil auf einer Position halten zu können.
Ich nehme dafür die Rohdaten (Gyro und Acc) und schätze mit einem Kalmanfilter die Lagewinkel.
Die Motoren werden mit 11-bit PWM angesteuert.
Ohne Codeoptimierung komme ich damit auf meinem Mega2560 auf durchschnittliche 10ms pro Loop.
 

das_copter_198

Erfahrener Benutzer
#82
Bis zu meinen ersten Flugversuchen mit meinem eigenem Code wird es noch ein bisschen dauern, aber bald sind ja Ferien und da hab ich genug Zeit zum testen ;) Wie genau liest du die Rohdaten aus? Und wie viel Code ist das bei dir ungefähr?
 

donvido

Erfahrener Benutzer
#83
Ich verwende momentan direkt die aktuelle Bibliothek von Jeff Rowberg.
MPU6050.getMotion6(&ay, &ax, &az, &gy, &gx, &gz)
Schau dir am besten die dort mitgelieferten Beispiele an und informier dich über I2C-Kommunikation, wenn dir das dann immernoch unklar ist.

Aktuell bin ich bei einer binären Sketchgröße von etwa 40kB. Ist aber auch nicht so wild, da die Codeoptimierung zum Schluss kommt und der Mega hat auch genug Speicher.
 

das_copter_198

Erfahrener Benutzer
#84
Ich habe mir bereits die Bibliothek und auch das Beispiel MPU6050 angeschaut. Ich wollte eig. nicht direkt diese Bibliothek verwenden sondern lieber selber was schreiben. Aber für den Anfang könnte ich natürlich auch direkt die Bibliothek nehmen und wen der Rest geht, kann ich das dann selber schreiben. Wie I²C generell funktioniert, weiß ich schon, ich bin mir bei der Realisierung mit dem Arduino noch nicht sicher aber mit Hilfe von der Bibliothek, Multiwii und anderen sollte ich das schon irgendwann schaffen ;)
 

das_copter_198

Erfahrener Benutzer
#85
Nachdem ich den Serial.begin auf 9600 anstatt auf 38400 gestezt habe ging das auslesen und ausgeben der Daten sehr gut. Ich werde die dev-lib jetzt weiterhin verweden, da sie sehr gut funktinoiert.
 

das_copter_198

Erfahrener Benutzer
#86
Hab nochmal ne kurze Frage zu der ich nichts finde. Wenn ich z.B. ein 8-Bit PWM Signal verwende, und als Wert 104,5 übergebe. Geht das oder macht er aus den 104,5 einfach 104?
 

donvido

Erfahrener Benutzer
#89
Würde keinen Unterschied machen. Die Register selbst sind ja nur 16bit groß, da passt gar kein float rein. Das wird, wenn man überhaupt float übergeben kann, intern gecastet und fertig is.
 

das_copter_198

Erfahrener Benutzer
#90
Hallo,

mein "Testcopter" ist jetzt fast fertig gebaut und jetzt wollte ich anfangen mal die ganzen Codefetzen zusammen setzen ;) Jetzt hab ich aber das erste Problem und find keine passende Lösung. Ich lese die "raw data" der MPU mit der i2cdevlib aus und jetzt schaffe ich es irgendwie nicht die Werte des Acc in ° umzurechenen. Wie geht das bzw. das ist die "Formel" dafür?
 

donvido

Erfahrener Benutzer
#91
Dann kann ich dir dieses Dokument wärmstens empfehlen. Das ist von Freescale Semiconductor und erklärt wie man das Kippen eines 3-Achsen Kompass kompensiert. Dafür müssen nämlich zunächst die Kardanwinkel für Pitch und Roll ermittelt werden.
 

donvido

Erfahrener Benutzer
#93
Versteh ich das richtig? Du willst aus den Beschleunigungsinformationen deine Positionswinkel bestimmen?
Dann siehe Gleichung 14: tan(phi[rollwinkel])=(acc_y/acc_z)
und Gleichung 15: tan(theta[pitchwinkel])=(-acc_x/(acc_y*sin(phi)+acc_z*cos(phi)))
Dafür bedarf es keiner Einheitenumrechnung derRohdaten. Einzig die Winkel werden in Radiant angegeben, die müsstest du dann also nochmal in Grad umrechnen.
 

das_copter_198

Erfahrener Benutzer
#94
Ja, ich will einmal aus den ACC Daten den Winkel bestimmen und aus dem Gyro Werten die Beschleunigung in Grad/Sekunde. Ich werd mir die die beiden Gleichungen mal anschauen.
Mit den beiden Gleichungen sollte es ja dann eig gehen. Ich werde das jetzt mal ausprobieren.
 
Zuletzt bearbeitet:

das_copter_198

Erfahrener Benutzer
#95
Also das hier sind die 2 Gleichungen, einmal für rollwinkel und einmal für pitchwinkel:

tan(phi[rollwinkel])=(acc_y/acc_z)
tan(theta[pitchwinkel])=(-acc_x/(acc_y*sin(phi)+acc_z*cos(phi)))

Wenn ich das richtig sehe, müssen die Gleichungen ja noch aufgelöst werden oder? Und dann kann ich mit den raw Daten Roll und Pitch in ° auslesen.
 

donvido

Erfahrener Benutzer
#97
Naja, was heißt auflösen, ich dachte, das sei selbstverständlich:
phi[rollwinkel]=atan(acc_y/acc_z)
theta[pitchwinkel])=atan(-acc_x/(acc_y*sin(phi)+acc_z*cos(phi)))

Das Ergebnis sind Lagewinkel in Radiant. Mit dem Faktor (180/3.14) kannst du die dann in Grad umrechnen.
Statt atan kannst du auch atan2 verwenden und evtl wird auch atand und atan2d unterstützt (gibt Winkel in Grad aus).
 

das_copter_198

Erfahrener Benutzer
#98
Danke, dass hilft mir sehr viel :D Für was steht eig. "phi"?
Angle Y geht nur bei x gibt es einen Fehler wegen dem phi, muss das noch festgelegt werden?
 
Zuletzt bearbeitet:

donvido

Erfahrener Benutzer
#99
Was meinst du?
phi,theta und psi sind geläufige und in vielen Publikationen verwendete Bezeichnungen für die Lagewinkel. Ich verwende lieber alpha, beta, gamma für diese sogenannten Euler/Kardanwinkel.
 
FPV1

Banggood

Oben Unten