Wie verwende ich Arduino für die ESC-Steuerung?

9

Ich verwende einen Arduino Uno, um einen Regler für meinen (laufenden) Quadrocopter zu steuern. Ich benutze derzeit die Servobibliothek, um den Regler zu steuern, was großartig funktioniert.

Außer..

Eine Zählung von 100 ist die Höchstgeschwindigkeit, was bedeutet, dass ich nur 10 Geschwindigkeiten zwischen 90 (gestoppt) und 100 (Motor bei voller Leistung) habe, um meinen Quadrocopter korrekt zu betreiben. Ich hätte gerne viel mehr Geschwindigkeitsoptionen. Irgendwelche Ideen? Es fällt mir schwer, ein PWM-Signal zu verwenden, aber ich mache es möglicherweise nicht richtig.

Mein aktueller Code ist hier :

#include <Servo.h>

Servo myservo; // create servo object to control a servo
                // a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()
{
  myservo.attach(8); // attaches the servo on pin 8 to the servo object
}

void loop()
{

 int maxspeed=100;
 int minspeed=0;
 int delaytime=5;
 int count;

 for(count=0; count <1; count+=1) {
  for(pos = minspeed; pos < maxspeed; pos += 1) // goes from 0 degrees to 180 degrees
  { // in steps of 1 degree
    myservo.write(pos); // tell servo to go to position in variable 'pos'
    delay(delaytime); // waits 15ms for the servo to reach the position
  }
  for(pos = maxspeed; pos>=minspeed; pos-=1) // goes from 180 degrees to 0 degrees
  {
    myservo.write(pos); // tell servo to go to position in variable 'pos'
    delay(delaytime); // waits 15ms for the servo to reach the position
  }
  if(count>1){
    break;
  }
 }

 myservo.write(92);
 delay(100000);
 myservo.write(90);
 delay(10000000);
}
Toozinger
quelle

Antworten:

5

Die Funktion servo.write (Winkel) akzeptiert Winkel von 0 bis 180. (Der Wert 180 ist deutlich größer als 100). Können Sie mir sagen, wo in der Servodokumentation " 100 (Motor bei voller Leistung) " steht, damit wir diesen Tippfehler beheben können?

Bitte ändern Sie die Zeile

int maxspeed=100; /* wrong */

zu

int maxspeed=180;

Bitte führen Sie auch servo.refresh()regelmäßig aus, um die Servos auf dem neuesten Stand zu halten - vielleicht so etwas wie:

for(pos = maxspeed; pos>=minspeed; pos-=1) // goes from 180 degrees to 0 degrees
{
    myservo.write(pos); // set the servo position
    myservo.refresh(); // tell servo to go to the set position
    delay(delaytime); // waits 15ms for the servo to reach the position
};
// ...
myservo.write(92);
for( long int delaytime = 0; delaytime < 100000; delaytime+=10 ){
    myservo.refresh(); // tell servo to go to the set position
    delay(10);
};

Wie mpflaga betonte, können Sie mehr Präzision erzielen, indem Sie die Impulsbreite direkt in Mikrosekunden mit einstellen

myservo.writeMicroseconds(1000); // typical servo minimum; some go down to 600 or less
myservo.writeMicroseconds(2000); // typical servo maximum; some go up to 2500 or more

ps: Hast du gesehen, wie "ohne Verzögerung blinkt" ? Diese Technik erleichtert das Ablesen von Sensoren und das Aktualisieren von Servopositionen bei gleichbleibendem Herzschlag-Timing erheblich.

David Cary
quelle
Vielen Dank, ich werde jeden dieser Vorschläge prüfen. Um Ihre Frage zu beantworten: Ich habe in keinem Dokument gelesen, dass die Servozahl 100 die maximale Leistung ist. Ich habe dies herausgefunden, indem ich den Motor getestet habe ( hobbyking.com/hobbyking/store/… ) und festgestellt habe, dass über der Servozahl 100 die Stütze liegt schien sich nicht schneller zu drehen, was mir einen sehr kleinen Arbeitsbereich gab.
Toozinger
Wenn dies der Fall ist, können Sie entweder nicht genügend Strom liefern (C-Wert prüfen) oder Ihre Propeller sind zu groß (zu viel Motorlast), oder Ihr Esc kann nicht genügend Strom liefern (in diesem Fall möglicherweise) erhitzt werden). Bitte überprüfen Sie alle oben genannten Möglichkeiten.
Hazkaz
4

Ihr Code verwendet das typische Verfahren, servo.attach(pin)bei dem Sie die Überlast von verwenden können servo.attach(pin, min, max), um die minimalen und maximalen Mikrosekunden der Impulsbreite so einzustellen, dass sie den gewünschten Bereichen für Ihren Regler entsprechen. Um noch deutlicher zu machen, wo myservo.write(90);der Winkel eingestellt wird, können Sie myservo.writeMicroseconds(1500);die Dauer des Impulses direkt in Mikrosekunden einstellen.

mpflaga
quelle