Сервопривод не перестанет вращаться

У меня есть плата Arduino Uno R3, и после некоторого времени бездействия она, похоже, вышла из строя. Мой код ниже, в основном я хочу поворачивать сервопривод на 90 градусов каждые 12 часов, но как только я подключаю его, сервопривод начинает вращаться без остановок. Пробовали несколько шагов задержки, укорачивание и удлинение записи, но происходит тот же эффект.

#include <Servo.h>

Servo myservo;

void setup {
  myservo.attach(10);
}

void loop() {
  myservo.write(90); 
  delay(3600000);
}

, 👍9

Обсуждение

Я предполагаю, что это непрерывный сервопривод. В этой ситуации с вашим кодом ожидается то, что вы наблюдаете: сервопривод работает вечно с постоянной скоростью. Если бы это был обычный сервопривод, ваш код тоже не работал бы, так как вы никогда не меняете значение 90 градусов, поэтому сервопривод навсегда останется в этом положении., @jfpoilpret

Обратите внимание, что ваш Arduino UNO, вероятно, в любом случае находится в идеальной форме., @jfpoilpret

Не связано с проблемой сервопривода, но я думаю, что ваша задержка составляет 10 часов., @JRobert


2 ответа


Лучший ответ:

8

Я предполагаю, что вы используете непрерывный сервопривод, иначе вы не сможете заставить его повернуться на 90° более двух раз (у обычного сервопривода переменный угол составляет всего 180°).

Теперь, если вы используете непрерывный сервопривод, вы должны знать, что значение, которое вы передаете myservo.write(), больше не представляет собой угол!

При непрерывном сервоприводе значение, передаваемое в myservo.write(), теперь означает скорость вращения где, но набор допустимых значений такой же, как и для обычного сервопривода, т.е. >[0; 180]:

  • 0 означает максимальную скорость по часовой стрелке
  • 90 означает отсутствие движения
  • 180 означает максимальную скорость против часовой стрелки

Теперь, если вы хотите повернуть сервопривод точно на 90°, вам необходимо знать максимальную скорость сервопривода и, исходя из этого, вычислить время, в течение которого вы должны дать ему повернуться:

// Начинаем вращение по часовой стрелке
myservo.write(0);
// Продолжаем вращаться в течение нужного времени
delay(TURN_TIME);
// Остановить поворот
myservo.write(90);

Проблема здесь заключается в вычислении TURN_TIME. Для этого вы должны проверить техническое описание вашего сервопривода.

На моем собственном сервоприводе Feetech Micro 1.3kg Continuous Rotation Servo FS90R, максимальная скорость:

  • 0,12 с/60° при питании от 4,8 В.
  • 0,10 с/60° при питании от 6 В.

Однако для Arduino UNO подаваемое напряжение должно быть ровно 5 В, а не 4,8 В и не 6 В.

Если мы возьмем линейное приближение, то мы можем применить следующую формулу, чтобы узнать скорость Tс/60°):

T = (0.12 - 0.10) * (V - 4.8) / (4.8 - 6.0) + 0.12

Следовательно, для 5 В мы можем считать само собой разумеющимся, что максимальная скорость должна быть:

T = (0.12 - 0.10) * (5.0 - 4.8) / (4.8 - 6.0) + 0.12 = 0.116667

Поскольку нам нужен угол 90°, это означает, что мы должны запустить сервопривод на максимальной скорости во время:

T' = T * 1.5 = 0.175s

Следовательно, теперь у нас есть следующая программа:

#include <Servo.h>

#define TURN_TIME 175

Servo myservo;

void setup {
    myservo.attach(10);
    // Первоначально сервопривод должен быть остановлен
    myservo.write(90);
}

void loop() {
    // начинаем вращение по часовой стрелке
    myservo.write(0);
    // Продолжаем вращаться в течение нужного времени
    delay(TURN_TIME);
    // Остановить поворот
    myservo.write(90);

    // ждем 12 часов
    delay(12 * 3600 * 1000);
}

Конечно, вам понадобятся некоторые эксперименты, чтобы найти точные правильные значения; вы также можете обнаружить, что сервопривод может быть чувствителен к шуму и даже когда он не должен двигаться (значение = 90), он движется (не быстро, но все же движется).

,

Также обратите внимание: кристалл Arduino не является надежным источником времени. Можно ожидать потери или выигрыша до одной минуты в день, не считая смещения фактического времени, необходимого для выполнения программы. Если вам нужно точное время, купите модуль часов реального времени (RTC) и установите на нем будильник, который затем будет запускать функцию на Arduino каждые 12 часов., @cortices

не знаю почему, но мой непрерывный сервопривод FS90R останавливается с помощью servo.write(95);, @invis


2

Это было полезно. У меня было то же самое вращение, когда у меня были сервоприводы на 90. Что я сделал, чтобы остановить это, так это использовал команду отсоединения. Использование Particle Photon с прикрепленным непрерывным сервоприводом.

bool state = LOW;

Servo servo1;
Servo servo2;// создаем сервообъект для управления сервоприводом
                // можно создать максимум восемь сервообъектов

int pos = 90;    // переменная для хранения положения сервопривода

void setup() 
{ 
  servo1.attach(D0);
  servo2.attach(D1);
  Spark.function("test", testFunction);
  servo1.attach(10);
  servo1.write(90);
  servo2.attach(10);
  servo2.write(90);
} 


void loop() 
{              
    servo2.detach(), servo1.detach();
    delay (25);
    servo2.attach(D0), servo1.attach(D1);
    delay (25);
    servo1.write(0), servo2.write(180);
    delay (1000);
    servo2.write(180), servo1.write(0);
    delay (1000);
    // Я сделал это, чтобы сервопривод не двигался, когда он находится на 90.
    servo2.detach(), servo1.detach(); 
    delay (25);
    servo1.write(90), servo2.write(90);
    delay (1000);
    //конец
    //Вы должны снова прикрепить сервоприводы, чтобы заставить их снова двигаться.
    servo2.attach(D0), servo1.attach(D1);
    delay (25);
    //конец
    servo1.write(180), servo2.write(0);
    delay (1000);
    servo2.write(180), servo1.write(100);
    delay (1000);

}

int testFunction(String args) {

    return 200; // Это проверяется в контроллере веб-приложения для проверки
}
,