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.
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.
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.
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
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.
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.