• - это CraftDuino - наш вариант полностью Arduino-совместимой платы.
  • CraftDuino - настоящий конструктор, для очень быстрого прототипирования и реализации идей.
  • Любая возможность автоматизировать что-то с лёгкостью реализуется с CraftDuino!
Просто добавьте CraftDuino!
подписаться на RSS-ленту

Сервы


Серва, рулевая машинка, сервомашинка — кому как больше нравится =)
По сути, это мотор-редуктор, способный поворачивать выходной вал строго в заданное положение (на угол) и удерживать его там, вопреки сопротивлениям и возмущениям недружелюбной среды.
Нужно это было в первую очередь моделистам, для управления положениями закрылков всяких, рулей различных и лопастей вертолётных. Оттуда, из моделизма, и пришло в остальные сферы технического творчества и в робототехнику в частности =)
На выходной вал обычно насаживают “качалку” – пластиковый рычаг(реже металлический), коромысло, диск или крест, с отверстиями для закрепления тяг рулей высоты, глубины, элеронов каких-нибудь или ног робота =)
Чтобы чутко отслеживать имения положения вала и, собственно, воспринимать сигналы управления сервы имеют на борту “электронику”:
Вал с качалкой жёстко связан с движком переменного резистора. Резистор заткнут в схему контроля и сообщает ей своим текущим сопротивлением о текущем положении вала. На схему, в свою очередь, поступают сигналы управления, сообщающие в какое положение нужно повернуть выходной вал (и резистор соотвественно). Схема подаёт питание на моторчик и крутит им всё это дело до куда сказано, там замирает и если что-нибудь сдвинет качалку из нужной точки вернёт её на место, также передвинет её если придёт новая команда.

В простейших аналоговых сервах угол задаётся длительностью импульсов идуших с определённой частотой, в более продвинутых используется протокол I2C(там множество всяких вкусностей — можно и положение текущее узнать — вдруг что-то злое, внешнее и сильное смогло таки провернуть серву, можно и нагрузку текущую узнать и скорость движения).

Управлять сервой очень просто — у неё есть три провода:

— земля (коричневый/черный),
— питание +5 вольт (красный),
— сигнальный (оранжевый/желтый/белый).

Управление импульсное — по сигнальному проводу.
Особая прелесть состоит в том, что сигнальный провод слаботочный — импульсы можно давать непосредственно с ноги микроконтроллера, а вот по силовому «питанию» просасывается приличный ток.
Чтобы повернуть серву на нужный угол – нужно на сигнальный вход подавать импульс с нужной длительностью.
Чтобы удерживать определённую позицию – импульс должен повторяться.


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

/*
 * Servo Move Simple
 * -----------------
 * Move an R/C servo back and forth (0 to 180 degrees) using
 * delayMicroseconds() for pulse and delay() for time between pulses.
 *
 * Created 18 October 2006
 * copyleft 2006 Tod E. Kurt <tod@todbot.com>
 * http://todbot.com/
 *
 * Adapted from Daniel @
 * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1160470155/0
 * Rotates servo through 180 degrees, using "servoPulse" function  
 * adapted from "Temporary Servo Function"  by Tom Igoe and Jeff Gray
 */
 
 
int servoPin = 9;            // порт подключения сервы
int myAngle;                 // будет хранить угол поворота
int pulseWidth;              // длительность импульса
 
void servoPulse(int servoPin, int myAngle) 
{
  pulseWidth = (myAngle * 11) + 500;  // конвертируем угол в микросекунды
  digitalWrite(servoPin, HIGH);       // устанавливаем серве высокий уровень
  delayMicroseconds(pulseWidth);      // ждём
  digitalWrite(servoPin, LOW);        // устанавливаем низкий уровень
  delay(20);                          // 
}

void setup() 
{
  pinMode(servoPin, OUTPUT);          // конфигурируем пин сервы, как выход
}

void loop() 
{
  // медленно поворачиваем серву от 0 до 180 градусов
  for (myAngle=0; myAngle<=180; myAngle++) {  
    servoPulse(servoPin, myAngle);
  }
  delay(300);
  // а теперь обратно
  for (myAngle=180; myAngle>=0; myAngle--) {  
    servoPulse(servoPin, myAngle);
  }
  delay(300);
}  


