Сервопривод непрерывного вращения.

gvindox
Offline
Зарегистрирован: 11.05.2012

Здравствуйте, хочу сделать робот, чтобы им можно было управлять с android.
Сам ещё новичок, поэтому хочу спросить у бывалых решение одной проблемы :
 Есть два сервопривода непрерывного вращения, но дело в том, что они не хотят работать со стандартной библиотекой Servo.h.
Вот пример кода:

#include <Servo.h>
Servo myservo;
void setup ()
{
myservo.attach (9);
myservo.write (93);
}

void loop () {}

Код примитивный и очень простой, но почему они не работают всё равно не понятно. Думал сломанны, но если подать напряжение при помощи digitalWrite то всё прекрасно работает, правда вращаются в одну сторону.

Помогите, пожалуйста, решить данную проблему, и скажите, как их заставить двигаться в обратную сторону?
Заранее спасибо.

Mastino
Offline
Зарегистрирован: 03.12.2011

myservo.write (20); - влево
myservo.write (160); - вправо

leshak
Offline
Зарегистрирован: 29.09.2011

 Вам нужно найти даташит на свои сервы, и выяснить какой PWM они ожидают. Какие должны быть минимальная длина импульса, и максимальная.

В библиотеке servo, по умлочанию использоются 544 и 2400 соответсвенно.

Если у вас "нестандартный, то нужно делать 

myservo.attach (9,300,3000); // минимальный импульс 300, максимальный 3000

leshak
Offline
Зарегистрирован: 29.09.2011

 >Помогите, пожалуйста, решить данную проблему, и скажите, как их заставить двигаться в обратную сторону

У сервы нет понятия "направление вращения". У нее есть понятия "позиция которую нужно занять". Вы ей говорите "стань в позицию 30град", а в какую сторону она для этого будет крутится - зависит от того где она сейчас находится.

И на всяк случай, вы уверены что у именно сервы? А не степеры, например?

P.S. Если бы вы дали ссылку на даташит своих серв (в идеале), или хотя-бы их название (уже хуже) - необходимость в построении догадок сильно упала бы, а ваши шансы получить ответ - увеличились.

maksim
Offline
Зарегистрирован: 12.02.2012

Я точно не знаю как устроены сервы постоянного вращения, но я переделывал обычную серву под постоянное вращение. Так вот в этом случае внутри сервы отсоеденяется потенциометр от основой шестерни и фиксируется (т.е. крутиться он теперь вообще не будет) в таком положении, когда при подачи  myservo.write (90); (середина) двигатель сервы перестает крутиться. После чего все то что подается меньше 90 вращает серву в одну сторону, а то что больше 90 вращает в противоположную, при этом чем больше подаваемое значение отличается от 90 тем выше скорость вращения сервы. В общем-то такую серву и серво то не назовешь, так как у нее отсутствует обратная связь, я бы сказал, что это мотр-редуктор с драйвером в одном корпусе.

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

gvindox
Offline
Зарегистрирован: 11.05.2012

http://www.imageup.ru/img300/944430/img_20120513_111013.jpg.html

вот сам мини робот, у  приводов всего два контакта, земля и напряжение, название не знаю, дали в  колледже на создание проекта. 

leshak
Offline
Зарегистрирован: 29.09.2011

 В таком случае у вас вообще не серва, а просто мотор. И библиотека серва вам вообще не нужна.

Попробуйте оба провода ноги завести на цифровые пины (но вначале дочитайте до конца). Например D3 и D5.

на D3 делаете digitalWrite - он будет отвечать за направление вращения. HIGH - в одну строноу, LOW в другую.

на D5 делаете analogWrite - он будет отвечать за скорость. Будет нюанс. Для одного направления чем больше analogWrite тем быстрее крутится будет, для противоположного направления - наоборот. Чем меньше analogWrite тем быстрее.

НО... вы имеетее, подключая моторы прямо к пинам, неплохой шанс спалить ноги процессора. С пина ардуины можно брать не более 40ma, лучше держатся в границах 20ma. Поэтому нужно смотреть даташит на мотор или мерять амперметром сколько он жрет. Если больше - городить какие-то реле/драйверы мотора/транзисторы. 

Общий вид робота - это хорошо. Только бесполезно. Нужны характеристики именно моторов.

maksim
Offline
Зарегистрирован: 12.02.2012

Для управления этими мотор-редукторами нужно использовать либо драйвер (драйвер биполярного шагового двигателя, он же драйвер DС-мотора двухканальный) например L293D, либо готовый вариант - Motor Shield.

Можно подключить на прямую к цифровым выводам, но тогда двигатили если и будут крутиться, то очень слабо и медленно, т.к. даже если у этих двигателей очень маленькое сопративление, то как вам написал выше leshak - цифровые выводы дадут не более 40 мА, а это очень мало для таких двигателей. Вот так можете проверить будет ли работать при подключении напрямую к дуине к 3 и 4 цифровым выводам:

#define A 3 // Цифровой вывод 3
#define B 4 // Цифровой вывод 4

void setup() {                
  pinMode(A, OUTPUT); 
  pinMode(B, OUTPUT);    
}

void loop() {
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);  
  delay(3000); 
  digitalWrite(B, LOW);
  digitalWrite(A, LOW);   
  delay(1000);   
  digitalWrite(B, HIGH);
  digitalWrite(A, LOW);   
  delay(3000); 
  digitalWrite(B, LOW);
  digitalWrite(A, LOW);   
  delay(1000);   
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

чень слабо и медленно, т.к. даже если у этих двигателей очень маленькое сопративление, то как вам написал выше leshak - цифровые выводы дадут не более 40 мА,

