Servo stört LED-Blinken

Hallo liebe Community. Ich bin noch recht neu hier und noch nicht so erfahren mit der Programmierung (Arduino). Meistens verwende ich Sketches hier aus dem Forum und lerne so durch verändern und probieren.
Nun das Problem: Im folgenden Sketch sollen 2 LEDs abwechselnd blinken, eine rote und eine grüne. An einem Taster hängt ein Servo, der auf Tastendruck seine Bewegung ausführt. Beide Teile des Sketches (LED und Servo) funktionieren einzeln tadellos, nur zusammen eben nicht. Auslöser scheint die Zeile "servo.attach(3);" im Setup zu sein, die die rote LED dann außer Betrieb setzt oder stört, die grüne funktioniert weiterhin. Ich verstehe es einfach nicht... :sweat_smile: Kann mir da jemand weiterhelfen?

#include <Servo.h>                              // Servo Bibliothek

const byte LED_1 = 10;                          // rot-grün abwechselnd mit Dimmung
const byte LED_2 = 11;

int helligkeit = 1;
int increment = 1;
byte zyklus = 0;

unsigned long updateIntervall = 1;
unsigned long lastUpdate = 0;

int servo_pin = 3;
const int BUTTON = A5;                      // Pushbutton auf Board
int val = 0;                                // speichert Zustand des Tasters
int old_val = 0;                            // speichert den vorherigen wert von val
int state = 0;                              // 0 = Servo Position eins, 1 = Servo Position zwei
Servo servo;                                // Servo-Objekt zur Steuerung des Servos

long servo_movetime = 0;                    // Zeit in Millis Servo nächster Schritt
int servo_zPos = 0;                         // Zielposition
int servo_aPos = 0;                         // aktuelle postion servo

int pos1 = 0;                               // Variable zum Speichern der Servoposition Servo
int aPos1;                                  // aktuelle position
int zPos1;                                  // Zielposition

int tDelay1 = 40;                            // Verzögerung zwischen den Bewegungen


void setup()
{
  Serial.begin(9600);                         // Startet die serielle Ausgabe (optional)

  pinMode(LED_1, OUTPUT);                     //rot abwechelnd
  pinMode(LED_2, OUTPUT);                     // mit grün


  pinMode(BUTTON, INPUT_PULLUP);              //Button ist ein Input
  servo.attach(3);                            //Steuerkabel des Servo
  servo.write(0);                             //Grundstellung des Servo bei Start

}

void loop() {

  // ROT GRÜN abwechselnd mit Dimmung //
  unsigned long currentMillis = millis();
  if (currentMillis - lastUpdate >= updateIntervall) {
    lastUpdate = millis();
    helligkeit = helligkeit + increment;
    analogWrite(zyklus % 2 ? LED_2 : LED_1, helligkeit);
    if (helligkeit >= 200) {
      increment = -increment;
    } else if (helligkeit == 0) {
      increment = -increment;
      zyklus++;
    }
  }
  // ENDE Rot grün -------------------------------//

  // SERVO und LASER //
  val = digitalRead(BUTTON);                        // liest den Input aus und prüft ob gedrückt
  if ((val == LOW) && (old_val == HIGH)) {
    state = 1 - state;
  }

  old_val = val;                                    // aktueller val wird zu val alt

  if (state == 1)
    aPos1 = servo.read();
  if (aPos1 == 0) zPos1 = 90;
  if (aPos1 == 90) zPos1 = 0;
  if (aPos1 != zPos1 && millis() >= servo_movetime) {
    moveServo();
  }
}
void moveServo() {
  if (aPos1 < zPos1) servo.write(aPos1 + 1);
  if (aPos1 > zPos1) servo.write(aPos1 - 1);
  servo_movetime = millis() + tDelay1;
}
// ENDE Servo und Laser ------------------- //

servo benötigt einen Timer, damit sind die 2 zugehörigen PWM Kanäle für dich verloren.

Abhilfe: Nimm andere

PS:
PWM Pins brauchen kein pinMode, bzw, analogWrite macht das intern.

1 Like

Vielen Dank. :wink:
Die Zeile "analogWrite(zyklus % 2 ? LED_2 : LED_1, helligkeit);" ist also der Auslöser?
Ich habe mich ja extra für diese Variante entschieden, um delays zu vermeiden. Wieso klappt es aber, wenn die attach-Anweisung deaktiviert ist? Nehme ich andere Pins für die LEDs, dimmen diese nicht mehr an und aus.
Wenigstens dein PS: hab ich verstanden. Das leuchtet mir ein.

Welches Arduino-Model verwendest Du?

Die Servo- Bibliothek brauct einen Timer und darum funktioniert analogWrite() (PWM) an 2 Pins nicht. Nimm andere Pins für analogWrite()

"The Servo library supports up to 12 motors on most Arduino boards and 48 on the Arduino Mega. On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins. On the Mega, up to 12 servos can be used without interfering with PWM functionality; use of 12 to 23 motors will disable PWM on pins 11 and 12." Servo - Arduino Reference

Grüße Uwe

Danke, das war die Lösung :smiley:
Ich hab hier einen Arduino Uno und wusste nicht, dass die Servo library zwei PWM Pins stilllegt. Und ich hatte noch den Denkfehler, dass der Servo wegen der Verlangsamung auch an einem PWM Pin hängen muss. Stimmt in dem Fall aber nicht.

Indirekt.

Der Weg in die Hölle ist mit falschen Annahmen gepflastert.
Manchmal/Meistens bietet die jeweilige Doku den Schlüssel zum Wissen und zum Erfolg.

Oder einfacher gesagt, wer lesen kann (und will), ist klar im Vorteil. :sweat_smile:
Nochmals herzlichen Dank für eure schnelle Hilfe.

Man muß halt wissen wo lesen.
Grüße Uwe

Einfach jemanden fragen, der es weiß. :wink:

Darum sind wir ja da.
Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.