Posts mit dem Label Brushless Motor werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Brushless Motor werden angezeigt. Alle Posts anzeigen

Sonntag, 12. Mai 2013

DLPF einstellen für den MPU6050

image
Kleiner Versuchsaufbau mit Sensor und Brushless Motor

Auf einem Quadrocopter sorgen die Motoren für viel Vibrationen, die sich ohne einen Filter auf den Sensor negativ auswirken. Über ein Verlaufsdiagramm über die Beschleunigung und die Winkelgeschwindigkeit kann man deutlich hoch frequentierte Abweichungen sichtbar machen. In einem meiner ersten Tests hatte ich die Funktion DLPF (Digitaler Low-Pass Filter) vom Sensor nicht eingeschaltet und wunderte mich zunächst, warum die Lage nicht reguliert wurde. Also erweiterte ich mein Programm zur Analyse und sah dann das Problem.

Das nächste Bild zeigt den Sensor stillliegend mit laufendem Motor. Die schwarze Linie zeigt die Rohdaten an, die grüne Linie zeigt das Ergebnis nach einer Glättung an.

image
Die Vibrationen vom Motor erschweren es, die eigentlich Lage festzustellen, die der Sensor wirklich hat.

Zuvor kannte ich die Lösung von analogen Tiefpassfiltern. In der Digitaltechnik sieht das etwas anders aus. Es ist ein zeitkritisches Thema, wenn dort der Filter ausgeführt wird. Zu empfehlen ist, einen Microcontroller alleine zu verwenden, wenn der Sensor keinen eigenen hat.

Zum Glück gibt es das DLPF im MPU6050 Sensor, der 7 verschiedene Grenzfrequenzen zur Verfügung stellt und somit die hoch frequentierten Störungen ausfiltern kann.

Nachdem ich nicht ganz so müde an die Sache rangegangen bin, verstand ich auch die Einstellung mit dem DLPF (Digitaler Low-Pass Filter) und legte die Einstellungen in der Initialisierung fest. In meinem Beispiel Projekt vom Januar reicht es, nur diese eine Codezeile hinzuzufügen (besser ist, wenn ihr die neue Solution herunter ladet).

// Konfiguration festlegen
// Einstellung => Acc=5Hz, Delay=19.0ms, Gyro=5Hz, Delay=18.6ms, Fs=1kHz

StatusMessage(Write(new byte[] { 0x1A, 0x06 }));

Wie schon im Kommentar zu sehen ist. Lässt der Sensor nur noch Bewegungen bis 5Hz zu. Alles was darüber steht, wird ausgefiltert.

Der neue Test mit dem DLPF zeigt ein deutlich besseres Ergebnis. Egal wie weit ich nun den Motor ansteuere, die Messdaten zeigen weiter die ruhige Lage des Sensors.

image
Nach der Einstellung des DLPF ist von der Motorenvibration (fast) nichts mehr zu sehen.

Je nach Anwendung könnte die Grenzfrequenz von 5Hz natürlich auch etwas zu niedrig sein. Betrachtet man den Quellcode vom WiiCopter, so ist zu sehen, dass die Grenzfrequenz bei 260Hz liegt.

Wie bereits im Codeausschnitt zu sehen ist, werden zwei Bytes in einem Array übergeben. Das Byte ‘0x1A’ steht für den Aufruf der Konfiguration. Das zweite Byte legt die gewünschte Einstellung fest, die ich in der folgenden Tabelle aufliste:

Byte Inhaltliche Einstellung
0x00 Accelrometer => 260Hz, Gyroscope => 256Hz
0x01 Accelrometer => 184Hz, Gyroscope => 188Hz
0x02 Accelrometer => 94Hz, Gyroscope => 98Hz
0x03 Accelrometer => 44Hz, Gyroscope => 42Hz
0x04 Accelrometer => 21Hz, Gyroscope => 20Hz
0x05 Accelrometer => 10Hz, Gyroscope => 10Hz
0x06 Accelrometer => 5Hz, Gyroscope => 5Hz