Однако, как мы помним – работать через библиотеку намного удобнее :)
В комплекте штатных библиотек Arduino IDE уже есть библиотека Servo.
www.arduino.cc/en/Reference/Servo

Примечание:
В Arduino IDE 0017 библиотека Servo поддерживает до 12 серв (до 48 на Mega), а в IDE 0016 и ранее работает только на 9 и 10 пинах!


Рассмотрим пример
File – Examples — Servo — Sweep
который делает то же самое, что и первый.

// 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);                       
  } 
}


Существуют и другие библиотеки:
SoftwareServo — www.arduino.cc/playground/ComponentLib/Servo — удобна одинаковым названием функций с системной библиотекой Servo
— она не ограничивает количество серв 8-ю, но требует для работы вызова метода
SoftwareServo::refresh()

Пример:
#include <SoftwareServo.h> 

SoftwareServo myservo; // объект сервы

int potpin = 0;  // пин для подключения потенциометра
int val;    	// переменная для хранения значения с аналогового входа

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

void loop() 
{ 
  val = analogRead(potpin);            // считываем значение с потенциометра (величина от 0 до 1023) 
  val = map(val, 0, 1023, 0, 179);     // переводим в значение от 0 до 180) 
  myservo.write(val);                  // устанавливаем угол сервы 
  delay(15);                           // ждём поворота 

  SoftwareServo::refresh();
}


MegaServo — www.arduino.cc/playground/Code/MegaServo
— библиотека для более ранних версий IDE (в 0017 не подгрузится, т.к. она уже входит в состав IDE под именем Servo :) — позволяет контролировать до 12 серв

Для четырёхнога, вроде плантбота (с двумя сервами на одну ногу), потребуется 8 серв.

Читать далее: Сервы 2. Взгляд под корпус.

Читать по теме:
Servo library – библиотека для работы с сервомашинками

Cсылки:
openservo.org
easyelectronics.ru/servomashinka-hs-311.html — статья ДиХАльта – на примере сервомашинки HS-311.
Ну и так как придумали их моделисты/для моделистов лучшая статья у них:
www.rcdesign.ru/articles/radio/servo_intro (о том какие бывают чем различаются и что внутри)

Комментарии (23)

RSS свернуть / развернуть
+
0
спасибо!
avatar

pasha-e

  • 28 мая 2010, 16:42
+
0
А у меня серва Hobbiking HK15178 при любых углах поворота (хоть 0, хоть 30, 60, 180, 90) поворачиватся в одну сторону и упирается в упор. В чем причина этого? Заранее спасибо. P.S. поворачивается на угол 180 градусов)
avatar

MAFia

  • 24 октября 2011, 13:41
+
0
Код и схему подключения и датащит на серву в студию.
avatar

abbivan

  • 1 ноября 2011, 10:25
+
0
arduino.ru/forum/apparatnye-voprosy/problemy-s-servomashinkoi
Пытался подключит к arduino mega вот такую серву: Hobbiking HK15178. Данная серва имеет ограничение угла в 180 градусов. При включении ее (Черный-Gnd, Желтый-D0(D9),Красный- +6в внешнего питания, Gnd - -6в внешнего питания) и при подаче ЛЮБОГО угла (хоть 0, хоть 90, хоть 180, хоть 30), она поворачивается до упора на 180 градусов. В чем может быть причина?
avatar

MAFia

  • 1 ноября 2011, 11:13
+
0
по всем признакам — дохлая серва…
Скорее всего помер резистор-задатчик положения ( потенциометр внутри сервы)...=(
avatar

abbivan

  • 1 ноября 2011, 12:07
+
0
Дурацкий, может быть, конечно вопрос, но земля сервы и земля ардуино общая? Если нет, будет именно такая ерунда…
avatar

leo

  • 1 ноября 2011, 16:08
+
0
Земля у него общяя — ссылку на схему давал…
avatar

abbivan

  • 1 ноября 2011, 16:38
+
0
все сделал как тут написано — не работает(( проверил через порт значенияс потенциометра идут. Подключил к 9 пину — все работает. я что то не так делаю?
avatar

Dimuha

  • 21 декабря 2011, 16:20
+
0
я что то не так делаю?
Непонятно задаёте вопросы=)

Какая плата (какой МК)?
Какой скетч?
Какая схема?
avatar

Zoltberg

  • 22 декабря 2011, 07:45
+
0
Согласен. непонятно))Просто время для экспериментов нахожу только ночью, когда голова уже не работает))
Плата Крафтдуино.
Скетч — последний в этой статье
Потенциометр к 0 пину, серва ко 2. И не какой реакции когда крутил потенциометр. Поменял в скетче 0 пин на 9 и подключил серву к 9 заработало
avatar

