Как быстро и без задержки переместить сервопривод?
Я пытаюсь переместить сервопривод из одного места в другое, используя типичный цикл 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 как можно быстрее без функции задержки? Извините за мою грамматику, я не являюсь носителем английского языка. Спасибо!
@Marcelo_M, 👍4
2 ответа
Самый быстрый путь от 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();
}
// Делать другие вещи
}
Непроверенный и неполный, но вы поняли идею.
Лучший способ - использовать функцию map() .
void loop() {
unsigned long progress = millis() - startMillis;
int angle = map(progress, 0, MOVING_PEDIOD, lightOFF , lightON);
servo1.write(angle);
}
Приведенный выше код использует функцию millis(), поэтому вам не нужно беспокоиться о блокировке другого кода.
Полная инструкция доступна о том, как контролировать скорость серводвигателя
- Как перемещать сервопривод с помощью функции
- Как добавить задержку, закрыть сервопривод и снова перейти к началу?
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Когда я включаю сервопривод, он вращается сам по себе, прежде чем перейти в нужное положение и начать скетч.
- Как закодировать светодиодные поворотники на умной машине
- Код, из-за которого серводвигатель не работает!
- Рефакторинг плохого дизайна?
- Термопара и мультиметр
Хорошая идея! Он должен быть объединен с
constrain()
, чтобы избежать превышения (map()
неявно 'constrain()`)., @Edgar Bonet