Сервопривод непрерывного вращения.
- Войдите на сайт для отправки комментариев
Здравствуйте, хочу сделать робот, чтобы им можно было управлять с android.
Сам ещё новичок, поэтому хочу спросить у бывалых решение одной проблемы :
Есть два сервопривода непрерывного вращения, но дело в том, что они не хотят работать со стандартной библиотекой Servo.h.
Вот пример кода:
#include <Servo.h>
Servo myservo;
void setup ()
{
myservo.attach (9);
myservo.write (93);
}
void loop () {}
Код примитивный и очень простой, но почему они не работают всё равно не понятно. Думал сломанны, но если подать напряжение при помощи digitalWrite то всё прекрасно работает, правда вращаются в одну сторону.
Помогите, пожалуйста, решить данную проблему, и скажите, как их заставить двигаться в обратную сторону?
Заранее спасибо.
myservo.write (20); - влево
myservo.write (160); - вправо
Вам нужно найти даташит на свои сервы, и выяснить какой PWM они ожидают. Какие должны быть минимальная длина импульса, и максимальная.
В библиотеке servo, по умлочанию использоются 544 и 2400 соответсвенно.
Если у вас "нестандартный, то нужно делать
myservo.attach (9,300,3000); // минимальный импульс 300, максимальный 3000
>Помогите, пожалуйста, решить данную проблему, и скажите, как их заставить двигаться в обратную сторону
У сервы нет понятия "направление вращения". У нее есть понятия "позиция которую нужно занять". Вы ей говорите "стань в позицию 30град", а в какую сторону она для этого будет крутится - зависит от того где она сейчас находится.
И на всяк случай, вы уверены что у именно сервы? А не степеры, например?
P.S. Если бы вы дали ссылку на даташит своих серв (в идеале), или хотя-бы их название (уже хуже) - необходимость в построении догадок сильно упала бы, а ваши шансы получить ответ - увеличились.
Я точно не знаю как устроены сервы постоянного вращения, но я переделывал обычную серву под постоянное вращение. Так вот в этом случае внутри сервы отсоеденяется потенциометр от основой шестерни и фиксируется (т.е. крутиться он теперь вообще не будет) в таком положении, когда при подачи myservo.write (90); (середина) двигатель сервы перестает крутиться. После чего все то что подается меньше 90 вращает серву в одну сторону, а то что больше 90 вращает в противоположную, при этом чем больше подаваемое значение отличается от 90 тем выше скорость вращения сервы. В общем-то такую серву и серво то не назовешь, так как у нее отсутствует обратная связь, я бы сказал, что это мотр-редуктор с драйвером в одном корпусе.
Скорее всего у серв постоянного вращения тоже есть такое среднее значение, при котором она стоит и по аналогии, все что больше этого значения крутит в одну сторону, а то что меньше в другую и чем больше оличается значение от среднего тем выше скорость вращения.
http://www.imageup.ru/img300/944430/img_20120513_111013.jpg.html
вот сам мини робот, у приводов всего два контакта, земля и напряжение, название не знаю, дали в колледже на создание проекта.
В таком случае у вас вообще не серва, а просто мотор. И библиотека серва вам вообще не нужна.
Попробуйте оба провода ноги завести на цифровые пины (но вначале дочитайте до конца). Например D3 и D5.
на D3 делаете digitalWrite - он будет отвечать за направление вращения. HIGH - в одну строноу, LOW в другую.
на D5 делаете analogWrite - он будет отвечать за скорость. Будет нюанс. Для одного направления чем больше analogWrite тем быстрее крутится будет, для противоположного направления - наоборот. Чем меньше analogWrite тем быстрее.
НО... вы имеетее, подключая моторы прямо к пинам, неплохой шанс спалить ноги процессора. С пина ардуины можно брать не более 40ma, лучше держатся в границах 20ma. Поэтому нужно смотреть даташит на мотор или мерять амперметром сколько он жрет. Если больше - городить какие-то реле/драйверы мотора/транзисторы.
Общий вид робота - это хорошо. Только бесполезно. Нужны характеристики именно моторов.
Для управления этими мотор-редукторами нужно использовать либо драйвер (драйвер биполярного шагового двигателя, он же драйвер DС-мотора двухканальный) например L293D, либо готовый вариант - Motor Shield.
Можно подключить на прямую к цифровым выводам, но тогда двигатили если и будут крутиться, то очень слабо и медленно, т.к. даже если у этих двигателей очень маленькое сопративление, то как вам написал выше leshak - цифровые выводы дадут не более 40 мА, а это очень мало для таких двигателей. Вот так можете проверить будет ли работать при подключении напрямую к дуине к 3 и 4 цифровым выводам:
чень слабо и медленно, т.к. даже если у этих двигателей очень маленькое сопративление, то как вам написал выше leshak - цифровые выводы дадут не более 40 мА,
Цифровые выходы дадут сколько попросишь. Вернее попытаются. И если потребитель будет пытаться сожрать более 40ma - сгорят. Так что хотя-бы в один пин, лучше подключать мотор не напрямую, а через резистор в 220 Ом. Этим вы снизите вероятность что "мотору хватит напряжения" (может вообще не закрутится), но зато обезопасти себя от уничтожения ардуины.
Даже если вы уже подключали мотор к пинам напрямую - это ничего не значит. На холостых вы может и "уложились" в допустимые пределы (особенно если не долго крутили), но не факт что под нагрузкой они не начнут больше жрать.
Так что наиболее грамотный безопасный путь - использовать L239D или моторшилд. Максим дал выше ссылки на них. Пины ардуины вообще не предназачены что-бы питать что-нибудь. Только для "управляющих сигналов". Исключение - светодиоды (и то только обычные, слабенькие). Но и их нужно через резитор включать. Ограничивать их аппетит.
Вы ошибаетесь, ток короткого замыкания ноги МК (ATmega8/168/328 в DIP исполнении) относительно земли или +5V составляет 80мА больше МК дать не может, а сгорит МК по истечению некоторого времени от перегрева в результате этого замыкания. При кз между ногами МК максимальный ток составит 70мА.
А вот то что дуина при прямом подключении в один прекрасный момент может сгореть - это вполне вероятно.
>(ATmega8/168/328 в DIP исполнении
А где гарантии что у что у топик стартера именно DIP исполнение?
>по истечению некоторого времени от перегрева...при прямом подключении в один прекрасный момент может сгореть
Ну и как это противоречит моим утверждениям "... вы имеетее, подключая моторы прямо к пинам, неплохой шанс спалить ноги процессора." и "потребитель будет пытаться сожрать более 40ma - сгорят"? Тем что я не уточнил через сколько секунд это произойдет? Так не угадаешь это.
В любом случае, даже если камень может выжить некоторе время на запредельном для него режиме - это не значит что новичку можно советовать это подобие "оверклокинга". Написанно в даташите 40ma максимум (рекомендуется 20ma) - вот так и подключай. Не навреди советами.
Вначале нужно научится ходить, создать привычку просчитывать заранее какие токи будут идти, а уж потом заниматся "эквилибристикой".
P.S. Там еще есть, кстати, сколько суммарно можно взять со всех ног. 40ma одновременного со всех брать тоже нельзя. И сколько суммарно с ног подключенных к одному порту.
Это противоречит фразе:
Цифровые выходы дадут сколько попросишь.
В SMD исполнении скорее всего такие же токи, а то может быть и меньше. А по поводу остального я не противоречил:
А вот то что дуина при прямом подключении в один прекрасный момент может сгореть - это вполне вероятно.
Это противоречит фразе:
Цифровые выходы дадут сколько попросишь.
Не, ну мне казалось очевидным, что "сколько попросишь", все-таки имеет какоие-то физические ограничения. Очевидно что мощьность электростанции от пина не выпросишь как не проси. Чего-то бесконечного не бывает. Подразумевалось "попросишь больше чем он может дать по даташиту - он попробует это выполнить, с печальными для себя последствиями". Вообщем по даташиту написанно 40ma. И заботится об этом ограничении нужно самому, снаружи, а не полагатся на то "сколько пин решит выдать".
Крутятся то они крутятся, если напрямую подключить к пину, но робот только вращается на одном месте, для движения вперёд нужно, чтобы крутились в одну сторону, макет не позволяет переустановить моторчики, поскольку иначе не влезет.
И как я понял, что мне обязательно нужен драйвер l293d, иначе никак не получится.
А зачем их переустанавливать? Двигатели могут крутиться в обе стороны.
Объясните тогда как, если подключаю напрямую с пина и работают только при digitalWrite?
Попробывал использовать код, который описан выше, но соотвественно при значении LOW они просто перестают работать.
Ваши двигатели меняют свое направление в зависимости от полюсации на них. Код для проверки одного двигателя я вам выше писал.
При какой еще значении???? Вы как двигатели подключаете???? Этот код для проверки одного двигателя.
Тьфу, извините, не так понял.
Тогда можете рассказать подробней как подключить один моторчик, ведь один контакт идёт на землю, другой на напряжение.
Нет, оба контакта одного двигателя идут на 3 и 4 пины (к земле подключать ничего не нужно).
А, теперь заработало, спасибо.
Тьфу, извините, не так понял.
Тогда можете рассказать подробней как подключить один моторчик, ведь один контакт идёт на землю, другой на напряжение.
Выше было
Попробуйте оба провода ноги завести на цифровые пины (но вначале дочитайте до конца). Например D3 и D5.
Разница только в том, что Максим дал вам код для D3,D4
Объясните тогда как, если подключаю напрямую с пина и работают только при digitalWrite?
Нет, можно analogWrite использовать для задания скорости.
Опять-таки в сообщение #6
Описано как подключить напрямую к пинам. Один из них будет задавать направление, а второй - скорость вращение.