Информация к новости
  • Просмотров: 935
  • Автор: sulicompany
  • Дата: 16-02-2013, 05:02
 (голосов: 0)
16-02-2013, 05:02

Сервы

Категория: Электроника » Arduino

 

 


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

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


Примечание:
В 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 —  — удобна одинаковым названием функций с системной библиотекой 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 — 
— библиотека для более ранних версий IDE (в 0017 не подгрузится, т.к. она уже входит в состав IDE под именем Servo :) — позволяет контролировать до 12 серв

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

Далее: 


По теме:


Cсылки:

 — статья ДиХальта – на примере сервомашинки HS-311.
Ну и так как придумали их моделисты/для моделистов лучшая статья у них:
 (о том какие бывают чем различаются и что внутри)

Сервы 2. Взгляд под корпус

  •   
Рассмотрим чуть подробнее особенности и различия  на примере моделей представленных в .

Корпус сервы состоит из трёх частей – верхней крышки, средней части и нижней крышки



Стянуто всё это хозяйство четырьмя длинными шурупами. 
Под верхней крышкой прячется редуктор. Шестерёнок 4 шт, (3 из них сдвоенные), говорят бывает до 6. В зависимости от момента развиваемого сервой шестерни делают металлическими (латунь и сплавы аллюминия) или пластиковыми (нейлон). 

На выходной шестерне расположен стопор ограничиваюший угол поворота,

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

у моделей попроще только сверху, (снизу — на вал резистора)

а у совсем простых моделей и сверху крутится в подшипнике скольжения, образованном приливом корпуса. 

Соединение выходного вала редуктора с качалкой – шлицевое. Также в валу есть отверстие с резьбой для закрепления качалки винтом или шурупом.

В средней части корпуса закреплён клеем или шурупами двигатель и резистор

Двигатель обычно коллекторный, постоянного тока. А в хай-энд сервах ставят безинерционные моторчики с полым ротором – точность и динамика их от этого безмерно выигрывают. 
Резистор в мелких сервах специализированный – безкорпусный с длинным валом. На валу свободно вращается сдвоенная шестерня 2-3 ступени редуктора а на конец жёстко, с натягом посажено выходное зубчатое колесо.

А в мощных вал резистора соединён с колесом через эластичный элемент, чтобы снизить негативное влияние вибраций на нежную резистивную дорожку.

По бокам корпуса расположены уши-лапы для крепления машинки в корпусе модели/робота. Мелкие крепятся двумя шурупами, крупные – четырьмя, и через специальные резиновые демпферы с латунными гильзами для защиты от вибрации.

Под нижней крышкой скрывается электроника. У простых машинок она аналоговая и часто сильно интегрированная – в одну специализированную микросхему упрятано всё вплоть до силовых ключей. 

Ну, а крутые сервы – цифровые=) В целом это означает, что на плате установлен микроконтроллер. Работают такие машинки быстрее, точнее и сильнее, а то и вообще позволяют настраивать свои параметры под конкретные нужды.
Можно попробовать хакнуть прошивку и модифицировать как-нибудь в положительную сторону=) 



А вот, кстати, ребята с  предлагают вообще выкинуть родную электронику и поставить их плату с Atmega8 на борту (можно у них купить или собрать самостоятельно — вся документация открытая). Связь с “главным мозгом” осуществляется уже не импульсами различной ширины, а по протоколу I2C. Данные идут уже в обе стороны т.е. можно не только скомандовать серве что делать, но и узнать как она это делает в данный конкретный момент (положение, скорость, ток, усилие).

Важнейшими характеристиками серв являются момент и скорость поворота. Кстати, параметры эти взаимообратные для серв построенных на базе одинаковых двигателей – чем больше момент, тем меньше скорость (тем медленнее вертится серва).
Со скоростью вроде всё должно быть понятно – обычно указывают время поворота вала на угол 60 градусов (часто при разном напряжении питания). 
А вот что такое момент не все знают, а ведь школьный курс между прочим =)
Если на пальцах — то цифирька указанная в характеристиках сервы (в кг/см) говорит о том, что серва поднимет и удержит этот вес при длине рычага 1см. 

