Сервомашинки


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

В простейших аналоговых сервах, угол задаётся длительностью импульсов идуших с определённой частотой. В более продвинутых — используется протокол 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 
 * 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 .
http://www.arduino.cc/en/Reference/Servo

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

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

// Sweep
// by BARRAGAN  

#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 — http://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 — http://www.arduino.cc/playground/Code/MegaServo
— библиотека для более ранних версий IDE (в 0017 не подгрузится, т.к. она уже входит в состав IDE под именем Servo 🙂 — позволяет контролировать до 12 серв

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

Далее: Сервы 2. Взгляд под корпус.
Хаки сервомашинок. Переделка в серву постоянного вращения

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

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


35 комментариев на «“Сервомашинки”»

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

    • Код и схему подключения и датащит на серву в студию.

  2. arduino.ru/forum/apparatnye-voprosy/problemy-s-servomashinkoi

    Пытался подключит к arduino mega вот такую серву: Hobbiking HK15178. Данная серва имеет ограничение угла в 180 градусов. При включении ее (Черный-Gnd, Желтый-D0(D9),Красный- +6в внешнего питания, Gnd — -6в внешнего питания) и при подаче ЛЮБОГО угла (хоть 0, хоть 90, хоть 180, хоть 30), она поворачивается до упора на 180 градусов. В чем может быть причина?

    • по всем признакам — дохлая серва…
      Скорее всего помер резистор-задатчик положения ( потенциометр внутри сервы)…=(

    • Дурацкий, может быть, конечно вопрос, но земля сервы и земля ардуино общая? Если нет, будет именно такая ерунда…

    • Земля у него общяя — ссылку на схему давал…

  3. все сделал как тут написано — не работает(( проверил через порт значенияс потенциометра идут. Подключил к 9 пину — все работает. я что то не так делаю?

    • я что то не так делаю?

      Непонятно задаёте вопросы=)

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

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

    • Просто время для экспериментов нахожу только ночью, когда голова уже не работает))

      Знакомо=)
      Попробуйте на другие пины повешать (кроме 9 и 10 с ними во многих библиолтеках проблемы)

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

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

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

    • Долго думал=)Почти никаких идей.
      Пин-то работает? Светодиодом через него можете поморгать?

    • Проблему решил.Это я просто тупил)) Спасибо что не забыли про меня)))

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

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

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

  5. Нет, скетч из стандартной библиотеки Servo/sweep. На устанавливаемые углы не реагирует, проверял. Повторю, что такое не с одной отдельно взятой сервой, а с сервами одного производителя.
    Вечером попробую скетч, последний из предлагаемых.

  6. Проблема разрешилась сама собой))))
    Перечитал комменты еще раз и решил перебросить ее с 9-го на 10-й пин и все пошло.
    Спасибо откликнувшемуся=)

  7. помогите пожалуйста.
    не могу настроить серву
    у меня arduino uno;
    на ней IO SHIELD
    а к нему подключен серво на 360 градусов
    какой бы скетч не писал, результат один
    серво крутится в одну сторону либо безперерывно либо с перерывом через одинаковое время.
    что делать???

    • что делать???

      Назвать марку сервы и привести скетч.

    • скетч любой вот например первый из статьи.
      а марка серво DFR05SR 360 degree rotation motor (5.5kg)

    • точнее марка df robot а модель DFR05SR 360 degree rotation motor (5.5kg)

    • Если не реверсируется, но иногда останавливается, то скорей всего это неправильно выставлен ноль.
      Уточните — залейте скетч knob из примеров.
      Подключите переменный резистор средней ногой к аналоговому пину 0, а крайние ноги (перем. резистора) в 5в и GND соответственно.
      Подключите серву, дайте внешнее питание, крутите потенциометр — должна регулироваться скорость и менятся направление, а так же должно быть положение в которм серва останавливается.
      Если положение остановки сильно смещено от центра или не удаётся добиться реверса, то придётся разбирать, искать внутри сервы резистор и крутить(если есть что крутить, могли запаять и постоянные резисторы тогда чуть сложнее)
      Заливаете скетч

      #include <Servo.h> 
       
      Servo myservo;  // создаём объект для контроля сервы 
           
      void setup() 
      { 
        myservo.attach(9);  // серва подключена к 9-му пину
        myservo.write(90); //повернуть на 90гр, в вашем случае остановить вращение.
      } 
        
      void loop() 
      { 
       }

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

    • спасибо работает нормально но всеравно не понимаю как поварачивать на определенное кол-во градусов=(

    • Никак конечно=)
      У вас СonstantКotatingServo — серва постоянного вращения она только вертится с разной скоростью.

      NOTE:ALL 360 degree rotation motors is modified from standard servo, it does not have position control and feedback. The PWM signal is only for controlling the speed of the motor, but the position.

  8. Здравствуйте!
    Для начала исходные данные
    Arduino Mega 2010(ATMega 1280)
    Серво SM3481 от SPRINGRC.
    Подключаю сигнальный на пин 7, землю и питание на GND и Vcc соответственно.
    Питается всё это от USB.

    Суть проблемы:
    Пробую стандартный скетч Sweep из стандартной же библиотеки Servo. В итоге серва просто дёргается как уж на сковородке из стороны в сторону(а должна ведь по ходу проги плавно перемещаться )
    чего за беда ???

  9. Здравствуйте!
    Для начала исходные данные (чтобы было понятно, с чем я всё это пытаюсь провернуть).
    Arduino Mega (ATMega 1280)
    Серво TowerPro MG995
    Подключаю сигнальный на пин 7, землю и питание на GND и Vcc соответственно.
    Питается всё это от USB.

    Суть проблемы:
    Пробую стандартный скетч Sweep из стандартной же библиотеки Servo. В итоге серва не проходит полные 180 градусов, а проходит примерно 150.
    Начал копать дальше. Написал скетч

    #include <Servo.h>
    
    Servo myservo;
    int ms;
    void setup()
    {
      Serial.begin(9600);
      myservo.attach(7);
    }
    
    
    void loop()
    {
      for(ms = 100; ms < 3000; ms += 50)
      {
        myservo.writeMicroseconds(ms);
        Serial.println(ms);
        delay(1000);
      }
    } 

    Из него экспериментальным путём выяснил, что серва откликается в промежутке от 800 до 2200 мкс. Но опять же, проходит она не полные 180 градусов, а те же самые примерно 150.
    При этом, если отключить питание, то вручную вал сервы проворачивается за пределы крайних положений свободно.

    Не знаю куда дальше копать.
    Пробовал и пины менять, и либы. Результат один и тот же.
    Битая серва?

    • Неа, просто они на 180 не поворачиваются.
      Полагаю, что моделистам (для которых сервы и придумали) на 180 и не надо — ни колёса автомодели, ни перо руля судомодели, ни элероны авиамоделей не требуют таких перекладок.
      А нам с вами остаётся либо довольствоваться либо переделывать.
      Переделку в скором времени попробую и опишу.
      Вот разгребусь иии…

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение