Как быстро и без задержки переместить сервопривод?

Я пытаюсь переместить сервопривод из одного места в другое, используя типичный цикл for, который вы найдете в примере библиотеки сервопривода.

int lightON = 180;
int lightOFF = 90;

for (pos1 = lightOFF; pos1 <= lightON; pos1 += 1) {
  servo1.write(pos1);
  delay(15);
}

for (pos1 = lightON; pos1 >= lightOFF; pos1 -= 1) {
  servo1.write(pos1);
  delay(15);
}

Дело в том, что, хотя это работает, я хочу иметь возможность перемещать сервопривод немного быстрее, но я не могу использовать функцию задержки из-за некоторых проблем с подключением к другой библиотеке с именем BLYNK. Как я могу переместить сервопривод из lightOFF в Lightton как можно быстрее без функции задержки? Извините за мою грамматику, я не являюсь носителем английского языка. Спасибо!

, 👍4


2 ответа


6

Самый быстрый путь от LightON к LightOFF - это просто servo1.write (lightOFF); без циклов или задержек, за один раз; нет необходимости делать это постепенно. Например:

int lightON = 180;
int lightOFF = 90;

for (pos1 = lightOFF; pos1 <= lightON; pos1++) {
  servo1.write(pos1);
  delay(15);
}

servo1.write(lightOFF);

Если вы хотите, чтобы он перемещался на несколько градусов в каждом цикле и делал другие вещи в цикле во время движения, вы можете засечь его с помощью millis() вместо delay(). Приведенный ниже код должен перемещать сервопривод на 5 градусов каждые 0,5 с:

int moveTime = 500; // Перемещение каждые 0,5 с
unsigned long int startMillis = 0;
int position = lightOFF;
int step = 5; // Перемещение на 5 градусов

void loop() {
  if (millis() - startMillis >= moveTime) {
    servo1.write(position);
    if (position <= lightON) {
      position = position + step;
    }
    startMillis = millis();
  }
  // Делать другие вещи
}

Непроверенный и неполный, но вы поняли идею.

,

2

Лучший способ - использовать функцию map() .

void loop() {
  unsigned long progress = millis() - startMillis;

  int angle = map(progress, 0, MOVING_PEDIOD, lightOFF , lightON);
  servo1.write(angle);
}

Приведенный выше код использует функцию millis(), поэтому вам не нужно беспокоиться о блокировке другого кода.

Полная инструкция доступна о том, как контролировать скорость серводвигателя

,

Хорошая идея! Он должен быть объединен с constrain(), чтобы избежать превышения (map() неявно 'constrain()`)., @Edgar Bonet