Т.е находим на качалке дырочку стоящую в 1см от оси и суём туда тягу — вот здесь будет усилие указанное в характеристиках. Рычаг 0,5см – усилие в 2а раза больше, 2см – в 2 раза меньше.

По теме:


Сервы - продолжаем заглядывать под корпус (SG-5010)

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

SG-5010 это самая, что ни на есть стандартная серва, по размерам почти один в один с SG995.

Внутри у неё наблюдаем пластмассовые шестерни, ну и всё остальное, что положено для серв.

Выходная шестерня снабжена стопором и вертится в двух подшипниках

С валом резистора соединяется через гибкий элемент.

Плата управления — аналоговая, на базе спецмикросхемы и транзисторов 

Кстати, плата припаянна к выводам мотора и потенциометра обратной связи, так что полная разборка сервы несколько усложняется.

Зато никаких неэстетичных проводов внутри корпуса — всё строго, аккуратно и на длинных ногах

Комплектация сервы богата качалками различных форм.

Особое место среди которых занимает колесо без дырок, 

видимо производитель предлагает самостоятельно провертеть их именно там, где нам надо — полная свобода — никаких стандартно расположенных отверстий. Наверно это удобно иногда.
У нас же с вами (в отличии от моделистов) могут возникнуть другие планы на этот округлый предмет=)
Но об этом в следующий .

Подключение сервомашинок к Arduino

  •   
Решил я как-то сделать .
Правда, без обратной связи — просто серва и всё.
Код управления можно брать прямо из примеров к библиотеке  — скетч Sweep
#include <Servo.h> 
 
Servo myservo;  // объект для управления сервомашинкой
 
int pos = 0;    // для хранения позиции
 
void setup()
{
  myservo
.attach(7);  // управляющий провод сервы подключён к 7 порту
}
 
 
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)     // и назад
 
{                                
    myservo
.write(pos);              //
    delay
(15);                       //
 
}
}

В этом скетче, остаётся только подправить начальный и конечный градусы поворотов и всё :)

Остаётся вопрос с подключением  к контроллеру. Можно запитать сервомашинку и напрямую, но если серва мощная, то стабилизатор питания контроллера будет очень сильно греться и может сгореть.
Выход может быть только один — использовать для питания сервомашинки отдельный регулятор напряжения.
Оказалось, что у меня уже есть подходящий кандидат — (+5В 1.5А)
правда, он тоже греется, но я прикрутил к нему небольшой радиатор (металлическая пластина и болтик с гайкой из детского конструктора :)

Подключение этого регулятора просто, как две копейки:

1 — левая нога — вход (к питанию ), 
3 — центральная — земля,
2 — правая — выход (наши +5V для питания сервомашинки)
( по  рекомендуется также подключать парочку конденсаторов)

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

Остаётся вопрос — как подключить к плате сервомашинку?
Очень просто — нужно использовать пины!
Откусываем 3 (4 или лучше — 5 пинов) от гребёнки и аккуратно вдавливаем три пина, как показано на фотографии:


— лучше использовать 5 пинов, так как крайние пины обеспечивают более надёжную посадку.


Вуаля — можно втыкать разъём  прямо в плату!

Читать по теме:


Хаки сервомашинок. Переделка в серву постоянного вращения

  •   
После долгих и многократных обещаний себе и всем окружающим, я наконец расскажу как модернизировать  и превратить её в убермоторчик.
Достоинства очевидны — мотор редуктор, который можно подключать напрямую к МК без всяких драйверов это круто!
А если серва с подшипниками, да ещё и шестерни металлические, это ваащеее=) 