Beispiel Solution für Netduino: ExampleMPU6050Sensor.zip

Montag, 20. August 2012

Wie schließe ich ein Brushless Motor an

image
Brushless am Arduino zum testen.
Vielleicht für den einen oder anderen Interessant, wie eigentlich ein Brushless Motor angeschlossen wird. Für die Versorgung sind zwei Zuleitung an den Regler, die jeweils mit Rot und Schwarz farblich zu erkennen sind. Andernfalls sind am Regler die Pol Richtung gekennzeichnet. Zum Bürstenlosen Motoren führen jedoch 3 Leitungen ab. In meinem Beispiel sind die Leitungen blau, andernfalls sind die Leitungen am Regler ebenfalls Kennzeichnet. Der Motor selbst hat wiederum gelb, rot und schwarz.
image
Links zusehen, die Plus und Minus Kennzeichnung. Rechts die Kennzeichen A, B und C.
Den ersten Blauen, bzw. hier Kennzeichen B, verbinde ich mit Schwarz. Im folgendem Bild ist der gelbe Leitung an Kennzeichen A und Rot an Kennzeichen C verbunden. Nun dürfte nach Anschluss sich der Motor beim durchsteuern gegen den Uhrzeigersinn drehen.
image
Motor dreht sich Linksrum (gegen den Uhrzeigersinn)
Schließe ich den  gelben an C und den roten an A, dreht sich der Motor im Uhrzeigersinn.
image
Motor dreht sich Rechtsrum (in Uhrzeigersinn)
In welche Drehrichtung der Motor Dreht, hängt im Grunde vom Propeller ab und den Motor kann man praktisch nicht falsch anschließen, so das dieser beschädigt wird. Vorausgesetzt ist, dass alle drei Leitungen verbunden sind, um ein Drehstromkreis zu erzeugen, der den Motor zum drehen bewegt.

Freitag, 27. Juli 2012

Brushless Motoren und Regler

image
Brushless Motor und Regler

Vor einigen Wochen stellte ich fest, dass der Regler nicht immer den Motor so steuert, wie ich es erwarte. Das liegt wohl daran, dass ich mich an die Fahrtenregler für normalere Motoren gerichtet habe. Dass nun die Regler für Brushless Motoren ein paar Merkmale haben, wie sie richtig funktionieren, war mir bis vor kurzem unbekannt. Zum einen sollte das PWM Signal nicht gerade auf 2ms Impuls stehen, da sonst das Menü vom Fahrtenregler angesprochen wird. Die Mittelstellung ist für den Start besser geeignet, also 1,5ms.

image
Brushless Motor. Die drei Anschlüsse sind notwendig um ein Drehstromkreis zu erzeugen.

Beim Arduino kann einfach ein PWM Signal erzeugt werden, das genau für einen Servo oder hier für einen Regler geeignet ist. Anders ist es bei dem Netduino, womit sich PWM Signale erzeugen lassen, die nicht mehr für das Regeln geeignet sind. Zwar kann ein Digital Servo mit einer höheren Frequenz durchgesteuert werden, jedoch muss immer das Verhältnis von Periodendauer und Pulslänge übereinstimmen. Werden diese Werte überschritten, so kann sich, wie in meinem Fall, der Motor im wahrsten Sinne des Wortes abrauchen.

Leider war da kein Regler. Daher habe ich ersatzweise ein Bild von einem Servo verwendet.
#include <Servo.h> 

Servo pwm;

void setup() {
  pwm.attach(9);
}

void loop() {
  // Periodenlänge ist aus der 
  // Bibliothek bei 20ms

  // Startbereich
  // Pulslänge von 1ms
  pwm.write(0);  

  delay(1000);       
  
  // Mittelstellung
  // Pulslänge von 1,5ms
  pwm.write(90);  

  delay(1000);   
  
  // Endbereich
  // Pulslänge von 2ms
  pwm.write(180);  

  delay(1000);             
}
Beispiel Ansteuerung eines Servos oder Reglers mit Hilfe der Bibliothek für Arduino

