сервопривод тупит

arduman
Offline
Зарегистрирован: 01.07.2013

Всем доброго времени суток!!!

Я новичок - сразу говорю.

Есть серва sm-s1121s. Написал прогу такую вот:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
  myservo.attach(9);
 
void loop() 
{
  myservo.write(500);  // устанавливаем сервопривод в серединное положение
  delay(45);
  myservo.write(500);  // устанавливаем сервопривод в крайнее левое положение
  delay(120);
}
 
в итоге ни на команду write(), ни на delay() не реагирует никак просто вращается и все на етом.
прогу брал с амперка/вики. Сервопривод может тупит?? Вдруг он постоянного вращения?
помогите плиззз!! 

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

хммм, интересно, почему же вы не можете заметить визуально паузу в 45 ms .. странно все это... болеете может? :)

с нетерпением жду еще одного поста от вашего сервопривода  "Хозяин тупит, помогите"

-Николай-
Offline
Зарегистрирован: 03.09.2011

Какая разница между строками

<myservo.write(500);  // устанавливаем сервопривод в серединное положение>

и

<myservo.write(500);  // устанавливаем сервопривод в крайнее левое положение>

?

Может быть дело в этом?

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

Если привод вращается без остановки, то он постоянного вращения.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

maksim пишет:

Если привод вращается без остановки, то он постоянного вращения.

логично, но он вроде бы на 60 градусов должен только двигаться... судя по описанию...

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

Его могли переделать.

-Николай-
Offline
Зарегистрирован: 03.09.2011

Разве в описании не сказано, что параметр должен быть от 0 до 180?

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

Это не важно, серва должна занять крайнее положение.

void Servo::write(int value)
{  
  if(value < MIN_PULSE_WIDTH)
  {  // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)
    if(value < 0) value = 0;
    if(value > 180) value = 180;
    value = map(value, 0, 180, SERVO_MIN(),  SERVO_MAX());      
  }
  this->writeMicroseconds(value);
}

И кстати, 

#define MIN_PULSE_WIDTH       544

так что если значение будет больше 544 то функция будет задавать длинну импульса в микросекундах, а не угол.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

пойду достану хрустальный шар :)

arduman
Offline
Зарегистрирован: 01.07.2013

maksim! После того, как я закинул на ардуино прогу от пользователя ich, (если зайти в Форум, потом в Аппаратные вопросы, там будет "Прежде чем спросить про Сервомашинку / Servo, посмотри тут.") серва вращается нормально - поворачивается на опред. градус и ОСТАНАВЛИВАЕТСЯ! Так что, дело не в этом.

arduman
Offline
Зарегистрирован: 01.07.2013

И никто ничего не переделывал!!

arduman
Offline
Зарегистрирован: 01.07.2013

maksim пишет:

Это не важно, серва должна занять крайнее положение.

void Servo::write(int value)
{  
  if(value < MIN_PULSE_WIDTH)
  {  // treat values less than 544 as angles in degrees (valid values in microseconds are handled as microseconds)
    if(value < 0) value = 0;
    if(value > 180) value = 180;
    value = map(value, 0, 180, SERVO_MIN(),  SERVO_MAX());      
  }
  this->writeMicroseconds(value);
}

И кстати, 

#define MIN_PULSE_WIDTH       544

так что если значение будет больше 544 то функция будет задавать длинну импульса в микросекундах, а не угол.

maksim, а можно поподробнее о программе и о синтаксисе???

arduman
Offline
Зарегистрирован: 01.07.2013

-Николай- пишет:

Какая разница между строками

<myservo.write(500);  // устанавливаем сервопривод в серединное положение>

и

<myservo.write(500);  // устанавливаем сервопривод в крайнее левое положение>

?

Может быть дело в этом?

Нет, не в этом! Я там все эти значения как мог менял, все равно, с этой прогой он без остановки крутится.

Кстати прогу не я писал, если чего, брал на http://wiki.amperka.ru/робототехника:сервоприводы. Сам в этом пока не очень разобрался.

arduman
Offline
Зарегистрирован: 01.07.2013

Puhlyaviy пишет:

хммм, интересно, почему же вы не можете заметить визуально паузу в 45 ms .. странно все это... болеете может? :)

с нетерпением жду еще одного поста от вашего сервопривода  "Хозяин тупит, помогите"

Шутки-шутками, а прога все равно тупит))

delay(45) менял и на delay(450) и на delay(4500) - все одно и то же - так что ничего удивительног, что я не вижу несуществующую остановку сервопривода!))

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

arduman пишет:

не реагирует никак просто вращается и все на етом.

arduman пишет:

поворачивается на опред. градус и ОСТАНАВЛИВАЕТСЯ!

Так не бывает на одной серве - либо она вращается, либо поворачивается на определенный угол. Так что что у вас там происходит так и остается загадкой...

Snubist
Offline
Зарегистрирован: 18.02.2013

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

