Мой сервопривод не работает плавно
Поэтому я пробовал это несколько раз, и у меня всегда была одна и та же проблема. Когда я пытаюсь запустить пример развертки, сервопривод поворачивается на 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
@Jordan Adams, 👍6
Обсуждение6 ответов
Похоже, ваш скетч выполняется в замедленном темпе.
Проверьте, не написали ли вы delay(150) и не добавили ли вы дополнительную задержку в свой цикл. Дважды проверьте и, на всякий случай, снова загрузите исправленный скетч.
Изменить: Если возможно, протестируйте с другим сервоприводом и даже с другой платой Arduino.
Я могу заверить вас, что это не так. Я пробовал все от 1 до 15 для задержки и даже без задержки. Я также пробовал иметь только один цикл for, @Jordan Adams
Хорошо. Без задержки сервопривод должен двигаться с фактической скоростью процессора. Какой тип платы вы используете? И является ли код над исходным кодом, работающим на плате? Вы пытались установить контакт 9 как цифровой выход? Код в setup(){ ... pinMode(9, OUTPUT); // устанавливает пин как выход ... }, @suit4
В электронике, как обычно, в ситуациях, когда схема работает неправильно, и мы не понимаем, почему, обычно работает решение, заключающееся в добавлении развязывающего колпачка между +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
У меня было такое же поведение с этим типом сервоприводов. В моем случае это было легче заметить, так как Arduino часто перезагружался, когда сервопривод приближался к границам размаха, поэтому было ясно, что он потребляет слишком много энергии, а USB-порт не может этого обеспечить.
Проблему обычно решает недорогой специализированный преобразователь переменного/постоянного тока 9 В 1 А. Но если вы не можете дождаться его доставки, приобретите USB-зарядное устройство для iPad (в настоящее время оно есть у всех или у соседа/друга, у которого оно есть). Он рассчитан на 10 Вт и не страдает от перепадов напряжения даже при высоких нагрузках. Включите от него свою установку, и если вы увидите, что она работает плавно, вы получите ответ.
Программа неисправна. 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
Подключите клемму +ve питания 9 В к Vin и минусовую землю. поскольку плата arduino не может обеспечить достаточную мощность сервопривода, это обеспечит это сработало для меня и работает просто отлично
Я проверил ваш код, в нем нет ничего плохого. Возможно дело в блоке питания. 1. Не используйте USB для питания сервопривода, он может вызвать скачок тока при быстром движении. 2. Используйте правильный источник питания для сервопривода. Высокий ток и использование большого конденсатора для борьбы с пиковым током.
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Микро сервопривод не работает с Arduino UNO
- поворот позиционного серводвигателя более чем на 180 градусов
- Почему loop() останавливается?
- 6 + 1 двигательей подключенных к arduino uno?
это гудение между "шагами"?, @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