загадочный серво

rx
Offline
Зарегистрирован: 23.10.2011

 сразу скажу, я новичек по arduino и всему с этим связанному. Проблема такая: купил arduino и 3 сервопривода, 2 с углом поворота 180, 1 на 360 градусов. Создаю самую простейшую программу, те что на 180 кртятся как надо, а на 360 градусов (SM-S4306R) какой-то безбашенный, вертится как хочет. Сделал даже такую тестовую програмку:

#include <Servo.h>
Servo myservo; 
int pos = 0;

void setup()
{
myservo.attach(3);
}

void loop()
{

}

а серв всеравно потихоньку вертит без остановки. Я ведь даже ничего не прошу у него.

Как мне кажется это аппаратная проблема, ЧТО ДЕЛАТЬ!!!

egor
Offline
Зарегистрирован: 23.10.2011

 Дело в том что SM-S4306R - серводвигатель неприрывного вращения. То что для обычных сервомоторов угол поворота - для него скорость вращения.

rx
Offline
Зарегистрирован: 23.10.2011

Спасибо! Я даже не знал, что такие бывают. Чуть его обратно не сдал.
А их можно как-то отличить по маркировке? Те, что всегда крутятся от тех, что только на 360, или для каждого производителя она своя 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 >>Дело в том что SM-S4306R - серводвигатель неприрывного вращения. То что для обычных сервомоторов угол поворота - для него скорость вращения. <<
 

Тогда каким образом задается направление вращения ?

Получается там вместо переменного резистора стоит энкодер ?

 

rx
Offline
Зарегистрирован: 23.10.2011

да, это тоже интересно. Я задавал ему разные "углы" и миллисекунды, а в его реакции не смог разобраться. То он так крутится, то эдак. При чем в разные стороны и с разной скоростью. Допустим даешь комманду повернуться на 1 градус, а он делает примерно 5.5 оборота по быстрому. А во время сна sleep(N), он занимается лунатизмом и куда-то по тихоньку крутит.
 

Где-то читал, что бывают сервы с неправильным сопротивлением резистора внутри и может быть, что при полном останове он всёравно вертит. Вот и написал в эту ветку. А оказывается нужно как-то приручить этого "скакуна" :)

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>Где-то читал, что бывают сервы с неправильным сопротивлением резистора<< 

В данном случае сопротивление не играет там никакой роли.

Переменный резистор в сервах выступает в роли делителя напряжения и его номинал там почти не важен.

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

rx
Offline
Зарегистрирован: 23.10.2011

