Сервопривод не перестанет вращаться
У меня есть плата Arduino Uno R3, и после некоторого времени бездействия она, похоже, вышла из строя. Мой код ниже, в основном я хочу поворачивать сервопривод на 90 градусов каждые 12 часов, но как только я подключаю его, сервопривод начинает вращаться без остановок. Пробовали несколько шагов задержки, укорачивание и удлинение записи, но происходит тот же эффект.
#include <Servo.h>
Servo myservo;
void setup {
myservo.attach(10);
}
void loop() {
myservo.write(90);
delay(3600000);
}
@Stedy, 👍9
Обсуждение2 ответа
Лучший ответ:
Я предполагаю, что вы используете непрерывный сервопривод, иначе вы не сможете заставить его повернуться на 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
Это было полезно. У меня было то же самое вращение, когда у меня были сервоприводы на 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; // Это проверяется в контроллере веб-приложения для проверки
}
- Непрерывное управление скоростью сервопривода с помощью контроллера Arduino Uno и сервощита
- Вопрос про Continuous Rotation Servo и Arduino
- Непрерывный сервопривод неправильно устанавливает скорость
- Сервопривод непрерывного вращения не меняет направления
- Серводвигатель HSR-1425R не работает непрерывно
- Серводвигатель с линейным изменением занимает больше времени, чем рассчитано
- Для сервопривода с непрерывным вращением требуется другой код
- Как использовать SPI на Arduino?
Я предполагаю, что это непрерывный сервопривод. В этой ситуации с вашим кодом ожидается то, что вы наблюдаете: сервопривод работает вечно с постоянной скоростью. Если бы это был обычный сервопривод, ваш код тоже не работал бы, так как вы никогда не меняете значение
90
градусов, поэтому сервопривод навсегда останется в этом положении., @jfpoilpretОбратите внимание, что ваш Arduino UNO, вероятно, в любом случае находится в идеальной форме., @jfpoilpret
Не связано с проблемой сервопривода, но я думаю, что ваша задержка составляет 10 часов., @JRobert