Цифровые выходы дадут сколько попросишь. Вернее попытаются. И если потребитель будет пытаться сожрать более 40ma - сгорят. Так что хотя-бы в один пин, лучше подключать мотор не напрямую, а через резистор в 220 Ом. Этим вы снизите вероятность что "мотору хватит напряжения" (может вообще не закрутится), но зато обезопасти себя от уничтожения ардуины.

Даже если вы уже подключали мотор к пинам напрямую - это ничего не значит. На холостых вы может и "уложились" в допустимые пределы (особенно если не долго крутили), но не факт что под нагрузкой они не начнут больше жрать.

Так что наиболее грамотный безопасный путь - использовать L239D или моторшилд. Максим дал выше ссылки на них. Пины ардуины вообще не предназачены что-бы питать что-нибудь. Только для "управляющих сигналов". Исключение - светодиоды (и то только обычные, слабенькие). Но и их нужно через резитор включать. Ограничивать их аппетит.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вы ошибаетесь, ток короткого замыкания ноги МК (ATmega8/168/328 в DIP исполнении) относительно земли или +5V составляет 80мА больше МК дать не может, а сгорит МК по истечению некоторого времени от перегрева в результате этого замыкания. При кз между ногами МК максимальный ток составит 70мА.

А вот то что дуина при прямом подключении в один прекрасный момент может сгореть - это вполне вероятно.
 

leshak
Offline
Зарегистрирован: 29.09.2011

 >(ATmega8/168/328 в DIP исполнении

А где гарантии что у что у топик стартера именно DIP исполнение? 

>по истечению некоторого времени от перегрева...при прямом подключении в один прекрасный момент может сгореть

Ну и как это противоречит моим утверждениям "... вы имеетее, подключая моторы прямо к пинам, неплохой шанс спалить ноги процессора." и "потребитель будет пытаться сожрать более 40ma - сгорят"? Тем что я не уточнил через сколько секунд это произойдет? Так не угадаешь это. 

В любом случае, даже если камень может выжить некоторе время на запредельном для него режиме - это не значит что новичку можно советовать это подобие "оверклокинга". Написанно в даташите 40ma максимум (рекомендуется 20ma) - вот так  и подключай. Не навреди советами.

Вначале нужно научится ходить, создать привычку просчитывать заранее какие токи будут идти, а уж потом заниматся "эквилибристикой".

P.S. Там еще есть, кстати, сколько суммарно можно взять со всех ног. 40ma одновременного со всех брать тоже нельзя. И сколько суммарно с ног подключенных к одному порту.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Это противоречит фразе:

leshak пишет:

Цифровые выходы дадут сколько попросишь.

В SMD исполнении скорее всего такие же токи, а то может быть и меньше. А по поводу остального  я не противоречил:

maksim пишет:

А вот то что дуина при прямом подключении в один прекрасный момент может сгореть - это вполне вероятно.

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

Это противоречит фразе:

leshak пишет:

Цифровые выходы дадут сколько попросишь.

Не, ну мне казалось очевидным, что "сколько попросишь", все-таки имеет какоие-то физические ограничения. Очевидно что мощьность электростанции от пина не выпросишь как не проси. Чего-то бесконечного не бывает. Подразумевалось "попросишь больше чем он может дать по даташиту - он попробует это выполнить, с печальными для себя последствиями". Вообщем по даташиту написанно 40ma. И заботится об этом ограничении нужно самому, снаружи, а не полагатся на то "сколько пин решит выдать".

gvindox
Offline
Зарегистрирован: 11.05.2012

Крутятся то они крутятся, если напрямую подключить к пину, но робот  только вращается на одном месте, для движения вперёд нужно, чтобы крутились в одну сторону, макет не позволяет переустановить моторчики, поскольку иначе не влезет.
И как я понял, что мне обязательно нужен драйвер l293d, иначе никак не получится. 

maksim
Offline
Зарегистрирован: 12.02.2012

А зачем их переустанавливать? Двигатели могут крутиться в обе стороны. 

gvindox
Offline
Зарегистрирован: 11.05.2012

Объясните тогда как, если подключаю напрямую с пина и работают только при digitalWrite? 

gvindox
Offline
Зарегистрирован: 11.05.2012

Попробывал использовать код, который описан выше, но соотвественно при значении LOW они просто перестают работать. 

maksim
Offline
Зарегистрирован: 12.02.2012

Ваши двигатели меняют свое направление в зависимости от полюсации на них. Код для проверки одного двигателя я вам выше писал.

maksim
Offline
Зарегистрирован: 12.02.2012

При какой еще значении???? Вы как двигатели подключаете???? Этот код для проверки одного двигателя.

gvindox
Offline
Зарегистрирован: 11.05.2012

Тьфу, извините, не так понял.
Тогда можете рассказать подробней как подключить один моторчик, ведь один контакт идёт на землю, другой на напряжение. 

maksim
Offline
Зарегистрирован: 12.02.2012

Нет, оба контакта одного двигателя идут на 3 и 4 пины (к земле подключать ничего не нужно).

gvindox
Offline
Зарегистрирован: 11.05.2012

А, теперь заработало, спасибо.
 

leshak
Offline
Зарегистрирован: 29.09.2011

 

gvindox пишет:

Тьфу, извините, не так понял.
Тогда можете рассказать подробней как подключить один моторчик, ведь один контакт идёт на землю, другой на напряжение.

Выше было

leshak пишет:

Попробуйте оба провода ноги завести на цифровые пины (но вначале дочитайте до конца). Например D3 и D5.

Разница только в том, что Максим дал вам код для D3,D4

gvindox пишет:

Объясните тогда как, если подключаю напрямую с пина и работают только при digitalWrite?

Нет, можно analogWrite использовать для задания скорости.
Опять-таки в сообщение #6
Описано как подключить напрямую к пинам. Один из них будет задавать направление, а второй - скорость вращение.