sm 43r robot series servo controled via analog signal(pwm), could achieve 360 two-way continuous rotation, stopped via middle point positioner.
rotation and restpointadjustment: whenanalog signal(pwm) inputs, servo choosesorientation according to impulse width. when intermediatevalue of impulse width is above 1.5ms, servo is clockwise rotation, conversely, anticlockwise. rest point need use slottedscrewdriver to adjust the positionercarefully. servo stopped rotationwhenthe input signal is equivalent to impulse width
please choose correct model for your application. Caution: Torque over-loaded will damage the servo`s mechanism

Итак, прочитал инструкцию :) (см.выше) и остановил постоянное вращение подстроечным резистором на корпусе серводвигателя.
Написно, что направление и скорость регулируется длинной импульса ШИМ. Поэксперементировал с записью analogWrite'ом, смог и покрутить и остановить. Но это всё было не нужно. Работать с сервой можно обычным методом - myservo.write(X). Только Х пришлось подобрать. Вот так можно крутить(меняя параметр X):
X=
0...60 - с максимальной скоростью крутит против часовой
61...89 - медленно замедляет скорость
90 - стоит на месте
91...119 - разгоняется по часовой стрелке
120...255 - крутит как может по чс (видимо нужно было писать 120...180)

один раз записал значение - серв крутит без конца. myservo.write(90) - остановился.
Но остался глюк - вращение не постоянное. Немного покрутит, передохнёт секунду и дальше вращается. Это возмутительный фактор.

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

Немного покрутит, передохнёт секунду и дальше вращается. Это возмутительный фактор.

 

Выложите последний ваш код, сам имею таких 2 штуки сервы. А там и посмотрим почему вращает с секундными перерывами 

rx
Offline
Зарегистрирован: 23.10.2011

код простой, тестировал ведь:

#include <Servo.h> 

Servo myservo;

int pos = 0;


void setup() 
{ 
  myservo.attach(3);//
} 


void loop() {
  if(pos==0){
    pos++;
    myservo.write(55);
  }
} 

Есть ещё примета. Он крутится, затем останавливается на секунду и в это время моргает лампочка на плате. Потом опять начинает крутится. Может идёт какая передача?

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

 >и в это время моргает лампочка на плате

А запитан он у вас откуда? Может банально не хватает питание и плата ребутится?

При отключенном моторе, но запущенном скетче плата лампочка "мигает"?

rx
Offline
Зарегистрирован: 23.10.2011

запитан по USB.

Без мотора вроде не мигает.

Adessit
Adessit аватар
Offline
Зарегистрирован: 12.04.2011

запитайте от отдельного блока питания, только не забудьте связать  земли сервы и БП. И не рискуйте ардуинкой.

rx
Offline
Зарегистрирован: 23.10.2011

А в чём риск? я ведь просто воткнул серву в плату расширения I/O? И это просто для проверки сервы.

И почему нужно связывать землю блока питания(кот. втыкается в arduino) с сервой? Я думаю они там по плате должны быть соединены. Или вы имеете ввиду подать отдельно питание на серву, землю и сигнальный провод соединить с arduino?

Кстате на плате расширения (www.electronshik.ru/img/500/684221.jpg) есть контакты для питания сервы, как я понимаю туда можно подсоединить блок питания и не думать о земле.
 

 

Fess
Fess аватар
Offline
Зарегистрирован: 26.10.2011

Всем привет.

столкнулся тоже с такой вот сервомашинкой..

вот тут вылаживаю программку на С++ для управления с компьютера  (исходники позаимствованны тоже с этого форума) но полностью модифицированную под серво постоянного вращения. 

http://ifolder.ru/26566004
 

а это скетч для arduino

#include <Firmata.h>
#include <Servo.h>

Servo servo7;

void analogWriteCallback(byte pin, int value)

{

if(pin == 7)
servo7.write(value);
}

void setup()

{

Firmata.setFirmwareVersion(0, 2);
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);
servo7.attach(7);
Firmata.begin(9600);
}
void loop()
{
while(Firmata.available())
Firmata.processInput();
}

 

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

 >А в чём риск? я ведь просто воткнул серву в плату расширения I/O?

В том что плата расширения питается не святым духом, а током. От ардуины, а та в свою очередь от USB порта. И то и другое имеет свой предел тока который "может пропустить через себя". Поэтому, теоретически, попалить можно и ардуину и USB порт, если взять достаточно мощную серву. Или три :)

>Без мотора вроде не мигает

Ну значит вероятность проблем с питанием еще выше. Либо просаживает питание, либо срабатывает защита (у некоторых ардуин есть), либо серва выдает помехи в линию питания. 

Вообщем в любом случае начните с запитки сервы от внешнего блока питания. "Лишним" это точно не будет.

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

"Чисто по фотке" это со 100% увереностью сказать нельзя, но очень вероятно что это так.

Еще, как вариант, запитать саму ардуину внешним блоком питания (если у нее есть такой вход), но сервы питать нужно с пина VIN, а не 5V. На 5v это то что уже прошло через регулятор питания (который тоже умеет гореть при большом токе), а вот vin - это "напрямую из блока". Блок должен, в идеале 7-9v. До 12V (но это уже хуже, регулятор питания уже будет грется). Ну и предварительно убедится что сервы могут жить на том напряжении что выдает блок, что они не "не больше пяти вольт".

 

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

 >туда можно подсоединить блок питания и не думать о земле

Это кстати проверить довольно просто. Подсоедените свою плату расширения к ардуине (только ее, без сервы,  не подключая USB и блок питание). Возьмите тестер. Включите в режим прозвона. Ткните в пин GND на ардуине и GND на этом разъеме. Если тестер пищит - значит все OK. Земли связаны. Если нет, то либо плату делали очень странные люди, либо где-то в описании платы должно быть упомянута "оптическая развязка" (но тогда, по идее, она сейчас у вас вообще не должна бы крутится).

Кстати из любопыства можете еще прозвонить между плюсом этого разъема и VIN ардуины, и плюсом разъема и 5v ардуины.

Так же можете подключив нагрузку, померять напряжение между GND ардуины и 5v пином. Если "пляшет" или там что-то далекое от 5v то....

>плата ребутится

это можно проверить добавив в функцию setup()  "мигнуть один раз диодом на 13-том пине". Если он тоже будет регулярно мигать, значит плата точно постоянно ребутится.

rx
Offline
Зарегистрирован: 23.10.2011

Огромное спасибо! Даже начинаю понимать, как внутри всё связано.
Значит для подключения трёх серв(моторшилда у меня нет) нужно запитать двигатели отдельно от Arduino или, если всё правильно разведено, воткнуть питание в I/O плату в разъём Servo Power.
А вот в автономных роботах как подключено питание? Там 2 раздельных, отдельно на плату и отдельно на двигатели, или 1 источник питания подключен к двум входам(к плате и к двигателям).

для Fess. В чём проблема не понятно, может нужно подключить серву к PWM выходу, например 6