Bitte um Hilfe: Servo über PushButton schalten

Hallo,

ich möchte einen Servo über einen PushButton schalten.
Der Servo dreht in meinem Winkel von 110 Grad.
Wenn der Servo seine Endposition erreicht hat, soll der PWM Pin abgeschaltet werden ( "Energiesparen" ) und erst wieder eingeschaltet werden, wenn der Button erneut gedrückt wird und den Servo in die entgegengesetzte Richtung bewegen.

Funktioniert mit deisem Code bisher:

#include <Servo.h>

const int servoPin = 5;
const int buttonPin = 4;
const int powerPin = 6;

int buttonState = 0;
int directionState = 0;
int pos = 0;

Servo myservo;

void setup() {
  myservo.attach(5);
  pinMode(buttonPin, INPUT);
  pinMode(powerPin, OUTPUT);
  digitalWrite(powerPin, HIGH);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  analogWrite(servoPin, 0);

  if (directionState == 1) {
    analogWrite(servoPin, 255);

    if (buttonState == HIGH) {

      directionState = 0;

      for (pos = myservo.read(); pos <= 110; pos = pos + 4)
      {
        myservo.write(pos);
        delay(15);
      }
    }

  } else if (directionState == 0) {
    analogWrite(servoPin, 255);

    if (buttonState == HIGH) {

      directionState = 1;

      for (pos = myservo.read(); pos >= 0; pos = pos - 4)
      {
        myservo.write(pos);
        delay(15);
      }
    }
  }
}

Was ich noch nicht hinbekommen habe ist, dass der Servo beim Einschalten der Betriebsspannung immer in einer default Position "startet/steht", egal welchen Zustand/Winkel er nach abschalten der Betriebsspannung hatte.

Vielleicht könnte mir einer von euch helfen!?

Vielen Dank
Sven

Du nutzt die Servo-Bibliothek und schreibst trotzdem PWM-Werte auf den Servo-Pin? Äußerst konfus...
Mach dich doch erst einmal grundlegend mit den Funktionen der Servo-_library vertraut: Servo - Arduino Reference
Einen vordefinierten Servowinkel bekommst du, wenn du bereits in der setup-Routine ein myservo.write(0); schreibst.

Du bringst das was durcheinander:

nämlich Servo.h und analogWrite().

Das Eine hat nichts mit dem Anderen zu tun.

analogWrite() erzeugt einfach nur eine PWM mit 490Hz oder 980Hz (je nach Pin).

ein Servo braucht aber eine andere Ansteuerung:

Alle 20ms einen Puls.
die Länge des Pulses beschreibt die Servostellung: (die Wert sind nur ungefähr und können von Servo zu Servo variieren)
1000µs die eine Endstellung,
1500µs Pulsdauer ist die Mittelstellung,
2000µs die andere Endstellung.

Das macht nun die Servo.h
(nimm am besten eines der mitgelieferten Beispiele, z.B. sweep)

um ein Servo "anzuschalten" dient der Befehl myservo.attach(), um es wieder abzuschalten myservo.detach().
Den Winkel stellst du ein mit myservo.write().

letztlich wirst du aber erst herausfinden müssen, wie dein Servo reagiert, wenn du keine Pulse mehr sendest.

Danke für die Hilfe Gunther.

VG
Sven

Habe es so abgeändert und hoffe, das ist so richtig?

#include <Servo.h> 
  
Servo myservo;
const int buttonPin = 4;
const int powerPin = 6;
int buttonState = 0;
int directionState = 0;  
int pos = 0;
  
void setup() 
{ 
  pinMode(buttonPin, INPUT);
  pinMode(powerPin, OUTPUT);
  digitalWrite(powerPin, HIGH); 
} 
  
  
void loop() 
{ 
  myservo.detach(); 
  buttonState = digitalRead(buttonPin);

  if (directionState == 1) {
    myservo.attach(10);

    if (buttonState == HIGH) {

      directionState = 0;

      for (pos = myservo.read(); pos <= 110; pos = pos + 4)
      {
        myservo.write(pos);
        delay(15);
      }
    }

  }  else if (directionState == 0) {
    myservo.attach(10);
    
    if (buttonState == HIGH) {

      directionState = 1;

      for (pos = myservo.read(); pos >= 0; pos = pos - 4)
      {
        myservo.write(pos);
        delay(15);
      }
    }
  }
}

Was mir noch fehlt, ist die Default Stellung des Servo bei Spannung An/Aus!?

Danke
Sven

Die Ansteuerung des Servos verbraucht wirklich keinen Strom. Da verbrauchen Servo un Arduino viel, viel mehr.
Das ausschalten des Ansteuerungssignals ist keien gute Idee. Der Servo wird nicht in der aktuellen Stellung stehen bleiben und beim "einschlten" unkontrolliert bewegen.
Grüße Uwe

supersonix:
Was mir noch fehlt, ist die Default Stellung des Servo bei Spannung An/Aus!?

Meinst du Spannung AN beim Arduino?
da hilft:

sth77:
Einen vordefinierten Servowinkel bekommst du, wenn du bereits in der setup-Routine ein myservo.write(0); schreibst.

Oder meinst du Spannung an am Servo?
Das kannst du nur durch ein anderes Servo lösen. Probier doch mal ein digitales.

@Gunther,

ich meine, wenn der Arduino spannungslos geschaltet wird.
Das ganze wird in einem mobilen Gerät eingesetzt und da wird das NT an und ab gesteckt.
Ich benutze digitale Servos.

@Uwe,

ich will das Ansteuersignal abschalten, da die digital Servos "kreischen/rattern/quitschen" und das stört in der Anwendung.
Durch das Abschalten des Signals, is Ruhe.

Vielen Dank
Sven

supersonix:
ich meine, wenn der Arduino spannungslos geschaltet wird.
Das ganze wird in einem mobilen Gerät eingesetzt und da wird das NT an und ab gesteckt.
Ich benutze digitale Servos.

Meine Servos machen einfach nichts, wenn die Versorgungsspannung anliegt, aber kein Steuersignal.
Wenn du also den Arduino abschaltest, und vorher das Signal aus war, dann sollte das Servo einfach stehen bleiben.

Das Problem wird sein, was das Servo macht, wenn du die Spannung an oder aus schaltest. Darauf hat der Arduino keinen Einfluss.