Залей

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  myservo.write(50);  // устанавливаем сервопривод на 50 градусов
  delay(1000);
  myservo.write(10);  // устанавливаем сервопривод в 10 градусов
  delay(1000);
}

Результат сообщи:)

Geronimo
Offline
Зарегистрирован: 06.05.2013

Моя серва тупила так:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  for(int i = 0;i <180;i++)
  {
     myservo.write(i);  
     delay(100);
 }  
  delay(1000);
  for(int i = 180;i >0;i--)
  {
     myservo.write(I); 
     delay(100);
 }
}

Так работает, а вот так нет:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  myservo.write(50);  // устанавливаем сервопривод на 50 градусов
  delay(1000);
  myservo.write(10);  // устанавливаем сервопривод в 10 градусов
  delay(1000);
}

в явном задании углов не двигается.

-Николай-
Offline
Зарегистрирован: 03.09.2011

Geronimo пишет:

Моя серва тупила так:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  for(int i = 0;i <180;i++)
  {
     myservo.write(i);  
     delay(100);
 }  
  delay(1000);
  for(int i = 180;i >0;i--)
  {
     myservo.write(I); 
     delay(100);
 }
}

Так работает, а вот так нет:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  myservo.write(50);  // устанавливаем сервопривод на 50 градусов
  delay(1000);
  myservo.write(10);  // устанавливаем сервопривод в 10 градусов
  delay(1000);
}

в явном задании углов не двигается.

 

Я думаю имеет смысл проверить вообще серву, т.е. может ли она управляться ШИМ. Для этого нужно управляющий вход подключить к выходу ШИМ и попробовать погенерить там разный сигнал, хоть с тем же "for". Если все будет хорошо, то будем разбираться дальше.

Geronimo
Offline
Зарегистрирован: 06.05.2013

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

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

но тут кажется она пропускает некоторые значения между ушей.

arduman
Offline
Зарегистрирован: 01.07.2013

Geronimo пишет:

Моя серва тупила так:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  for(int i = 0;i <180;i++)
  {
     myservo.write(i);  
     delay(100);
 }  
  delay(1000);
  for(int i = 180;i >0;i--)
  {
     myservo.write(I); 
     delay(100);
 }
}

Так работает, а вот так нет:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  myservo.write(50);  // устанавливаем сервопривод на 50 градусов
  delay(1000);
  myservo.write(10);  // устанавливаем сервопривод в 10 градусов
  delay(1000);
}

в явном задании углов не двигается.

Geronimo, я так и не понял, в сообщении присутствует рабочая программа, или обе неправильные?

Geronimo
Offline
Зарегистрирован: 06.05.2013

первая пашет вторая нет

 

в первой серва едет в одну строну затем в другую

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

На сколько градусов едет? на 180? В спецификации она ездиет вроде бы на 60...

вы ее вообще вначале пытались на 500 прокрутить....

Есть вариант другого предположенья, что это не градусы совсем...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Давайте вообще расуждать логически,

Серва поворачивается на 60 градусов в одну сторону и 60 в другую... тоесть общий ход 120 градусов

Серва аналоговая....

тоесть грубо говоря управляется через ШИМ... в цикле она работает, без цикла нет...

может взять библиотеку где нибуть  не там где вы уже брали...

и забавно что в инете эту серву только продают... но никто чего то особо с ее использованием не засветился.. вы видимо первый покупатель :)

 

arduman
Offline
Зарегистрирован: 01.07.2013

Snubist пишет:

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

Залей

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
{ 
  myservo.attach(9);
} 
 
void loop() 
{
  myservo.write(50);  // устанавливаем сервопривод на 50 градусов
  delay(1000);
  myservo.write(10);  // устанавливаем сервопривод в 10 градусов
  delay(1000);
}

Результат сообщи:)

Та же самая реакция, что ина мои все проги - не помогло..

arduman
Offline
Зарегистрирован: 01.07.2013

arduman пишет:

Всем доброго времени суток!!!

Я новичок - сразу говорю.

Есть серва sm-s1121s. Написал прогу такую вот:

#include <Servo.h> 
 
Servo myservo;
 
void setup() 
  myservo.attach(9);
 
void loop() 
{
  myservo.write(500);  // устанавливаем сервопривод в серединное положение
  delay(45);
  myservo.write(500);  // устанавливаем сервопривод в крайнее левое положение
  delay(120);
}
 
в итоге ни на команду write(), ни на delay() не реагирует никак просто вращается и все на етом.
прогу брал с амперка/вики. Сервопривод может тупит?? Вдруг он постоянного вращения?
помогите плиззз!! 

 

Спасибо всем за ответы и за помощь!!

Просмотрев тех данные, выяснил, что у сервы угол поворота равен 60 градусов. Сл-но, то, что она может вращаться на 360 гр. говорит о том, что ограничитель у сервопривода сломан и он уже больше по-нормальному не программируется. Буду пытать другие сервоприводы, когда попадут ко мне)))