In einigen Foren habe ich Werte gefunden, die außerhalb des gedachten Bereiches liegen. Obwohl mir das bekannt war, habe ich die Werte probiert, da ich zu diesem Zeitpunkt noch keine ausreichenden Erfahrungen hatte, was Brushless Motoren und deren Regler angeht. Bei normalen Servos ist es weniger problematisch, da diese einiges aushalten. Bei kleinen Servos kann das Getriebe oder der Potentiometer mit dem Servohebel brechen.


using System;
using Microsoft.SPOT;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
using System.Threading;

namespace ServoControlExample
{
    public class Program
    {
        public static void Main()
        {
            PWM pwm = new PWM(Pins.GPIO_PIN_D5);

            while (true)
            {
                // Für jedes setzen, wird immer 
                // eine Periodendauer von 20ms
                // verwendet. In der Sekunden 
                // wird diese Periode 50 mal 
                // wiederholt, das entsprechend
                // 50Hz darstellt.

                // Startbereich 
                // Pulsdauer bei 1ms
                pwm.SetPulse(20000, 1000);
                Thread.Sleep(1000);

                // Mittelstellung
                // Pulsdauer bei 1,5ms
                pwm.SetPulse(20000, 1500);
                Thread.Sleep(1000);

                // Endbereich
                // Pulsdauer bei 2ms
                pwm.SetPulse(20000, 2000);
                Thread.Sleep(1000);    
            }            
        }
    }
}
Beispiel Ansteuerung eines Servos oder Reglers mit Hilfe der PWM Klasse aus dem .NET Micro Framework

Im Zeitalter von .Net Framework und Bibliotheken wird einem einiges abgenommen. Ich erinnere mich noch, wie ich lange nach den Einstellwerten für den ATMega16 gesucht habe, und so wirklich zufrieden war ich damit nie. Bei nachfragen in bekannten Foren konnte mir keiner weiter helfen. Und ja, ich habe gegoogled! Smiley mit herausgestreckter Zunge

Freitag, 20. Juli 2012

Pegelwandler für den Regler

Microcontroller und Regler mit Pegelwandler

Nach dem ich einen Pegelwandler über dem Breadboard ausprobiert habe, dachte ich "löte doch mal das gleich auf die Platine!". Damit ich auch die richtigen Widerstände verwende, habe ich kurzerhand die Schaltung für meine Bedürfnisse berechnet. Im Grunde reicht die Grundformel R=U/I. Zunächst suchte ich in meinen Kisten nach den passenden Transistoren, und fand schließlich auch die PNP Varianten. Zuvor habe ich nur NPN verwendet, wodurch ich noch ein Inverter benötigt habe, um das richtige Ausgangssignal zu erhalten.

Leider bin ich etwas gestolpert, als ich meinen Kaffee an meinen Tisch brachte.

Was hier allerdings auffallen dürfte ist, dass ich nicht die Werte genommen habe, die ich eigentlich berechnet habe, sondern Widerstände mit einem geringeren Wert. Da ich meistens mit 1 Milliampere rechne, ist es nicht weiter tragisch, wenn die Belastung auf 2mA oder 3mA ansteigt und für meine Anwendungen absolut ausreichend. Abgesehen davon, hätte ich sonst eine Platine voller Widerstände, und das wäre dann schon eine Verschwendung.

Widerstände 8x2,2kOhm und 4x1,5kOhm, 4xPNP BC177A und 4xNPN BC547A Transistoren, 1 Platine und Steckstifte zum anschließen.

Zugegeben passt auf der Platine noch mehr, dennoch sollte es erst einmal reichen. Vielleicht fällt mir später noch etwas ein, dass ich als Schaltung gebrauchen könnte.
Die fertigen 4 Pegelwandler. Von Links kommt das Signal vom Microcontroller und links vom schwarzen Transistor wird der Regler angeschlossen.

