Когда я включаю сервопривод, он вращается сам по себе, прежде чем перейти в нужное положение и начать скетч.

Я не могу понять это: когда я включаю сервопривод, он просто вращается сам по себе, как будто он настраивается , он поворачивается под углом, превышающим тот, который я хочу. (Не возражайте, если его нужно настроить, но он не может вращаться более чем на 20 градусов, что и происходит в настоящее время).

#include <Servo.h>

Servo myservo;  // создаем сервообъект для управления сервоприводом
// на большинстве плат можно создать двенадцать сервообъектов
int pos = 0;    // переменная для хранения положения сервопривода

int degrees_of_motion = 20;
int servo_speed = 88;

void setup() {
  myservo.attach(3);  // прикрепляем сервопривод к контакту 3 к объекту сервопривода
  myservo.write(0);
}

void loop() {
  for (pos = 0; pos <= degrees_of_motion; pos += 1) { // переходит от 0 градусов к 180 градусам
    // с шагом в 1 градус
    myservo.write(pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(servo_speed); // ждем 15 мс, пока сервопривод не достигнет позиции
  }
  for (pos = degrees_of_motion; pos >= 0; pos -= 1) {
    // изменяется от 180 градусов до 0 градусов
    myservo.write(pos); // сообщаем сервоприводу перейти в позицию в переменной 'pos'
    delay(servo_speed);// ждем 15 мс пока сервопривод достигнет позиции
  }
}

, 👍1

Обсуждение

Хм, все методы в объекте myservo доступны после его создания. Поэтому попробуйте выполнить инициализацию перед подключением сервопривода (поменяйте местами строки в методе setup()). Также будьте осторожны, чтобы не записать отрицательное число в сервопривод. Я не думаю, что ты это делаешь. Но просто имейте это в виду, так как водитель может интерпретировать это как действительно большое число., @st2000

st2000 Вы имеете в виду замену myservo.attach(3); myservo.write(0). Это не имеет значения, также пытался ввести int после настройки void. Это то, что вы имели в виду?, @Francesco Gentili

Что произойдет, если вы удалите код позиционирования в функции loop(), чтобы setup() выполняла присоединение с последующим позиционированием сервопривода на 0 градусов? Кроме того, что, если вместо циклов for в функции loop() у вас вместо этого есть глобальная переменная для позиции, которую вы устанавливаете на ноль градусов в функции setup(), а затем имеете логику в loop() функция просто увеличивается или уменьшается на 1 каждый раз, когда вызывается loop()`?, @Richard Chambers

Если я удалю функцию loop(), чтобы setup() выполняла присоединение с последующим позиционированием сервопривода на 0 градусов: каждый раз, когда я включаю его, он будет очень быстро вращаться под неопределенным углом, возвращаться к 0 и останавливаться. Также глобальная переменная. Я действительно новичок в Arduino, не совсем понимаю, что вы имеете в виду. Большое спасибо, @Francesco Gentili

заголовок вопроса подразумевает, что двигатель движется **до** запуска скетча. это что происходит?, @jsotola

Начните с простого. Просто включите сервопривод, не подключая линию управления ни к чему. Большинство, если не все нормальные сервоприводы, не должны ничего делать. Возможно, этот сервопривод сломан или ведет себя непредвиденным образом. Возможно, процессор был поврежден. Вы можете попробовать другой Arduino Uno или, по крайней мере, другой порт PWM на том же Arduino Uno. Кроме того, вы можете попробовать другую библиотеку сервоприводов или написать свою собственную., @st2000

jsotola Если я загружу на сервопривод пустой скетч и включу его, ничего не произойдет., @Francesco Gentili

Также пробовал новую ардуино, @Francesco Gentili

Шум на контрольной линии может вызвать случайное движение, попробуйте добавить на контрольную линию выпадающее меню; Если этого не происходит с пустым скетчем, то это очень странно., @esoterik


1 ответ


1

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

#include <Servo.h>

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

int pos = 0;   // переменная для хранения положения сервопривода
int direc = 1; // направление и количество итераций позиции, + к увеличению, - к уменьшению

int degrees_of_motion = 20;
int servo_speed = 88;

void setup() {
  myservo.attach(3);  // прикрепляем сервопривод к контакту 3 к объекту сервопривода
  pos = 0;            // начинаем с нуля градусов.
  direc = 1;          // начинаем увеличивать угол на 1
}

void loop() {
  if (direc > 0 && pos > degrees_of_motion) {
    direc *= -1;       // меняем направление итерации, сохраняем сумму
    pos = degrees_of_motion;
  }
  if (direc < 0 && pos < - degrees_of_motion) {
    direc *= -1;       // меняем направление итерации, сохраняем сумму
    pos = - degrees_of_motion;
  }

  myservo.write(pos);    // сообщаем сервоприводу перейти в позицию в переменной 'pos'
  pos += direc;          // увеличиваем/уменьшаем позицию
  delay(servo_speed);    // ждем 15 мс, пока сервопривод не достигнет позиции
}
,

Спасибо, но с этим скетчем разницы нет, @Francesco Gentili