Мой сервопривод не работает плавно

Поэтому я пробовал это несколько раз, и у меня всегда была одна и та же проблема. Когда я пытаюсь запустить пример развертки, сервопривод поворачивается на 180 градусов, но только шагами. Кто-нибудь знает, как это исправить?

Я использую сервопривод Tower Pro Micro Servo 9G SG90

// Развертка
// by BARRAGAN <http://barraganstudio.com>
// Этот пример кода находится в открытом доступе.


#include <Servo.h> 

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

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

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


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

Видео: http://vidd.me/A40

, 👍6

Обсуждение

это гудение между "шагами"?, @jippie

не просто обычное тиканье на каждом шагу, @Jordan Adams

Вы ничего не говорите нам о настройке (схеме?). Мое предположение, что ему не хватает напряжения., @mikeY

Я настроил его точно так, как показано в [примере развертки](http://arduino.cc/en/Tutorial/sweep), @Jordan Adams

Мой единственный совет: убедитесь, что Arduino получает достаточно энергии, и проверьте соединения. Подумайте о внешнем питании, если вы не используете USB., @Anonymous Penguin

Какое максимальное входное напряжение?, @Jordan Adams

Какой блок питания вы используете? USB, адаптер питания, батарея... Пожалуйста, укажите характеристики (напряжение, максимальный ток...), @jfpoilpret

В настоящее время USB от моего MacBook, поэтому я бы предположил, что 5 В, @Jordan Adams

Вы проверили, что ваш Arduino работает на правильной частоте? Это можно легко сделать, просто загрузив обычный скетч мигания и проверив период мигания светодиода на выводе 13. Если все в порядке, попробуйте тот же блинк-скетч, но добавьте библиотеку Servo и myservo.attach(); (без вызова myservo.read()), чтобы увидеть, влияет ли присутствие сервопривода на частоту. ., @jfpoilpret

Я видел разочаровывающе ступенчатое поведение аналогичного дешевого сервопривода с совершенно другим микроконтроллером. Не исключайте низкого качества. Как правило, вы не должны использовать USB (или что-либо, что проходит через Arduino) для питания сервоприводов. http://www.thebackshed.com/Forum/forum_posts.asp?TID=5611&PN=9&TPN=3 Кажется, предполагается, что разные частоты кадров могут дать лучшие результаты., @Chris Stratton

@chris-stratton Будет ли батарея на 9 В более подходящим источником питания?, @Jordan Adams

Батареи № 9 В не следует использовать для сильноточных приложений. А без импульсного регулятора вы бы потратили почти половину своей (ограниченной и относительно дорогой) мощности в виде тепла в линейном регуляторе., @Chris Stratton

Полный удар в темноте, но пока ничего не работает: изменить задержку на что-то более медленное (может быть, 150)? Ваш сервопривод может потреблять мало энергии и не хочет надежно двигаться., @Anonymous Penguin

Справедливости ради, лучше сервопривод не "шагать"? Попробуйте установить его «от 0 (задержка 1 секунда) до 180 (задержка 1 секунда) до 0 ...», это должно дать относительно плавное движение., @Paul


6 ответов


0

Похоже, ваш скетч выполняется в замедленном темпе.

Проверьте, не написали ли вы delay(150) и не добавили ли вы дополнительную задержку в свой цикл. Дважды проверьте и, на всякий случай, снова загрузите исправленный скетч.

Изменить: Если возможно, протестируйте с другим сервоприводом и даже с другой платой Arduino.

,

Я могу заверить вас, что это не так. Я пробовал все от 1 до 15 для задержки и даже без задержки. Я также пробовал иметь только один цикл for, @Jordan Adams

Хорошо. Без задержки сервопривод должен двигаться с фактической скоростью процессора. Какой тип платы вы используете? И является ли код над исходным кодом, работающим на плате? Вы пытались установить контакт 9 как цифровой выход? Код в setup(){ ... pinMode(9, OUTPUT); // устанавливает пин как выход ... }, @suit4


2

В электронике, как обычно, в ситуациях, когда схема работает неправильно, и мы не понимаем, почему, обычно работает решение, заключающееся в добавлении развязывающего колпачка между +5V и ЗЕМЛЯ.

В вашем случае я бы поставил не менее 220мкФ; это обеспечит две вещи:

  • напряжение, используемое для управления сервоприводом, никогда не падает
  • напряжение, подаваемое на Arduino через USB, также не падает (что очень плохо скажется на Arduino, возможно, сбросит его)

Электролитические крышки обязательны для каждого любителя электроники (и, конечно, профессионала).

Подробнее о развязывающих конденсаторах можно прочитать в Википедии.

Изменить:

Согласно комментарию @gwideman, кажется, что использование развязывающей емкости выше 10 мкФ в устройстве USB 2.0 нарушит спецификации USB и может повредить хост-контроллер USB на компьютере.

Я не знал об этом ограничении, но я уже использовал развязывающую емкость до 100 мкФ в своих схемах, и у меня никогда не возникало проблем с USB-портом компьютера.

Это может быть связано с дополнительной электроникой на плате Arduino, которая «изолирует» питание USB от контактов Arduino +5V и GND, я не знаю (вероятно, это должно быть темой отдельного вопроса); а может мне просто везло все это время...

,

Может быть у вас есть схема для этого?, @Jordan Adams

Вам не нужна схема только для того, чтобы добавить развязывающий колпачок! Вам просто нужен правильный колпачок и поместите его (предпочтительно на макетную плату, но вы также можете припаять его непосредственно к сервоприводу) между контактами + 5V и GND; просто убедитесь, что вы правильно поставили колпачок, так как он поляризован (если вы поставите его наоборот, он взорвется), @jfpoilpret

Так? http://imgur.com/thfEQtY, @Jordan Adams

Да именно так., @jfpoilpret

Я пробовал следующую настройку без везения. Есть еще идеи? [http://imgur.com/lprLvm4](http://imgur.com/lprLvm4), @Jordan Adams

Какую кепку вы использовали? Это вообще **ничего** не изменило?, @jfpoilpret

2,2 мкФ, как вы предложили, и все действовало точно так же., @Jordan Adams

Я не сказал «2,2 мкФ», а «220 мкФ», что намного больше; если у вас нет 220 мкФ или больше, попробуйте найти 100 мкФ, которого *может* хватить., @jfpoilpret

USB требует, чтобы подключенные устройства ограничивали пусковой ток. Это ограничивает размер объемного конденсатора между VBUS и землей до 10 мкФ в USB 2.0. См. раздел 7.2.4.1 стандарта USB 2.0 — Ограничение пускового тока. Использование более крупного конденсатора, особенно значительно большего, чем требуется источнику питания (компьютеру) на его конце (120 мкФ), может привести к повреждению компьютера или, по крайней мере, нарушению его работы., @gwideman

Подробнее об ограничении емкости обхода USB: http://www.edn.com/design/analog/4313897/Current-limiter-allows-large-USB-bypass-capacitance, @gwideman

Спасибо @gwideman за эту точность; однако, чтобы убедиться, что это относится к схеме на основе Arduino, нужно сначала проверить, что на диаграмме Arduino находится между питанием USB и контактом 5 В (я не проверял). Что бы это ни стоило, я уже использовал развязывающий конденсатор 100 мкФ в одной из моих схем на базе Arduino UNO и никогда не сталкивался с проблемами USB; ваш пробег может отличаться., @jfpoilpret

Между питанием USB и сетью +5 В находится предохранитель и сопротивление Рона полевого транзистора, который переключается между USB и внешним питанием. Ни один из них не оказывает большого сопротивления, и в этом случае предохранитель не сработает в масштабе времени, обеспечивающем защиту. Это правда, что хосты (компьютеры) не _обязательно_ ломаются, когда USB-устройство имеет слишком большую емкость :-), и производители компьютеров, очевидно, должны защищаться от таких повреждений. Действительно, Arduino UNO уже имеет объемную емкость 47 мкФ x 2 (и похоже, что у Duemilanove 100 мкФ x 2)., @gwideman

Более вероятные проблемы заключаются в том, что горячее подключение приведет к сбоям в работе других устройств, подключенных через USB, особенно при совместном использовании концентратора., @gwideman

Стоит отметить, что USB часто довольно терпимо относится к устройствам, которые СОВЕРШЕННО не соответствуют техническим характеристикам. Это зависит от реализации хоста, и многие компьютеры готовы предоставлять подключенным устройствам значительно больше тока, чем указано в спецификациях., @Connor Wolf


1

У меня было такое же поведение с этим типом сервоприводов. В моем случае это было легче заметить, так как Arduino часто перезагружался, когда сервопривод приближался к границам размаха, поэтому было ясно, что он потребляет слишком много энергии, а USB-порт не может этого обеспечить.

Проблему обычно решает недорогой специализированный преобразователь переменного/постоянного тока 9 В 1 А. Но если вы не можете дождаться его доставки, приобретите USB-зарядное устройство для iPad (в настоящее время оно есть у всех или у соседа/друга, у которого оно есть). Он рассчитан на 10 Вт и не страдает от перепадов напряжения даже при высоких нагрузках. Включите от него свою установку, и если вы увидите, что она работает плавно, вы получите ответ.

,

-1

Программа неисправна. 1) Ни один сервопривод не может отреагировать на команду за 15 миллисекунд. Задержка должна быть больше 500 миллисекунд (0,5 секунды). 2) Циклы for не предназначены для совместной работы. 1-й цикл передает значение 181 во второй цикл, который должен начинаться со значения 180. 2-й цикл передает значение -1 обратно в первый цикл, который должен начинаться со значения 0.

,

Скажите, пожалуйста, что неверно в моем анализе цикла for. Могла бы помочь., @Electronicalifragilistic

В этом есть несколько довольно серьезных недоразумений - заданная задержка только между самыми мелкими приращениями, фактическое время развертки составляет 2,7 секунды, что вполне в пределах возможностей сервопривода. Использование задержки в 20 мс (возможно, с большими приращениями для компенсации) действительно больше соответствовало бы типичной частоте обновления сервоприводов, но это не то, что вы рекомендуете. Также ваш анализ циклов for неверен., @Chris Stratton

Содержимое цикла for выполняется только в том случае, если условие истинно, поэтому в сервопривод записываются только те условия, которые ему удовлетворяют. Оба цикла for инициализируют свою переменную., @Chris Stratton


0

Подключите клемму +ve питания 9 В к Vin и минусовую землю. поскольку плата arduino не может обеспечить достаточную мощность сервопривода, это обеспечит это сработало для меня и работает просто отлично

,

0

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

,