аналоговый сервопривод

voin2100
voin2100 аватар
Offline
Зарегистрирован: 19.01.2012

 Работа с сервоприводами- програмирование и механика

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

 20!

voin2100
voin2100 аватар
Offline
Зарегистрирован: 19.01.2012

 Привет всем продвинутым!!!! Помогите. Вот залил скетч, а сервопривод просто крутится и все! В чем причина?                                                                                                                                                                #include <Servo.h>
Servo myservo; // создаем объект для контроля сервы
// максимальное количество таких объектов – 8

int pos = 0; // переменная для хранения позиции сервы

void setup()
{
myservo.attach(9); // серва подключена к девятому пину
}

void loop()
{
for(pos = 0; pos < 180; pos += 1) // от 0 до 180 градусов
{ // с шагом в 1 градус
myservo.write(pos); // устанавливаем положение
delay(15); // ждем 15 мс пока серва займет новое положение
}
// и обратно
for(pos = 180; pos>=1; pos-=1) // от 180 до 0 градусов
{
myservo.write(pos);
delay(15);
}

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

 > В чем причина?

Как минимум в том, что это не сервопривод. По крайней мере не стандартный. Обычная серва - физически  не может крутится. У нее ограничители механические стоят.

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

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

 Вот он sm-s4315r. Причем, если подключаю к аналоговому выводу вообще нет движений!

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

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

На форуме уже не раз поднимался этот вопрос. Хотя в документации это четко описанно

http://arduino.ru/Reference/Library/Servo/write

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

 Вообщем если у вас была задача командовать серве что-то типа"займи положение 45 градусов и держи его" - вы купили не ту серву :(

Этому аппарату можно сказать только "крутись вправо, влево, быстрее медленее. стой! ать. два."

voin2100
voin2100 аватар
Offline
Зарегистрирован: 19.01.2012

 Спасибо за ответ. У меня задача: нажал кнопку-провернулась на какой-то угол и установилась, нажал на другую кнопку повернулась на угол в другую сторону, и нужна возможность менять скорость поворота.

voin2100
voin2100 аватар
Offline
Зарегистрирован: 19.01.2012

 А какая серва мне нужна, но с такой  же мощьностью?

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

>нажал кнопку-провернулась на какой-то угол и установилась

Любая стандартная серва. Но как правило они поворачиваются только 0-180. И вы говорите не "на какой угол повернутся", а "какую позицию занять". То есть вам еще нужно запоминать "куда вы в последний раз ей командовали". То есть если она стоит на 20, а вам нужно повернуть на 10 градусов вправо, то вы должны дать команду "стань на 30-ть".

>и нужна возможность менять скорость поворота.

А вот тут наоборот. В отличие от "непрерывного вращения" напрямую скоростью вращения сервы управлять не возможно. Она всегда старается как можно быстрее занять указанную позицию. Скорость можно задавать либо снижая питание самой сервы, либо "эмулируя программно". Выдавая команду не целиком, а "малыми порциями". То есть, напримимер, вам нужно повернуть из 10 в 60. Значит вы делает не servo.write(60) сразу, а servo.write(15);delay(..) ;servo.write(20); delay(..);servo.write(25);delay().....servo.write(60)

Подриете delay и шаг таким образом - что-бы "дерганность" была не сильно заметна. Поищите на форуме, я уже давал тут код для этого.

>А какая серва мне нужна, но с такой же мощьностью

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

 

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

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

voin2100
voin2100 аватар
Offline
Зарегистрирован: 19.01.2012

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

voin2100
voin2100 аватар
Offline
Зарегистрирован: 19.01.2012

 Сбоку на корпусе есть потенциометр. Как он работает?

ivanik
Offline
Зарегистрирован: 02.08.2014

я только начинающий и хочу спроосить , можно ли 1 сервопривод настроить под множество движений

 

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

ivanik пишет:

я только начинающий и хочу спроосить , можно ли 1 сервопривод настроить под множество движений

 

Я не начинающий, но понять что такое "настроить под множество движений" - не могу.

0259
0259 аватар
Offline
Зарегистрирован: 30.03.2014

ivanik пишет:

я только начинающий и хочу спроосить , можно ли 1 сервопривод настроить под множество движений

 


Напиши что именно ты имел в виду может подскажу что знаю тут нельзя так нужно знать хотя-бы основы как спросить и объяснять как можно подробнее

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

voin2100 пишет:

... серва как то не четко останавливалась и дергалась.....

Если надо чтобы серва долго стояла и не дёргалась дайте ей  http://arduino.ru/Reference/Library/Servo/detach

Tatyana12
Offline
Зарегистрирован: 11.11.2014

помогите пожалуйста, как можно переделать этот скетч чтобы сервер не возвращался в предыдущее положение а плавно поворачивался с 0 до 180 и с 180 до 0

http://robocraft.ru/templates/skin/new/images/code.gif) rgb(248, 248, 248);">
// Sweep
// by BARRAGAN <http://barraganstudio.com> 

#include <Servo.h> 
 
Servo myservo;  // создаём объект для контроля сервы 
                // максимальное количество таких объектов - 8
 
int pos = 0;    // переменная для хранения позиции сервы 
 
void setup() 
{ 
  myservo.attach(9);  // серва подключена к 9-му пину
} 
 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // от 0 до 180 градусов
  {                                  // с шагом в 1 градус 
    myservo.write(pos);              // 
    delay(15);                       // ждём 15ms пока серва займёт новое положение
  } 
  for(pos = 180; pos>=1; pos-=1)     // от 180 до 0 градусов
  {                                
    myservo.write(pos);               
    delay(15);                       
  } 
}