Dimuha

  • 22 декабря 2011, 19:17
+
0
ой 2 пин на 9 поменял. Туплю
avatar

Dimuha

  • 22 декабря 2011, 19:18
+
0
Просто время для экспериментов нахожу только ночью, когда голова уже не работает))
Знакомо=)
Попробуйте на другие пины повешать (кроме 9 и 10 с ними во многих библиолтеках проблемы)

+ещё пара наводящих вопросов=)

То есть библиотека SoftwareServo?
Микроконтроллер у вас какой установлен в Крафтдуино?(8/168/328)
Версия ИДЕ какая?

avatar

Zoltberg

  • 23 декабря 2011, 11:00
+
0
На 9 пине как раз все работает. а в скетче написано что серву надо подключить ко 2 пину. на нем не работает.
Да библиотека SoftwareServo.
Микроконтроллер 168
Версия ИДЕ 023
Читаю что пишу и сам не понимаю:D
avatar

Dimuha

  • 23 декабря 2011, 19:04
+
0
Долго думал=)Почти никаких идей.
Пин-то работает? Светодиодом через него можете поморгать?
avatar

Zoltberg

  • 20 января 2012, 09:07
+
0
Проблему решил.Это я просто тупил)) Спасибо что не забыли про меня)))
avatar

Dimuha

  • 23 января 2012, 04:28
+
0
А что было-то?
avatar

Zoltberg

  • 23 января 2012, 11:32
+
0
Уважаемые, поможите разобраться=)
С стандартной библиотекой для серв «sweep» некоторые сервы загоняют себя в упор.
Более конкретно: подключал сервы разные и разных производителей (Hitec, Futaba, Hextronic, TowerPro и пару ноунеймов) и размеров, от стандартных до микро, скетч-стандарт. Дело в том, что сервы фирмы TowerPro (конкретно-SG-90, 9 грамм)на данном скетче загоняют себя в упор и пытаются его преодолеть, напрягая шестерни и мотор. Понимаю, что фирма шляпная и высокого качества от их продукции ожидать не стоит. Именно поэтому и хочу использовать именно эти сТервоприводы с Крафтиной, потому что на самолет (даже и маленький) их ставить опасно.
Не могу понять, что с ними? С аппаратурой радиоуправления они работают адекватно, а вот с дуинкой- не хотят(((((
Что я делаю не так?
avatar

Deich

  • 16 января 2012, 21:32
+
0
Не совсем понял проблему.
Если скетч имеется ввиду последний — то возможное решение — ограничить величины углов.
Методом перебора узнать пределы задаваемых углов.
Исправить строку val = map(val, 0, 1023, 0, 179); а именно «0, 179» на найденные углы.

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

sok

  • 16 января 2012, 22:48
+
0
Нет, скетч из стандартной библиотеки Servo/sweep. На устанавливаемые углы не реагирует, проверял. Повторю, что такое не с одной отдельно взятой сервой, а с сервами одного производителя.
Вечером попробую скетч, последний из предлагаемых.
avatar

Deich

  • 17 января 2012, 06:15
+
0
Моя проблемная серва с последним скетчем тоже чудит: встает в нейтраль и четко ее держит… ума не приложу где копать(((
avatar

Deich

  • 18 января 2012, 21:08
+
0
Проблема разрешилась сама собой))))
Перечитал комменты еще раз и решил перебросить ее с 9-го на 10-й пин и все пошло.
Спасибо откликнувшемуся=)
avatar

Deich

  • 18 января 2012, 21:16

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.