Kurz warum ich hier Pegelwandler brauche. Normalerweise würden die Servos, oder zumindest die kleinen, mit einem Spannungsimpuls von 3,3V auskommen. Schließt man hier einen normalen an, so kann es vorkommen, dass der Spannungsabfall zu groß ist und das Signal nicht ausreichend für den Regler zu lesen ist. In meinem Fall sind es die Regler für die Brushless Motoren, die keine ausreichende Entkopplung zum Stromkreis haben.

Defekter Brushless Motor

Brushless Motor, Regler und der Arduino zum programmieren des Reglers

Ärgerlich. Jetzt bin ich mit dem größten Teil der Programmierung durch, ist mir beim justieren ein Motor im wahrsten Sinne abgeraucht. Nach dieser neuesten Erfahrung musste ich feststellen, dass der Regler für Brushless Motor in einem schädlichen Bereich steuern kann. Vielleicht kann ich erst einmal einen Tricopter konfigurieren, um meine Tests fortzuführen und gegebenenfalls auch mal zu fliegen.

Sonntag, 17. Juni 2012

Brushless Motoren montieren

WP_000208 WP_000211
Brushless Motor und entsprechende Teile
WP_000210
Motor mit Propeller und Fahrtenregler
Nach über einem Monat habe ich endlich die Motoren zu meinem Projekt “Quadrocopter” erhalten. Ärgerlich war, dass das Paket beim Zollamt abgeholt werden musste, weil die entsprechende Rechnung am Paket nicht vorhanden war. Somit hat sich die Montage um eine Woche verzögert.
Quadrocopter_08 Quadrocopter_10
Motor am Rumpf montiert und verkabelt
Nachdem ich wieder die Stellen markiert, gekörnt, angebohrt und gebohrt habe, konnte ich die Motoren montieren. Anschließend kam die Verkabelung dran. Da mir die entsprechenden Y-Verbindungen für die Fahrtenregler fehlten, lötete ich einige Stecker zusammen. Folgend kam die Verkabelung und die Verbindungen auf dem Rumpf. Leider finde ich die Verkabelung noch nicht ganz gelungen, und ich denke, das mache ich am nächsten Wochenende nochmal.
Quadrocopter_09
Mit dem Arduino Nano 3.0 wurde durch geprüft
Nachdem ich alles mehr oder wenig provisorisch verkabelt hatte, schrieb ich für den Arduino ein kleines Programm zum regulieren des PWM Signals. Mit einem Potentiometer konnte ich die Ansteuerung des Fahrtenreglers vornehmen. Zuerst habe ich ein kleines Netzteil verwendet, das sich aber nach dem Anschluss des zweiten Fahrtenreglers als zu schwach herausstellte, und nahm daher den Akku. Mit Vorsicht drehte ich langsam am Potentiometer und staunte, dass ich bereits bei ca. 20% erst einmal anhalten musste, da mir sonst auf dem Tisch weggeflogen wäre. Gemessen an einem Rotor, könnte man schon meinen, dass einer  reichen würde, den ganzen Rumpf hochzuziehen. Später habe ich dann auf dem Boden im Wohnzimmer weiter getestet und drehte auf ca. 50%. Es flatterten schon die Gardinen und meiner Freundin wurde kalt, durch den starken Wind von den Rotoren.
Quadrocopter_11
Passt gerade so auf dem Schreibtisch
Inzwischen hat mein Projekt eine gewisse Größe erreicht. Auf dem Bild zu sehen: mein Quadrocopter auf meinem Schreibtisch.
Nun bleibt noch die Programmierung der Steuerung übrig.

Ameisen Simulation und andere Dinge

Wer lange sich schon mit C# beschäftig, hat sicherlich schon mal was von AntMe gelesen oder gehört. Diese Idee hatte ich aufgegriffen und mi...