Servo Motor + Fernbedienung

Hallo

ich versuche gerade einen Servo Motor mit FB zu steuern.

Läuft auch halbwegs, aber ich bekomme es nicht hin, das der Motor
nach Start des Arduinos in Mittelstellung geht. Drücke ich 1 oder 2
auf der FB, fährt er ans Ende bzw Anfang.

auf

myservo.writeMicroseconds(1500);

scheint der Motor nicht zu reagieren....

#include <IRremote.h>
#include <Servo.h>

int RECV_PIN = 7; 
IRrecv irrecv(RECV_PIN);
decode_results results;

int pos = 0;
Servo myservo;

void setup()
{

Serial.begin(9600);
pinMode (13, OUTPUT);
irrecv.enableIRIn();

myservo.attach(9);

myservo.writeMicroseconds(1500);
}

void loop(){    

if (irrecv.decode(&results)) {    
int value = results.value;



switch (value){
  case 3810010651 :
  case 16753245 :
    Serial.println("Taste 1");
      for (pos = 550; pos <= 2400; pos += 10) { 
        // in steps of 1 degree
        myservo.writeMicroseconds(pos);
        delay(10);                      
  }
    break;

  case 5316027 :
  case 16736925 :
    Serial.println("Taste 2");
      for (pos = 2400; pos >= 550; pos -= 10) { 
        myservo.writeMicroseconds(pos);             
        delay(10);                       
      }  
    break;
} // switch ende

Serial.println(results.value, DEC); 
delay(1000);

irrecv.resume();
} // if ende
} //loop ende


// Codes
// 1 - 3810010651
// 2 - 5316027

Teste gerade noch, am Ende möchte ich das der Servo nach Start in Mittelstellung geht und
bei druck auf Taste 1 (+100) macht und bei Taste 2 (-100).

Mmh - bei mir macht er das (beim Start auf Mittelstellung). Was natürlich nicht funktioniert, dass er dann beim ersten Drücken auf eine Taste von der Mitte aus losläuft. Da springt er erstmal auf Anfang oder Ende bevor es losgeht.

P.S. bist Du dir sicher, dass dein Servo den gesamten Bereich der vorgegebenen Pulslängen verträgt? Meins kann das jedenfalls nicht.

Wie bekomme ich das raus? Es geht um diesen hier

RC Servo - Digital Servos Wasserdicht - DS3218MG lenkservo hohes Drehmoment 20 kg voller Metallgang 25T Servoarm für RC Modell DIY (Auto Boot Quadrocopter Roboter) Steuerwinkel 270°

https://www.amazon.de/dp/B07R4CPNR3/ref=cm_sw_r_cp_apa_i_YBKNDbPTQBTCS

Das steht bei den Daten meist nicht dabei. Standard ist ja nur 1000...2000µs. Aber die meisten Servos können mehr - mal mehr, mal weniger. Digitale Servos reagieren auf Impulsbreiten ausserhalb ihres Spektrums üblicherweise garnicht. Letztendlich kannst Du das nur ausprobieren, wenn Du sie bis an die Grenzen nutzen willst.

Aber, dennoch muss er doch irgendwie in Mittelstellung zu bekommen sein, nach Start. Die 1500 sollten doch immer passen, oder?
Die For Schleifen läuft er ja auch sauber durch

noxx2:
Die 1500 sollten doch immer passen, oder?

Das stimmt. Wenn ich deinen Sketch auf meine Test-HW spiele funktioniert das ja auch, weshalb ich mich etwas schwer tue eine Ursache zu finden.
Was passiert denn, wenn Du die ganz IR-Steuerung rausnimmst, und die Positionierung auf Mitte machst? Und welchen Arduino nutzt Du überhaupt?

Es passiert nichts, wenn ich nur

myservo.writeMicroseconds(1500);

in den loop einfüge.

Es scheint so, das der Servo nur in der Schleife laufen will, warum auch immer (HILFE)

Mal eine Frage, weiß der Servo beim anschalten wo er sich
aktuell befindet?

Kann ich dann nicht über ebenfalls mit einer Schleife auf Mitte fahren?

(aus dem Bauch raus.. bin gerade unterwegs):

int position = myservo.read();
...

void setup()
{

if position < 1500{
      for (pos = position; pos >= 1500; pos += 10) {
        myservo.writeMicroseconds(pos);            
        delay(10); 
}

if position > 1500{
      for (pos = position; pos >= 1500; pos -= 10) {
        myservo.writeMicroseconds(pos);            
        delay(10); 
}
}

noxx2:
weiß der Servo beim anschalten wo er sich
aktuell befindet?

Das Servo schon, aber die Servolib nicht.

int position = myservo.read();

gibt einfach den Wert der aktuellen Pulsbreite zurück. Allerdings sollte das Servo dann ja auch da stehen, wenn die Impulse ausgegeben werden.

Bist Du denn sicher, dass das Servo nicht schon auf Mitte steht? Eigentlich startet die Servolib bereits mit dem attach Impulse von 1,5ms zu erzeugen. Ein

myservo.writeMicroseconds(1500);

nach dem attach macht also eigentlich garnichts.

Servo steht nicht auf Mitte nach dem Start. Der ist durch den Lauf vorher mit der
Fernbedienung auf Winkel 0° oder 270° (in etwa).

Hast Du die Möglichkeit, das mal mit einem anderen Servo zu testen? Oder den erzeugten Impuls zu messen?

Wie gesagt, die Servolib beginnt bereits mit dem attach Impulse zu erzeugen. Der Standardwert sind da bereits 1,5ms. Dein Servo sollte also bereits mit dem attach-Kommando reagieren. Evtl. kannst Du eine LED mit Vorwiderstand parallel zum Servo an den Ausgang hängen. Dann siehst Du zumindest, ob sich nach dem Start da überhaupt was tut.
Womit versorgst Du das Servo ( Spannungsanschluss )?

ich kann mal einen anderen testen.

der Servo hängt an einem 5V Schaltnetzteil, anbei mal ein Bild

Irgendwie liefert mir der Motor oder Arduino falsche Werte.+

myservo.read() liefert immer einen Wert von 93, egal wo er steht.

ein andere motor lässt sich in mittelstellung bringen, aber nicht diese (270° Servo).
dieser zeigt ebenfalls immer 93 an..

Hi

Wenn Du den Servo auf 120° schickst, wird Dir .read() diese 120 zurück geben - sch*** egal, ob überhaupt ein Servo angeschlossen ist - DAS ist NUR die SOLL-POSITION des Servo, Die zuletzt gesetzt wurde.

Teste Es - reiß das Servo raus und wundere Dich, warum Der IMMER NOCH auf 93 steht.

MfG

Danke. Habs nun nur so hinbekommen. Der 270° Servo lässt sich nach Start nicht anderes
auf die Mitte bekommen (for Schleife in void setup())

#include <Servo.h>

Servo myservo;


int pos = 0;

void setup() {
  Serial.begin(9600);
  myservo.attach(9); 

  for (pos = 500; pos <= 1500; pos += 10) {
    myservo.writeMicroseconds(pos);
    delay(10);
  }
  delay(1000);

  for (pos = 2400; pos >= 1500; pos -= 10) {
    myservo.writeMicroseconds(pos);
    delay(10);
  }
  delay(1000);
}

void loop() {
  
  for (pos = 500; pos <= 2400; pos += 10) { 
    myservo.writeMicroseconds(pos);'
    delay(10);
  }
delay(1000);
  
  for (pos = 2400; pos >= 500; pos -= 10) {
    myservo.writeMicroseconds(pos);
    delay(10);
  }
delay(1000);
}