Почему сервопривод не перемещается по углам должным образом
Я должен сделать проект, который использует сервопривод для привода поворотного стола.
Сколько бы я ни регулировал угол наклона, сервопривод, казалось, смещался каждый раз, когда вращался. Например, угол 0 градусов становился немного больше. Я думаю, что это вызвано неточным управлением ШИМ Arduino или плохим переводом с использованием, я думаю, функции map ()
.
Не могли бы вы исправить эту проблему в коде, иначе сервопривод не работает должным образом? Я заметил, что каждый сервопривод (который я пробовал) создает жужжащий шум для углов больше 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.
4 ответа
Не все сервоприводы идеально построены. Можно избавиться от самой библиотеки; есть способ сделать поворот сервопривода, вручную выписав код.
for(x=0; x<150; x=x+1)
{
digitalWrite(Servomotor, HIGH);
delayMicroseconds(1500); //Отредактируйте эту задержку, чтобы настроить положение
digitalWrite(Servomotor, LOW);
delayMicroseconds(18550); //Не трогайте эту задержку
}
Опробовав различные задержки для первых delayMicroseconds()
, вы можете проверить, какая задержка вам нужна для какой позиции.
Чтобы сделать ваш код более чистым, вы можете использовать разные углы в другой функции void, а когда они вам понадобятся, просто введите имя
Хорошего дня ;)
Попробуйте использовать функцию myservo.writeMicroseconds(x)
. Для стандартных сервоприводов значение параметра x находится в диапазоне от 1000 до 2000 для вращения от 0 до 180 градусов. Но вы же знаете, что не все сервоприводы сделаны идеально. Вот почему сервоприводы могут реагировать от 700 до 2300. Сначала вы должны проверить минимальное и максимальное значения ответа, а затем использовать его. Вы можете использовать map()
для удобства кодирования.
Каждый сервопривод индивидуален, они могут иметь различные спецификации:
- Угловая скорость
- Диапазон вращения
- Момент торможения
- Размер
- Материал шестерни/качество
Сервоприводы будут варьироваться в зависимости от марки; кроме того, каждый сервопривод будет иметь некоторые индивидуальные различия. Поэтому нужно охарактеризовать сервопривод и выяснить, каковы правильные управляющие значения. Как только управляющие значения установлены, они используются для инициализации библиотеки, чтобы угловое управление было точным.
Например, угол 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 для получения дополнительной информации об использовании библиотеки сервоприводов и управлении сервоприводами и т.д.
Недорогой сервотестер, например....
https://www.amazon.com/DIYmall-Digital-Consistency-Controler-Checker/dp/B012LZKTDO/ref=sr_1_12?crid=3BLBBVDUPTN53&keywords=servo+tester&qid=1644245707&sprefix=servo+tester%2Caps%2C93&sr=8-12
...полезен для быстрого и легкого определения точных механических пределов конкретного сервопривода. Если сервопривод физически перемещается только на 170 градусов, а подключенный механизм требует 180 градусов, необходим другой сервопривод.
Должна быть возможность использовать осциллограф, подключенный к сервоприводу, чтобы определить а) каков рабочий цикл выхода тестера в определенных угловых положениях и б) каков фактический рабочий цикл выхода Arduino при запуске программы.
Используйте сервотестер, чтобы убедиться, что диапазон движения вашего сервопривода достаточен для правильной работы механизма.
Обратите внимание на выход тестера в нужных положениях.
Настройте свою программу таким образом, чтобы она создавала рабочие циклы, необходимые для репликации выходных данных тестера в нужных положениях.
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
- Микро сервопривод не работает с Arduino UNO
- поворот позиционного серводвигателя более чем на 180 градусов
- Почему loop() останавливается?
- 6 + 1 двигательей подключенных к arduino uno?
IIRC сервобиблиотека использует таймеры для генерации импульсов, так что вы все еще можете делать другие вещи, используя сервопривод; с вашим методом вам придется в конечном итоге заново реализовать сервобиблиотеку самостоятельно., @esoterik