Brushless Motor per Arduino steuern

das_copter_198

Erfahrener Benutzer
#1
Hallo,

ich möchte gerne für ein kommendes Projekt einen Brushless Motor bzw. eher einen Esc mit einem Arduino steuern. Ich kenne zur Zeit nur eine Möglichkeit und zwar die, dass ich den Esc wie einen Servo ansteuere. Gibt es auch noch andere Methoden? Sind die dann evtl. besser oder haben andere Vorteile oder Nachteile?

Lg Vincent
 

schnellmaleben

Erfahrener Benutzer
#5
Wenn Du diese Methode nutzt steht Dir der Bereich 1000-2000 zur Verfügung. analogWrite() ist nicht zu empfehlen - es hat zwar zufällig eine für die meisten ESCs schnellstmöglich passende Frequenz (490Hz) aber ein valides RC-PWM Signal liegt erst bei 50% Dutycyle, also 128, an, und geht bis maximal 254, also deutlich schlechtere Auflösung als die Servo Bibliothek.
 

das_copter_198

Erfahrener Benutzer
#10
Danke für die Links. Zum ansteuern der ESC werde ich bei der Servo Libary bleiben. Ich werde heute mal die Multiwii Codes durchschauen und mal schauen wie ich das mit dem Empfänger am Ende machen werde.

Lg Vincent
 

das_copter_198

Erfahrener Benutzer
#11
Ich hab heute mal die Motoren mit writeMicroseconds() angesteuert und das ging recht gut. Für mein kommendes Projekt weiß ich jetzt fast alles. Ich bin mir nur noch bei der PID Regelung nicht ganz sicher. Ich habe auf dieser Seite einen Code gefunden. Ich bin mir leider nicht sicher ob dieser Code stimmt. Weiß jemand ob der passt und ob ich ihn so ähnlich übernehmen kann oder ob der falsch ist?

Lg Vincent
 

schnellmaleben

Erfahrener Benutzer
#12
Sehr schön dass schon was geklappt hat :)

Der Code ist nicht falsch, nur halt sehr einfach gehalten.

Je nach dem was sonst noch so auf dem Mikrocontroller läuft musst Du entweder dafür sorgen dass die Regelschleife ausreichend schnell und/oder ohne zeitliche Schwankungen durchlaufen wird. Falls solche (Jitter) auftreten, kann man sie auch bei Kd berücksichtigen, indem man durch die vergangene Zeit seit dem letzten Aufruf teilt.
Je nach dem was da geregelt werden soll (z.B. Multicopter: die Lage) vereinfacht sich wieder einiges (Zielwert ist Drehrate = 0) oder wird komplizierter (Begrenzung von Ki ist sinnvoll, sonst wird kippt er vielleicht beim Starten weg).
Das nur zwei Ansätze. Wenn Du aber den MultiWii/APM/whatever-Code anguckst, findest Du das Grundprinzip, was der Artikel gut erklärt, dort wieder.
 

das_copter_198

Erfahrener Benutzer
#13
Also ich hatte vor die PID Regelung für einen Bicopter zu verwenden. Dazu werde ich ein Arduino und eine MPU6050 benutzen und mein Ziel ist es das der Copter am Schluss stabil fliegt. Kd durch die Zeit teilen ist eine gute Idee um Fehler zu vermeiden. Wie kann ich aber Ki begrenzen? Einfach abfragen wie groß es ist und falls es zugroß ich nicht mehr größer machen?
 

das_copter_198

Erfahrener Benutzer
#14
Ich hätte da noch mal ne Frage. Wen der Copter in eine Richtung gesteuert wird, also wen ich zum Beispiel nach Links fliege, wird diese Axe, also die Roll Axe, auch von der PID Steuerung geregelt oder werden nur die anderen Axen weiter geregelt.
 

schnellmaleben

Erfahrener Benutzer
#15
Es werden immer alle Achsen geregelt. Ausgehend vom der Seite die Du gefunden hast bedeutet Kurvenflug, also RC-Eingabe != 0 einfach dass der Sollwert (z.B. 5% Stick nach links gegeben - Roll-Achse soll um 5° pro Sekunde nach links drehen) modifiziert wird - die Regelungsschleife läuft einfach weiter, auf ein anderes "Regelziel".

