Почему сервопривод не перемещается по углам должным образом

Я должен сделать проект, который использует сервопривод для привода поворотного стола. Сколько бы я ни регулировал угол наклона, сервопривод, казалось, смещался каждый раз, когда вращался. Например, угол 0 градусов становился немного больше. Я думаю, что это вызвано неточным управлением ШИМ Arduino или плохим переводом с использованием, я думаю, функции map ().

How a servo works

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

Кстати, мой код таков:

#include 

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

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

#define pos0 0
#define pos1 23
#define pos2 48
#define pos3 164

void setup() {
  myservo.attach(9);  // прикрепляет сервопривод на выводе 9 к объекту сервопривода
  Serial.begin(9600);
}

void loop() {
  for (pos = pos0; pos  pos0; pos -= 1) {
    myservo.write(pos);
    delay(30);
  }
  Serial.print("pos: ");
  Serial.println(pos);
  delay(5000);
}

Edit: Должен ли я попробовать с более мощным Arduino, таким как Mega, который, я думаю, будет идеальным вариантом с большим количеством GPIO, чем UNO.

, 👍1


4 ответа


0

Не все сервоприводы идеально построены. Можно избавиться от самой библиотеки; есть способ сделать поворот сервопривода, вручную выписав код.

for(x=0; x<150; x=x+1)
{
  digitalWrite(Servomotor, HIGH);
  delayMicroseconds(1500);          //Отредактируйте эту задержку, чтобы настроить положение
  digitalWrite(Servomotor, LOW);
  delayMicroseconds(18550);         //Не трогайте эту задержку
}

Опробовав различные задержки для первых delayMicroseconds(), вы можете проверить, какая задержка вам нужна для какой позиции.

Чтобы сделать ваш код более чистым, вы можете использовать разные углы в другой функции void, а когда они вам понадобятся, просто введите имя

Хорошего дня ;)

,

IIRC сервобиблиотека использует таймеры для генерации импульсов, так что вы все еще можете делать другие вещи, используя сервопривод; с вашим методом вам придется в конечном итоге заново реализовать сервобиблиотеку самостоятельно., @esoterik


1

Попробуйте использовать функцию myservo.writeMicroseconds(x). Для стандартных сервоприводов значение параметра x находится в диапазоне от 1000 до 2000 для вращения от 0 до 180 градусов. Но вы же знаете, что не все сервоприводы сделаны идеально. Вот почему сервоприводы могут реагировать от 700 до 2300. Сначала вы должны проверить минимальное и максимальное значения ответа, а затем использовать его. Вы можете использовать map() для удобства кодирования.

,

1

Каждый сервопривод индивидуален, они могут иметь различные спецификации:

  • Угловая скорость
  • Диапазон вращения
  • Момент торможения
  • Размер
  • Материал шестерни/качество

Сервоприводы будут варьироваться в зависимости от марки; кроме того, каждый сервопривод будет иметь некоторые индивидуальные различия. Поэтому нужно охарактеризовать сервопривод и выяснить, каковы правильные управляющие значения. Как только управляющие значения установлены, они используются для инициализации библиотеки, чтобы угловое управление было точным.

Например, угол 0 градусов становился немного больше

Я обнаружил, что ошибки в повторяемости, подобные этой, обычно обнаруживаются в механизме, приводимом в движение сервоприводом, особенно в соединении между сервоприводом и ведомыми механизмами. Проверьте соединение на наличие помоев, посмотрите, все ли затянуто правильно.

Я заметил, что каждый сервопривод (который я пробовал) создает жужжащий шум для углов больше 170 градусов.

Типичный максимальный диапазон вращения сервопривода составляет 160-190 градусов. Шум, который вы слышите, - это сервопривод, пытающийся привести двигатель в движение, чтобы установить угол наклона, но он заглох, так как не может повернуться так далеко.

Должен ли я попробовать использовать более мощный Arduino, такой как Mega, который, я думаю, будет идеальным вариантом с большим количеством GPIO, чем UNO.

IIRC библиотека сервоприводов может управлять 12 сервоприводами с базовым Arduino и 48 с MEGA. Эта разница больше, чем просто количество контактов, MEGA имеет 4-кратные аппаратные таймеры 328p; 12 x 4 = 48

Если вам нужно больше функций, вы можете перейти к MEGA, т. Е. Вам нужно больше ШИМ-каналов, а библиотека сервоприводов уменьшает ШИМ - контакты с 6 до 4 на 328p. Другим примером может быть необходимость в большем количестве таймеров.

Прочитайте примеры сервоприводов Arduino для получения дополнительной информации об использовании библиотеки сервоприводов и управлении сервоприводами и т.д.

,

0

Недорогой сервотестер, например....

https://www.amazon.com/DIYmall-Digital-Consistency-Controler-Checker/dp/B012LZKTDO/ref=sr_1_12?crid=3BLBBVDUPTN53&amp;keywords=servo+tester&amp;qid=1644245707&amp;sprefix=servo+tester%2Caps%2C93&amp;sr=8-12

...полезен для быстрого и легкого определения точных механических пределов конкретного сервопривода. Если сервопривод физически перемещается только на 170 градусов, а подключенный механизм требует 180 градусов, необходим другой сервопривод.

Должна быть возможность использовать осциллограф, подключенный к сервоприводу, чтобы определить а) каков рабочий цикл выхода тестера в определенных угловых положениях и б) каков фактический рабочий цикл выхода Arduino при запуске программы.

Используйте сервотестер, чтобы убедиться, что диапазон движения вашего сервопривода достаточен для правильной работы механизма.

Обратите внимание на выход тестера в нужных положениях.

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

,