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

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

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

В простейших аналоговых сервах, угол задаётся длительностью импульсов идуших с определённой частотой. В более продвинутых — используется протокол 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 (о том какие бывают чем различаются и что внутри)

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

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
+
0
помогите пожалуйста.
не могу настроить серву
у меня arduino uno;
на ней IO SHIELD
а к нему подключен серво на 360 градусов
какой бы скетч не писал, результат один
серво крутится в одну сторону либо безперерывно либо с перерывом через одинаковое время.
что делать???
avatar

Dias

  • 15 марта 2012, 13:20
+
0
что делать???
Назвать марку сервы и привести скетч.
avatar

Zoltberg

  • 15 марта 2012, 13:29
+
0
скетч любой вот например первый из статьи.
а марка серво DFR05SR 360 degree rotation motor (5.5kg)
avatar

Dias

  • 15 марта 2012, 13:34
+
0
точнее марка df robot а модель DFR05SR 360 degree rotation motor (5.5kg)
avatar

Dias

  • 15 марта 2012, 14:17
+
0
Если не реверсируется, но иногда останавливается, то скорей всего это неправильно выставлен ноль.
Уточните — залейте скетч knob из примеров.
Подключите переменный резистор средней ногой к аналоговому пину 0, а крайние ноги (перем. резистора) в 5в и GND соответственно.
Подключите серву, дайте внешнее питание, крутите потенциометр — должна регулироваться скорость и менятся направление, а так же должно быть положение в которм серва останавливается.
Если положение остановки сильно смещено от центра или не удаётся добиться реверса, то придётся разбирать, искать внутри сервы резистор и крутить(если есть что крутить, могли запаять и постоянные резисторы тогда чуть сложнее)
Заливаете скетч
#include <Servo.h> 
 
Servo myservo;  // создаём объект для контроля сервы 
     
void setup() 
{ 
  myservo.attach(9);  // серва подключена к 9-му пину
  myservo.write(90); //повернуть на 90гр, в вашем случае остановить вращение.
} 
  
void loop() 
{ 
 }
подключаете серву со снятым редуктором и вращением переменного/подстроечного резистора добиваетесь остановки двигателя.
avatar

Zoltberg

  • 15 марта 2012, 14:36
+
0
спасибо! будем пробовать.
avatar

Dias

  • 15 марта 2012, 14:40
+
0
спасибо работает нормально но всеравно не понимаю как поварачивать на определенное кол-во градусов=(
avatar

Dias

  • 15 марта 2012, 15:39
+
0
Никак конечно=)
У вас С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.
avatar

Zoltberg

  • 15 марта 2012, 16:06
+
0
спасибо
avatar

Dias

  • 15 марта 2012, 16:17
+
0
Здравствуйте!
Для начала исходные данные (чтобы было понятно, с чем я всё это пытаюсь провернуть).
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.
При этом, если отключить питание, то вручную вал сервы проворачивается за пределы крайних положений свободно.

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

Nauro

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

Zoltberg

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

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

vpirat1969

  • 16 ноября 2012, 02:32
+
0
avatar

Zoltberg

  • 16 ноября 2012, 09:40
+
0
выходит просто питания не хватает? бум пробовать
avatar

vpirat1969

  • 16 ноября 2012, 22:03

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