Отмазки
Некоторые действия по переделке серв необратимы и иначе как вандализмом их назвать нельзя.
Всё что далее описывается вы можете повторять, но на свой страх и риск. Если в результате ваших действий безвозвратно погибнет ваша топовая футаба-брендовая, титан-карботовая, суперинтеллектуальная, безынерционная, ручной работы серва за стопицот денег — мы тут совершенно не причём ;) 
Так же обратите внимание — шестерни сервы довольно густо обмазаны смазкой — не стоит разбирать их в белоснежной сорочке и на бархатном диване.

Так, запугали, теперь, для успокоения, немного теории=)
Серва, как мы , управляется импульсами переменной ширины — они задают угол на который должен повернутся выходной вал (скажем, самые узкие — до упора влево, самые широкие — до упора вправо). Текущее положение вала считывается мозгами сервы с потенциометра, который своим движком связан с выходным валом.
Причём, чем больше разница текущего и заданного углов, тем с большей скоростью вал рванёт в нужную сторону.
Вот именно в этом месте и зарыто многообразие возможных вариантов переделки.
Если мы «введём серву в заблуждение»=) — рассоеденим потенциометр и вал, и заставим считать, что движок потенциометра находится в средней точке, то сможем управлять скоростью и направлением вращения. И всего по одному сигнальному проводу!
Теперь импульсы соответствующие среднему положению выходного вала — это нулевая скорость, чем шире (от «нулевой» ширины) тем быстрее вращение вправо, чем уже (от «нулевой» ширины) тем быстрее вращение влево.

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

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


И снимаем выходную шестерню


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


самая первая мысль, которая приходит в голову — убрать гибкий элемент(муфту) оставив вал резистора в среднем положении. Попробуем.
Для этого накатаем «калибровочный» скетч (ставящий качалку «обычной» сервы в среднее положение)
#include <Servo.h> 

Servo myservo;  // создаём объект servo
void setup()
{
  myservo
.attach(9);  // серву на 9 ногу
  myservo
.write(90);  // и повернуть в среднее положение
}
 
void loop()
{
//тупим в  вечной петле                  
}
и подключим к ардуине нашу вскрытую машинку. 
Так как резистор у нас не в среднем положении — серва начинает весело крутиться (иногда разбрасывая смазку=).

Вращаем резистор и добиваемся не просто остановки, но полной тишины (чтоб не жужжало и не гудело нечего внутри) Кстати, сделать это не слишком просто — довольно тонкая настройка. Отсюда и первый очевидный минус этого решения — ударили/встряхнули подогрели/остудили уже собранную серву — нулевая точка вполне может уползти. Конечно, можно зафиксировать вал клеем…

Обратите внимание на подключение мощных серв (типа MG995) — чтобы избежать перегрузок (и резета) при старте, рекомендую плату питать от внешнего источника (не USB) и повесить прям на разъём электролитический конденсатор ~100мкф:

Далее вытаскиваем гибкий элемент вместе с нижним подшипником


В случае с MG995, чуть сложнее, сидит там всё плотно — приходится выбивать через сквозное отверстие в выходном валу — замечательно подходит винт от корпуса. Гибкий элемент довольно твёрд=) и при такой операции не страдает.


муфту в сторону, подшипник на место


Теперь время вандализма! Необходимо удалить стопор, который упирается в приливы внутри корпуса и не даёт шестерне проворачиваться.


С MG995 не такой уж это и вандализм — если поднатужится то стопорный штифт можно просто вынуть, а потом соответственно безболезненно вставить его на место — полностью восстановив первоначальный функционал сервы.


собираем всё на место, заливаем в дуину стандартный пример knob, крутим смотрим, радуемся.



