Серва, рулевая машинка, сервомашинка — кому как больше нравится =)
По сути, это мотор-редуктор, способный поворачивать выходной вал строго в заданное положение (на угол) и удерживать его там, вопреки сопротивлениям и возмущениям недружелюбной среды.
Нужно это было в первую очередь моделистам, для управления положениями закрылков всяких, рулей различных и лопастей вертолётных. Оттуда, из моделизма, и пришло в остальные сферы технического творчества и в робототехнику в частности =)
На “качалку” – пластиковый рычаг(реже металлический), коромысло, диск или крест, с отверстиями для закрепления тяг рулей высоты, глубины, элеронов каких-нибудь или ног робота =)
Чтобы чутко отслеживать имения положения вала и, собственно, воспринимать сигналы управления сервы имеют на борту “электронику”:
Вал с качалкой жёстко связан с движком переменного резистора. Резистор заткнут в схему контроля и сообщает ей своим текущим сопротивлением о текущем положении вала. На схему, в свою очередь, поступают сигналы управления, сообщающие в какое положение нужно повернуть выходной вал (и резистор соотвественно). Схема подаёт питание на моторчик и крутит им всё это дело до куда сказано, там замирает и если что-нибудь сдвинет качалку из нужной точки вернёт её на место, также передвинет её если придёт новая команда.
В простейших аналоговых сервах угол задаётся длительностью импульсов идуших с определённой частотой, в более продвинутых используется протокол 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.
Примечание:
В 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.
Ну и так как придумали их моделисты/для моделистов лучшая статья у них:
(о том какие бывают чем различаются и что внутри)
А у меня серва Hobbiking HK15178 при любых углах поворота (хоть 0, хоть 30, 60, 180, 90) поворачиватся в одну сторону и упирается в упор. В чем причина этого? Заранее спасибо. P.S. поворачивается на угол 180 градусов)
arduino.ru/forum/apparatnye-voprosy/problemy-s-servomashinkoi
Пытался подключит к arduino mega вот такую серву: Hobbiking HK15178. Данная серва имеет ограничение угла в 180 градусов. При включении ее (Черный-Gnd, Желтый-D0(D9),Красный- +6в внешнего питания, Gnd - -6в внешнего питания) и при подаче ЛЮБОГО угла (хоть 0, хоть 90, хоть 180, хоть 30), она поворачивается до упора на 180 градусов. В чем может быть причина?
все сделал как тут написано — не работает(( проверил через порт значенияс потенциометра идут. Подключил к 9 пину — все работает. я что то не так делаю?
Согласен. непонятно))Просто время для экспериментов нахожу только ночью, когда голова уже не работает))
Плата Крафтдуино.
Скетч — последний в этой статье
Потенциометр к 0 пину, серва ко 2. И не какой реакции когда крутил потенциометр. Поменял в скетче 0 пин на 9 и подключил серву к 9 заработало
На 9 пине как раз все работает. а в скетче написано что серву надо подключить ко 2 пину. на нем не работает.
Да библиотека SoftwareServo.
Микроконтроллер 168
Версия ИДЕ 023
Читаю что пишу и сам не понимаю:D
Уважаемые, поможите разобраться=)
С стандартной библиотекой для серв «sweep» некоторые сервы загоняют себя в упор.
Более конкретно: подключал сервы разные и разных производителей (Hitec, Futaba, Hextronic, TowerPro и пару ноунеймов) и размеров, от стандартных до микро, скетч-стандарт. Дело в том, что сервы фирмы TowerPro (конкретно-SG-90, 9 грамм)на данном скетче загоняют себя в упор и пытаются его преодолеть, напрягая шестерни и мотор. Понимаю, что фирма шляпная и высокого качества от их продукции ожидать не стоит. Именно поэтому и хочу использовать именно эти сТервоприводы с Крафтиной, потому что на самолет (даже и маленький) их ставить опасно.
Не могу понять, что с ними? С аппаратурой радиоуправления они работают адекватно, а вот с дуинкой- не хотят(((((
Что я делаю не так?
Не совсем понял проблему.
Если скетч имеется ввиду последний — то возможное решение — ограничить величины углов.
Методом перебора узнать пределы задаваемых углов.
Исправить строку val = map(val, 0, 1023, 0, 179); а именно «0, 179» на найденные углы.
Или с аппаратурой серва поворачивается на угол, на который не поворачивается с Arduino?
Нет, скетч из стандартной библиотеки Servo/sweep. На устанавливаемые углы не реагирует, проверял. Повторю, что такое не с одной отдельно взятой сервой, а с сервами одного производителя.
Вечером попробую скетч, последний из предлагаемых.
Комментарии (23)
RSS свернуть / развернутьpasha-e
MAFia
abbivan
Пытался подключит к arduino mega вот такую серву: Hobbiking HK15178. Данная серва имеет ограничение угла в 180 градусов. При включении ее (Черный-Gnd, Желтый-D0(D9),Красный- +6в внешнего питания, Gnd - -6в внешнего питания) и при подаче ЛЮБОГО угла (хоть 0, хоть 90, хоть 180, хоть 30), она поворачивается до упора на 180 градусов. В чем может быть причина?
MAFia
Скорее всего помер резистор-задатчик положения ( потенциометр внутри сервы)...=(
abbivan
leo
abbivan
Dimuha
Какая плата (какой МК)?
Какой скетч?
Какая схема?
Zoltberg
Плата Крафтдуино.
Скетч — последний в этой статье
Потенциометр к 0 пину, серва ко 2. И не какой реакции когда крутил потенциометр. Поменял в скетче 0 пин на 9 и подключил серву к 9 заработало
Dimuha
Dimuha
Попробуйте на другие пины повешать (кроме 9 и 10 с ними во многих библиолтеках проблемы)
+ещё пара наводящих вопросов=)
То есть библиотека SoftwareServo?
Микроконтроллер у вас какой установлен в Крафтдуино?(8/168/328)
Версия ИДЕ какая?
Zoltberg
Да библиотека SoftwareServo.
Микроконтроллер 168
Версия ИДЕ 023
Читаю что пишу и сам не понимаю:D
Dimuha
Пин-то работает? Светодиодом через него можете поморгать?
Zoltberg
Dimuha
Zoltberg
С стандартной библиотекой для серв «sweep» некоторые сервы загоняют себя в упор.
Более конкретно: подключал сервы разные и разных производителей (Hitec, Futaba, Hextronic, TowerPro и пару ноунеймов) и размеров, от стандартных до микро, скетч-стандарт. Дело в том, что сервы фирмы TowerPro (конкретно-SG-90, 9 грамм)на данном скетче загоняют себя в упор и пытаются его преодолеть, напрягая шестерни и мотор. Понимаю, что фирма шляпная и высокого качества от их продукции ожидать не стоит. Именно поэтому и хочу использовать именно эти сТервоприводы с Крафтиной, потому что на самолет (даже и маленький) их ставить опасно.
Не могу понять, что с ними? С аппаратурой радиоуправления они работают адекватно, а вот с дуинкой- не хотят(((((
Что я делаю не так?
Deich
Если скетч имеется ввиду последний — то возможное решение — ограничить величины углов.
Методом перебора узнать пределы задаваемых углов.
Исправить строку val = map(val, 0, 1023, 0, 179); а именно «0, 179» на найденные углы.
Или с аппаратурой серва поворачивается на угол, на который не поворачивается с Arduino?
sok
Вечером попробую скетч, последний из предлагаемых.
Deich
Deich
Перечитал комменты еще раз и решил перебросить ее с 9-го на 10-й пин и все пошло.
Спасибо откликнувшемуся=)
Deich
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.