Hallo Leute,
ich habe mir o. Regler bestellt um mich an einem Quadcopter zu versuchen. Ich möchte aber erst einmal die Steuerung ohne RC kennenlernen und verstehen. Quasi ein bis Rotoren einzeln steuern um das Ding in Gleichlauf zu bringen. Angebunden versteht sich. Kann mir jemand sagen, wie so ein Regler mit einem Arduino angesteuert wird?
Gruß
Kucky
Brushless Motor Regler werden einfach wie Servos angesteuert zb mit der Servo-Bibiothek. Damit sie starten müß zuerst ganz auf null geregelt werden und dann auf den gewünschten wert.
Dein Vorhaben ist aber sehr schwierig. Quadrocopter werden nicht drkt mit den RC signalen gesteuert sondern über einen eigenen kontroller der die Steuersignale entgegennimmt und mit der Lagekontrolle (meist 3 Achsen- Beschleunigungmesser und 3-Achsen Gyrometer, optional Kompass, Barometer, Abstandssensor für die Höhe.) die Motoren angesteuert. Projekte auch auf Basis des Arduino gibt es im Netz.
Grüße Uwe
Hallo Uwe,
danke für die schnelle Antwort. Dann ist das wohl, wie beim Servo, ein PWM Pin den ich hier kurz auf 0 setzen muß. Das mit der Lagekontolle will ich später mit einem Gyro (aus einem Wii Controller ?) realisieren. Hab´ ich in der fpv-Community gefunden. Ich will mich aber langsam herantasten. Nach den Arduino Projekten werde ich mal googlen.
Schönen Abend noch.
Gruß Willi
Das Servo Signal ist kein PWM Signal sondern ein PPM Signal (Puls Pause Modulation).
Der Arduino UNO und vergleichbare können mit der Servo- Bibliothek auf gleichzeitig auf 12 x -beliebigen PIN Steuersignale ausgeben. Der Arduino MEGA schafft 48.
Grüße Uwe
Hallo UweFed,
sorry, das ich mich erst heute melde und für die Infos bedanken kann. Habe mich natürlich auch weiter informiert. Ich habe die Regler zwar noch nicht in der Hand (kommen nächste Woche), gehe aber davon aus, dass das weise Kabel der Servoanschluß ist und die beiden anderen aus dem 3er-Verbund +5V bzw. gnd sind.
Grüße aus Leverkusen
Willi
So da bin ich wieder,
ich habe im englischen Forum gepostet. http://arduino.cc/forum/index.php/topic,124175.0.html. Kann mich aber im Englischen nicht genau ausdrücken. Ich habe folgenden Code benutzt,
#include <Servo.h>
Servo motorCW1;
Servo motorCW2;
#define PIN_CW1 5
#define PIN_CW2 6
void esc()
{
delay(5000);
Serial.println("Sending lowest throttle CW1");
motorCW1.writeMicroseconds(1000);
delay(2000);
Serial.println("Sending lowest throttle CW2");
motorCW2.writeMicroseconds(1000);
delay(2000);
Serial.println("Low throttle sent");
}
void setup() {
Serial.begin(9600);
motorCW1.attach(PIN_CW1);
motorCW2.attach(PIN_CW2);
Serial.println("ESC calibration started");
esc();
Serial.println("ESC calibration completed");
}
void loop() {
if (Serial.available() > 0)
{
int key = Serial.read();
switch(key)
{
case '1':
motorCW1.writeMicroseconds(1050);
// motorCW2.writeMicroseconds(1050);
Serial.println("1050");
delay(2000);
break;
case '2':
// motorCW1.writeMicroseconds(1100);
motorCW2.writeMicroseconds(1100);
Serial.println("1100");
delay(2000);
break;
case '6':
motorCW1.writeMicroseconds(1000);
motorCW1.writeMicroseconds(1000);
Serial.println("1000");
delay(1000);
break;
default:
motorCW1.writeMicroseconds(1000);
motorCW2.writeMicroseconds(1000);
Serial.println("1000");
break;
}
}
}
Die Regler sind mittels Programmcard konfiguriert, und melden per Musik Bereitschaft. Mit dem oben beschriebenen Code, dreht mal der linke und mal, etwas schneller, der rechte Rotor. So weit, so gut. Wenn ich aber beim 1sten Case "motorCW2" einbinde, rotieren die so schnell, das ich Mühe habe, sie am Boden zu halten. Kann mir jemannd sagen, was ich falsch mache. Demnächst sollen 4 Motore angeschlossen werden.
Gruß Kucky
Zur Vollständigkeit:
Turnigy 2213 1050kv 19A Outrunner 20turn
Hobbyking SS Series 18-20A ESC
Grüße Uwe
Danke Uwe,
hätte ich erwähnen sollen.
Gruß
Willi
Hallo,
ich habe mehrere Multicopter und kann Dir nur den aktuellsten Code von multiwii.com empfehlen.
Gruß Chris
Hallo Chris,
danke für den Tip. Natürlich kenn ich den MuliWii. Ich möchte aber nicht direkt kopieren, sondern auch Grundlagen selber "erlangen". Deshalb die oben gestellt Frage. Ich habe schon Versuche mit einem Accelertor gemacht, und möchte nun diese "Erkenntnisse", mit erst einmal 2 Rotoren in Verbindung bringen, und diese in Balance halten.
Gruß
Willi
Hallo zusammen,
habe es nun endlich hinbekommen, dass 4 Motoren via ESC hoch und runter geregelt werden können. Weis jemand, ob ein ESC "abstürzen", beziehungsweise wiederbelebt werden kann? Ein ESC meldet sich nicht mehr, obwohl ich einige Stunden mit den 4 Motoren experimentiert habe. Auch die Programcard schweigt dazu, will sagen, die Leids leuchten nicht. Wozu dient eigentlich das rote Kabel am Servoausgang? Angeblich muss das nicht angeschlossen werden.
Gruß Kucky
Also, des ESC´s wie die Motore sind alle OK. Einzeln getestet. Kann mir bitte jemand helfen, was an diesen Code falsch ist, um 4 Motore gleichzeitig anzusteuern. Bin echt verzweifelt.
#include <Arduino.h>
#include <Servo.h>
#define PIN_CW1 5
#define PIN_CCW1 6
#define PIN_CW2 10
#define PIN_CCW2 11
#define ARM_TIME 5000
typedef enum {
START_CW1, /// Rotor 1
START_CCW1,
START_CW2,
START_CCW2,
} rotation_t;
Servo rotor_CW1;
Servo rotor_CW2;
Servo rotor_CCW1;
Servo rotor_CCW2;
int rotorSpeed = 0;
int rotorMillis = 0;
rotation_t rotation;
//---------------------------------------------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println("**************************");
Serial.println("* 4 Rotoren Test *");
Serial.print ("* ");Serial.print(__DATE__);Serial.print(" ");Serial.print(__TIME__);Serial.println(" *");
Serial.println("**************************");
rotor_CW1.attach(PIN_CW1);
rotor_CCW1.attach(PIN_CCW1);
rotor_CW2.attach(PIN_CW2);
rotor_CCW2.attach(PIN_CCW2);
arm_esc(ARM_TIME);
}
//---------------------------------------------------------------------------------------------------------------------
void loop()
{
ReadKeybord();
start();
}
//---------------------------------------------------------------------------------------------------------------------
void start()
{
static rotation_t rotation = START_CW1;
switch(rotation)
{
case START_CW1:
rotor_CW1.writeMicroseconds(rotorMillis);
Serial.print("CW1 - MS");Serial.println(rotorMillis);
delay(20);
rotation = START_CCW1;
break;
case START_CCW1:
rotor_CCW1.writeMicroseconds(rotorMillis);
Serial.print("CCW1 - MS");Serial.println(rotorMillis);
delay(20);
rotation = START_CW2;
break;
case START_CW2:
rotor_CW2.writeMicroseconds(rotorMillis);
Serial.print("CW2 - MS");Serial.println(rotorMillis);
delay(20);
rotation = START_CCW2;
break;
case START_CCW2:
rotor_CCW2.writeMicroseconds(rotorMillis);
Serial.print("CCW2 - MS");Serial.println(rotorMillis);
delay(20);
rotation = START_CW1;
break;
}
}
//---------------------------------------------------------------------------------------------------------------------
void arm_esc(int ArmTime)
{
Serial.println("Sending lowest throttle CW1 Rotor 1");
rotor_CW1.writeMicroseconds(1000);
delay(20);
Serial.println("Sending lowest throttle CCW1 Rotor 2");
rotor_CCW1.writeMicroseconds(1000);
delay(20);
Serial.println("Sending lowest throttle CW2 Rotor 3");
rotor_CW2.writeMicroseconds(1000);
delay(20);
Serial.println("Sending lowest throttle CCW2 Rotor 4");
rotor_CCW2.writeMicroseconds(1000);
delay(ArmTime);
Serial.println("Low throttle sent");
}
//---------------------------------------------------------------------------------------------------------------------
void ReadKeybord()
{
int key = 0;
if(Serial.available() > 0)
{
key = Serial.read();
switch(key)
{
case '2':
rotorMillis = mapSpeedToMicrosec(rotorSpeed += 1);
Serial.print(" - Speed steigern - ");Serial.println(rotorSpeed);
break;
case '8':
rotorMillis = mapSpeedToMicrosec(rotorSpeed -= 1);
Serial.print(" - Speed senken - ");Serial.println(rotorSpeed);
break;
case '5':
rotorMillis = mapSpeedToMicrosec(0);
rotorSpeed = 0;
Serial.print(" - Stop - ");Serial.println(rotorSpeed);
break;
}
}
}
//---------------------------------------------------------------------------------------------------------------------
int mapSpeedToMicrosec(int speed)
{
int _MS = 0;
_MS = map(speed, 0, 100, 1000, 2000);
Serial.print(" - setSpeed Millis - ");Serial.println(_MS);
return(_MS);
}
Gruß
Kucky
Bitte Fehlerbeschreibung. Was machen die Motore mit dem Sketch?
Grüße Uwe
Danke für´s Interesse. Die Motoren liefen anfangs alle 4 zusammen. Als ich dann weiter testen wollte, lief ein Motor nicht mehr. Kurz darauf fällt ein 2ter aus. Nicht während des Betriebs, sondern nachdem ich neu gestartet habe. Außer das ich die ESC´s mit Kabelbinder fixiert habe, ist nichts geändert worden. Daraufhin habe ich alle Motore einzeln getestet mit einem eigenen Sketch. Nun liefen wieder 3 Motore (nicht zusammen, sondern einzeln), und der 4te meldete sich nach 3-4 Versuchen (Stromlos schalten, neu flashen) auch wieder.
Ich habe natürlich im Forum recherchiert, und einem Thread 2 Diagramme gefunden, die die Steuerung von 8 Servos beschreiben. Aber vor dem Hintergrund eines RC.
Ich wollte heute mal versuchen, vor den Switch-Befehl eine 22,5ms "Wartezeit" einbauen.
if (currentMillis - Milli >= 25,5)
ungefähr so.
Meinst Du das hat Sinn?
Gruß Kucky
Habe gestern weiter getestet.
3 Motoren laufen gleichzeitig. Wenn ich den 4ten zuschalte (Stromlos, compilieren, flashen, einschalten) laufen nur die 3, später nur 2.
Ich habe es auch mit dem Mega versucht.
Des Versuchsaufbau ist mit einem Duemillenova bestückt.
Es ist doch richtig, dass ich die PWM Pin´s nehmen muss, oder sollte? Ich will ja max. 4 Rotoren regeln.
Gruß Kucky
Nach etlichen Wochen ist das Problem endlich gelöst. Ich wage es kaum zu sagen, aber es waren tatsächlich die Schraubkontakte der Spannungsversorgung. Durch das mehrmalige auf- und abschrauben, hat sich wohl die Löststelle vom Pin getrennt, und ich Esel messe immer an der Lötstelle.
Das andere Problem mit dem "unmotivierten Hochdrehen" der Motoren ist auch gelöst. Hier hatte ich aber eine echtes Verständigungdefizit. Meine ESC werden mit einer Programmcard programmiert. Wenn ich nun anschließend mit der herkömmlichen Methode MaxThrottle - wait - MinThrottle arbeite, heulen die Motoren für die "wait-Zeit" auf. Da ich aber keine RC benutzen möchte, habe ich nun eine eigene kleine Klasse geschrieben, und nun ist alles super. Jetzt kann ich mich endlich mit Accelerator und Gyro beschäfigen.
Gruß
Kucky