Тут зарыт второй недостаток такой мягкой переделки — если нулевая точка несмотря на приклеенный резистор всё же уползла, или её приспичит сместить — придётся всё разбирать=(
Поэтому более грамотный метод — замена потенциометра подстроечником.
Можно, выкрутив винт и отогнув защёлки, вынуть потенциометр

а вместо него впаять подстрочный резистор на те же 5Ком

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

Вроде и так не плохо вышло=)
Выламываем защёлку потенциометра — в неё упирался подстроечник и сверлим корпус сервы для доступа к его движку 

Теперь осталось настроить нулевую точку калибровочным скетчем, и можно пользоваться=) 
Если не хочется ничего подстраивать, приклеивать и дырявить корпус можно потенциометр заменить двумя постоянными резисторами по 2-2.2Ком — они будут изображать из себя левое и правое «плечо» потенциометра. 

если можете найти/припаять SMD — вообще красиво будет:

Но тогда в точку покоя вы можете и не попасть(из-за разброса значений сопротивлений резисторов плечи выйдут не равными)- у меня на калибровочном скетче с выводными жужжала, с SMD потихоньку вертелась — подстройка в ноль только программно и индивидуально.
Тем не менее именно такой способ наиболее применим для мелких серв.
Продемонстрируем на примере :
Разбираем

Стягиваем выходную шестерню — она туго сидит на латунном валу потенциометра

Снимаем остальные шестерни, чтоб добраться до потенциометра

Хорошо видно, что выходная шестерня сидит на валу потенциометра за счёт чёрной пластмассовой втулки, её же выступ является стопором. 
Тут возможны два варианта: либо ломать потенциометр — убирать ограничители(и бегунок) так, чтобы его вал свободно вращался по кругу, либо нужно обточить(надфилем, шкуркой)его вал так, чтобы выходная шестерня свободно вращалась на нём.
Второй вариант выглядит более привлекательным — ломать не надо, серву при желании можно восстановить зафиксировав шестерню на валу клеем (или просто облудив с наплывом вал потенциометра). Однако точить пришлось долго — пластиковая втулка очень плотно обжимает вал — если не доточить — цепляется, повизгивает и
и неравномерно вращается — чуть переточишь — начинает болтаться и опять же шуметь. Можно конечно рассверлить втулку… В любом случае для такой переделки точность и аккуратность нужны повышенные да и повторяемость низкая, короче не понравилось. Фоток данного варианта не делал, ИМХО тут и так всё понятно. 
Будем ломать.
Сначала подцепить отвёрткой уши ограничителя и бегунок

Потом кусачками откусить/загнуть чтобы не мешались — вот тут действительно вандализм=)

Должно получиться, например, так:

Срезаем стопор с пластиковой втулки

Тут есть один момент — втулка заходит на зубья и при вращении зубья ведущей шестерни будут упираться — можно подрезать впадины лезвием — так по веселее приработается=)

Редуктор теперь можно собрать, займёмся электроникой.
Снимаем нижнюю крышку, вытаскиваем плату:

Наблюдаем провода к потенциометру — он у нас уже уничтожен, провода ему больше не нужны, отпаиваем/откусываем

А вместо них к плате паяем пару резисторов на 2.2Ком вот таким манером

куском изоленты прикроем микросхему во избежании

И запихнём всё на место

Закручиваем, запускаем, радуемся


Все эти переделки имеют пару недостатков: 
Во-первых — сложность установки нулевой точки — требуется тонкая настройка 
Во-вторых очень узкий диапазон регулировки — довольно малое изменение ширины импульса вызывает довольно большое изменение скорости(см видео). 
Диапазон можно расширить программно — просто надо иметь ввиду, что диапазон регулировки ширины импульсов (от полного хода по часовой до полного хода против часовой стрелки) переделанной сервы соответствует 80-140 градусам (в AduinoIDE, библиотека Servo).
например в скетче knob достаточно поменять строчку:
val = map(val, 0, 1023, 0, 179);
на 
val = map(val, 0, 1023, 80, 140);
и всё становится значительно веселее=)
А про загрубление средней точки и другие паятельные переделки я расскажу в следующий раз.

По теме: