Очень просто, я управляю сервоприводами (9g Micro Servos) на основе данных, считанных из других источников. Все работает отлично, за исключением того, что сервоприводы будут постоянно «трястись». То есть они вибрируют назад очень тонкими движениями (с прерывистыми движениями 1/2 -> 1 см или около того).
Я попытался исправить эту проблему в программном обеспечении, сделав что-то вроде:
do{
delay(DTIME);
positionServo();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("X position: ");
lcd.print(xRead);
lcd.setCursor(0,1);
lcd.print("Y position: ");
lcd.print(yRead);
}while( readChange() ); //while there has been change
Там, где необходимо выполнить инициализацию, инициализируйте переменные, в которых хранится отображенное значение серво (используя библиотеку серво arduino).
Функция readChange () определяется как:
int readChange(){
int x_Temp, y_Temp;
x_Temp = map(analogRead(x_axisReadPin), 0, 1023, 0, 179);
y_Temp = map(analogRead(y_axisReadPin), 0, 1023, 0, 179);
if( abs(x_Temp - xRead) < DEG && abs(y_Temp - yRead) < DEG ) return 0; // no change
else return 1; //change
}
Где xRead - это значение, которое было инициализировано (первый, отображенный серво выход).
Хотя, это действительно не очень хороший подход. Это требует, чтобы ОБА значения не должны были изменяться с коэффициентом DEG (~ 10 градусов, или ~ 0,28 В в моем случае). Если я напишу функцию так, чтобы либо ИЛИ было меньше, чем DEG, то что, если я менял только один сервопривод за раз? Так что есть делимма ..
Это просто свойство сервоприводов (возможно, дешевых?) Или есть обходной путь?
Было бы намного проще включить ссылку на ссылку. Вот полный код: http://pastie.org/8191459
Я прикрепил два сервопривода вместе с лазерной указкой, чтобы обеспечить две степени свободы (X, Y). Существуют опции, основанные на состоянии нескольких кнопок, для управления сервоприводами различными способами. Первый - «Движение», где у меня есть два фоторезистора, которые, в зависимости от степени освещенности, влияют на положение сервоприводов. Я еще не реализовал код для управления сервоприводами с помощью контроллера Xbox. И третий вариант - просто случайное движение.
Ответы:
При использовании библиотеки сервоприводов на Arduino, общий источник сервосигнала состоит в том, что сервоприводы, управляемые прерываниями, на самом деле не дают очень стабильный выходной импульс. Поскольку AVR принимает прерывания для обслуживания часов millis () и других вещей во время выполнения Arduino, джиттер в библиотеке Servo составляет порядка нескольких микросекунд, что приводит к большому движению в сервоприводе.
Исправление для этого состоит в том, чтобы написать свой собственный пульс. Что-то вроде этого:
Это отключит другие прерывания и создаст намного более чистый импульс ШИМ. Однако, это заставит таймер millis () пропустить некоторые такты. (Функция «micros ()» может называться как-то иначе - я точно забыл, что.)
В общем, для критически важного по времени кода вы хотите полностью избавиться от среды исполнения Arduino и написать свою собственную, используя компилятор avr-gcc и библиотеку avr-libc, которая поддерживает среду Arduino. Затем вы можете установить таймер на отметку 4 раза в микросекунду или даже 16 раз в микросекунду и получить намного лучшее разрешение в вашем ШИМ.
Другой причиной шума в сервоприводах являются дешевые сервоприводы с дешевыми датчиками, где датчики шумят или когда точное положение, запрошенное с помощью импульса, не может быть фактически закодировано датчиком. Сервопривод увидит «переместиться в положение 1822» и попытается это сделать, но в итоге получит показание датчика 1823. Затем сервопривод скажет «немного сдвинуться назад», и в итоге получится показание датчика 1821. Повторите! Исправление для этого заключается в использовании высококачественных сервоприводов. В идеале это не хобби-серво, а настоящие сервоприводы с оптическими или магнитными абсолютными энкодерами.
Наконец, если сервоприводы не получают достаточно энергии, или если вы пытаетесь управлять их питанием от шины 5 В на Arduino, это вызовет гудение напряжения в сервоприводах, как предложено выше. Возможно, вам удастся исправить это с помощью больших электролитических конденсаторов (которые в любом случае являются хорошей идеей для общей фильтрации), но вы, скорее всего, захотите убедиться, что ваш источник питания сервопривода может фактически подавать несколько ампер тока при напряжении сервопривода.
источник
Это называется "кайф".
Есть несколько вещей, которые будут вызывать это. Нестабильность во власти сервопривода является частой причиной. R / C сервоприводы могут нарисовать БОЛЬШИЕ шипы, когда они впервые приводят двигатель в движение.
Много лет назад я играл с сервоприводом Tower Hobbies Royal Titan Standard, управляя им с 555 и однотранзисторным инвертором. Смертельно-простая схема управления. Я узнал, что серводвигатель потреблял 250 мА от источника 5 В в режиме непрерывного движения. Гудение, это легко потянуло шипы на полампер. (Может быть, больше: я просто следил за измерителем тока на моем рабочем столе, а не определял токовый шунт.)
Потребовалось 220 мкФ прямо через мой сервопривод, чтобы приручить его.
Попробуйте установить электролитический конденсатор, по крайней мере, 100 мкФ, непосредственно через источник питания к сервоприводу, как можно ближе к сервоприводу, и посмотрите, поможет ли это.
Основываясь на этих экспериментах, я бы никогда не подумал об использовании R / C сервоприводов для НИЧЕГО без добавления конденсаторов. Это включает в себя радиоуправляемые модели.
Это также может быть вызвано грязью в сервоприводе внутри сервопривода. Попробуйте конденсатор первым.
источник
Происходит ли ваше жужжание / тряска только в пределах или вблизи пределов сервопривода (0 градусов или 180 градусов)? Если это так, то может быть простое решение для вас. Я обнаружил, что дешевые сервоприводы не знают, как очень хорошо держаться на пределе своего движения, что может вызвать жужжание / тряску, о которых вы говорите. Однако, если вы просто ограничите их диапазон до 10 ~ 170 градусов, проблема будет исправлена.
Если это не достаточно хорошо для вас, вы можете выполнить более сложные исправления, упомянутые в других ответах, такие как улучшенная мощность, улучшенные серводатчики и т. Д.
источник
Я исправил свою проблему, "отключив сервопривод" после того, как я переместил его. Пример:
PIN
это контакт ШИМ, подключенный к сервоприводу. переключив его в режим ввода, я смог отключить вибрацию. Это не оптимальное решение, и я бы предложил сначала попробовать другие решения.источник
У меня была такая же проблема с сервоприводами MG90S (дрожание), мои сигнальные линии относительно длинные (60 ~ 70 см), размещение 103 (10 нФ) конденсатора над сигналом, а линии заземления устранили проблему для меня (я поместил конденсатор где-то в посередине, в точке, где оригинальный серво кабель подключается к моему внутреннему кабелю).
Кроме того, я не мог использовать стандартную библиотеку Servo, потому что первый таймер, который она захватывает на Arduino Mega, это Timer-5, и он мне нужен для измерения частоты. Поскольку я использую только 10 сервоприводов, я извлек код ключа из библиотеки сервоприводов и изменил его на использование Timer-1 (каждый таймер поддерживает максимум 12 сервоприводов на Mega).
Ниже приведен автономный код для справки: если вы хотите включить его в свой собственный проект, то вы можете использовать только верхнюю часть, нижняя часть - для тестирования верхней части (она прослушивает последовательный порт, вы можете дать sX и команды vX, где sX выбирает сервопривод, s0 выбирает первый сервопривод, vX устанавливает положение сервопривода в нас, поэтому v1500 установит серво0 в среднее положение, если вы сначала дали команду s0).
источник
Мой лучший вариант в этом случае - подключать и отключать сервоприводы в каждой операции.
PS. это действительно вообще не качество, просто обходной путь.
источник
В то время как другие предлагали различные решения этой проблемы с серво-гудением, в этой теме и на других форумах Arduino, а именно:
В моем случае я обнаружил, что гудение прекратилось, когда к плате Arduino подключен источник питания 9 В / 2 А. Но самое простое окончательное решение - просто медленно двигать сервопривод:
YMMV.
источник
источник
Для меня это выглядит как ошибки или неправильная настройка цикла обратной связи. Высокопроизводительные системы сервоуправления имеют некоторые знания о характеристиках двигателя (индуктивность, крутящий момент, пиковый ток, число полюсов), нагрузке (момент инерции) и мгновенных условиях (положение, об / мин, противо-ЭДС, ток). С помощью этой информации программа управления двигателем может делать прогнозы относительно того, что сервопривод будет делать в ответ на заданный вход от контроллера (то есть вход тока / напряжения), и на этой основе генерировать оптимальный вход для достижения желаемого выхода.
Как вы можете себе представить, это довольно сложная вещь, но поиск в интернете по обратной связи с сервоприводом поможет вам начать.
источник