SS Series 18-20A mit Arduino ansteuern

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. http://arduino.cc/en/Reference/Servo

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