Zum Vergleich, MultiWii setzt das auch so um (Stickeingabe wird einfach zum Fehler dazu addiert): https://code.google.com/p/multiwii/source/browse/tags/version-2.3/MultiWii_shared/MultiWii.cpp
Zeile 1217 für die "alte" PID-Implementierung bzw. Zeile 1291 und 1305 für die korrigierte (welche näher an "Literatur"-Code ist). Etwas komplizierter sieht das da alles aus weil die Accelerometer-gestützten Flugmodi berücksichtigt werden müssen - ich würde die im ersten Entwurf weglassen und nur mit dem Gyro arbeiten.
 

das_copter_198

Erfahrener Benutzer
#16
Also im Multiwii Code, wird "error", also die Abweichung berechnet aus dem Gyrowert der Axe und dem Steuereingabe der Axe. Die Eingaben der Steuerung sind zwischen -500 und 500. Im Multwii Code steht das so:

error = rc - imu.gyroData[axis];

Die imu.gyroData[axis] ist in Grad pro Sekunden oder wie wird die angegeben?
 

schnellmaleben

Erfahrener Benutzer
#17
Ne muss irgendwas Kleineres sein, sonst würde nen int16_t keinen Sinn machen. Weiß nicht.

Hinweise:
IMU.cpp:189: scale = (currentT - previousT) * GYRO_SCALE; // GYRO_SCALE unit: radian/microsecond
def.h:1691:
#if defined(MPU6050)
#define GYRO_SCALE (4 / 16.4 * PI / 180.0 / 1000000.0) //MPU6050 and MPU3050 16.4 LSB/(deg/s) and we ignore the last 2 bits

Sensors.cpp:1386: GYRO_ORIENTATION( ((rawADC[0]<<8) | rawADC[1])>>2 , // range: +/- 8192; +/- 2000 deg/sec

Zusammen mit dem Datenblatt der MPU6050 müsstest Du es rausfinden können...
 

das_copter_198

Erfahrener Benutzer
#18
Ok ich werde mir das mal anschauen. Ich hatte für mein Projekt vor, die Gyrowerte in Grad umzurechnen und die PID Regelung dann so machen, das sich der Copter immer auf die Startzahl regelt. Diese Gradzahl wird dann mit dem RC Signal verrechnet und für die PID Regelung verwendet. Ist das so sinnvoll und wird das auch funktionieren oder ist es eher eine dumme Idee die Gyrowerte in Grad umzurechnen?
 

schnellmaleben

Erfahrener Benutzer
#19
Denke das geht genauso gut und ist einfacher nachzuvollziehen. Ich glaube die MultiWii-GUI zeigt die Werte auch wieder in ° und °/s an, da wird hoch skaliert.

Multiwii nimmt intern ints weil Multiplikation/Division auf dem Atmega (8bitter...) für floats so langsam ist, die Regelschleife wäre nicht schnell genug... Und man eben die meiste Zeit mit Werten <1°/s hantiert, eine viel feinere Einheit, so dass sich quasi eine Fixkommazahl in der Berechnung ergibt. Da muss man aber an allen möglichen Stellen aufpassen dass man a) nicht zu ungenau wird und b) der Wertebereich nicht überläuft, deshalb auch all die schönen Kommentare, int32-casts usw. da im Code ;)

Wenn Du die Möglichkeit hast, nimm einen leistungsfähigeren Mikrocontroller als einen 8bit Atmega, dann hast Du diese Art von Problemen gar nicht. Kann aber auch sein dass ein normaler Arduino für ein einfaches Projekt langt, bin nicht sicher.
 

das_copter_198

Erfahrener Benutzer
#20
Ich wollte jetzt erstmal ein Arduino Uno nehmen und ich hoffe das die Leistung reicht. Wen diese Leistung nicht reicht, werde ich mir vielleicht das Galilieo kaufen, das sollte mehr Leistung erbringen. Noch eine andere Frage. Würde es etwas bringen wen ich die Werte des ACC und des Gyro in Grad umrechne und diese Werte dann mit einem Kalmanfilter filtere, würde das dann bessere Werte bringen bzw. genauere Werte oder ist das eher unnötig.
 
FPV1

Banggood

Oben Unten