Сервопривод - что это такое? Устройство, подключение, принцип работы, назначение

Учимся управлять сервомотором с использованием Arduino.

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

Необходимые узлы

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

1 переменный резистор (потенциометр) на 10 кОм



1 микроконтроллер Arduino Uno



1 конденсатор на 100 мкФ (не обязательно)


Схема подключения для "Sweep" (автоматическое вращение)

Для этого эксперимента вам надо подключить к Arduino только сервомотор.


На сервомоторе 3 контакта. Цвет контактов может отличаться в зависимости от фирмы производителя, но красный - это всегда контакт 5 В. Контакт GND (земля) может быть черным или коричневым. Оставшийся третий контакт - это сигнал, который используется для управления положением ротора сервы. Обычно он желтого или желтого цветов. Этот контакт мы подключаем к цифровому пину 9 на Arduino.

На контактах сервы предусмотрены разъемы, в которые можно установить коннекторы (провода) и соединить из макетной платой, а потом с Arduino.


Серводвигатель дергается

Иногда при подключении сервы не отрабатывают заданные команды или отрабатывают некорректно. Причем происходить это может только при подключении к определенным USB портам. Причина в том, что сервы требуют достаточно большую мощность для питания, особенно в начале движения ротора. Эти резкие скачки потребляемой мощности могут сильно "просаживать" напряжение на Arduino. Может произойти даже перезагрузка платы.

Если подобное происходит, вам надо добавить конденсатор (470 мкФ или больше) между рельсами GND и 5V на вашей макетке.


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

Длинная нога конденсатора - это позитивный контакт, она подключается к 5V. Отрицательный контакт часто маркируется символом "-".

Скетч Arduino "Sweep" (автоматическое вращение)

Загрузите на Arduino скетч, который рассмотрен ниже. После загрузки ротор сервы должен начать вращаться в одном направлении, а потом в противоположном.

Программа основана на стандартном скетче "sweep", который вы можете найти в меню Arduino Examples в папке "servo".

#include <Servo.h>

int servoPin = 9;

int angle = 0; // угол сервы в градусах

servo.attach(servoPin);

// инкремент от 0 до 180 градусов

for(angle = 0; angle < 180; angle++)

servo.write(angle);

// теперь в обратном направлении от 180 до 0 градусов

for(angle = 180; angle > 0; angle--)

servo.write(angle);

Сервомоторы управляются серией импульсов. Для того, чтобы упростить управление сервами, написана специальная библиотека (Arduino library). С помощью этой библиотеки вы можете управлять сервой, задавая фактический угол поворота вала на выходе.

Управляющие команды для серв подобны встроенным в Arduino, но так как вы используете их далеко не во всех проектах, они хранятся в отдельной библиотеке. Если вы хотите использовать команды из библиотеки для серводвигателей, вам надо включить библиотеку в ваш скетч в Arduino IDE с помощью следующей строки:

#include <Servo.h>

Используем переменную "servoPin" для определения порта, который управляет сервой.

Следующая строка:

инициализирует новую переменную "servo" типа "Servo". Библиотека предоставляет нам новый тип данных наподобие "int" или "float", который отвечает за серву. Таким образом вы можете инициализировать восемь серводвигателей. Например, если у нас две сервы, можно записать следующее:

В теле функции "setup" мы должны согласовать переменную "servo" с пином, который будет управлять серводвигателем, используя команду:

servo.attach(servoPin);

Переменная "angle" используется для указания текущего угла поворота сервы в градусах. В теле функции "loop" мы используем используем два цикла "for". Один - для увеличения угла поворота в одном направлении и второй - для возврата, когда мы совершили поворот на 180 градусов.

servo.write(angle);

Сообщает серве, что надо обновить угол поворота выходного вала сервомотора в соответствии с углом, который указан в качестве параметра.

Схема подключения сервы с потенциометром ("Knob")

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

Надо просто добавить на макетную плату потенциометр и проводник от контакта сигнала с потенциометра на пин A0 на Arduino.


Скетч Arduino "Knob" (управление сервой с помошью потенциометра)

Программа, в которой положение выходного вала сервы контролируется углом поворота ручки потенциометра даже проще, чем рассмотренный ранее автоматический поворот и возврат в исходное положение.

#include <Servo.h>

int servoPin = 9;

servo.attach(servoPin);

int reading = analogRead(potPin); // от 0 до 1023

int angle = reading / 6; // от 0 до 180

servo.write(angle);

В скетче добавлена переменная с именем "potPin".

Для того, чтобы вывести вал сервы в положение, мы считываем значение с контакта Arduino A0. Значение с этого контакта будет находится в диапазоне между 0 и 1023. Так как серва может поворачиваться только на 180 градусов, нам надо масштабировать полученные значения. Разделив значения с контакта A0 на 6 мы получаем угол в диапазоне от 0 до 170, что нас вполне устраивает.

Сервомоторы - общая информация

Сервомоторы - один из типов двигателей , коотрые часто используются в робототехнике, мехатронных проектах, проектах на Arduino.

Положение выходного вала сервомотора определяется длиной импульса. Серва может получать импульсы каждые 20 миллисекунд. Если импульс high длится 1 миллисекунду, угол поворота сервы будет равен нулю. Если 1.5 миллисекунды, тогда серва выйдет в свое центральное положение, а если 2 миллисекунды - выйдет в положение, которое соответствует 180 градусам.


Крайние положения сервомоторов могут отличаться. Кроме того, многие сервы могут поворачиваться на 170 градусов. Есть и "continuous" сервы, которые совершают оборот на полные 360 градусов.

Внутри сервы

На видео, которое приведено ниже, показано, что происходит внутри сервомотора.

Будьте аккуратны. Если вы разберете серву подобным образом, есть вероятность, что собрать обратно ее не получится.

Дальнейшие эксперименты с сервой и Arduino

Откройте скетч "sweep" и попробуйте сократить задержки с 15 миллисекунд до, скажем, 5 миллисекунд. Обратите внимание, насколько быстрее начали вращаться сервы.

Попробуйте изменить скетч "knob". Вместо того, чтобы ориентироваться на значения с потенциометра, реализуйте управление сервой с помощью значений, которые вы указываете в окне серийного моитора Arduino IDE.

Небольшая подсказка: для того, чтоьы скетч считывал значения угла с серийного монитора, вы можете использовать функцию Serial.parseInt(). Эта функция парсит (считывает) числовые значения с серийного монитора.

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

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

Обычно сервоприводы не расчитаны на полный оборот, вал может поворачиваться на ограниченный угол (чащевсего 180 градусов). Этого вполне достаточно, чтобы управлять рулевыми колесами или магипулятором. Поэтому и примеяют сервоприводы чаще всего для шарниров. Основным показателем мощности сервопривода является крутящий момент, обычно выражается в кг⋅см. Для длинных манипуляторов, которые должны подымать приличный вес, уже потребуются сервоприводы с крутящим моментом 30-40 кг⋅см и больше. Если же мы хотим с помощью нашего сервопривода совершать не очень тяжелую работу, то вполне достаточно самых простейших, на 1,8 или 3,2 кг⋅см.

Вообще, крутящий момент выражается в Н⋅м. Но для большей простоты вычислений его часто приводят к в кг⋅см (1 кг⋅см ~ 0.01 кг⋅м ~ 0.098 Н⋅м) Это усилие, которое может обеспечить сервопривод на определенном расстоянии от оси вращения. Т.е, например сервопривод с моментом 4 кг⋅см может поднять груз в 4 кг, в 1см от оси, или 400 грамм, но уже на расстоянии 10 см от оси. Если мы хоти сделать манипулятор, то нужно прикинуть вес движущихся частей и подбирать соответствующие сервоприводы для каждого сустава.

Подключается сервопривод с помощью трех проводов – стандартной пары из питания и заземления и одного управляющего. Для маломощных сервоприводов все три можно подключать к контроллеру напрямую. Но если мы используем много сервоприводов или несколько, но мощных, то возможностей контоллера будет уже не хватать. Нужно подключать к контроллеру только управляющий вывод, а питание на остальные подавать независимо.

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

Запитываем сервопривод от пина “5V” (красный провод), землю подключаем к пину “Gnd” (черный провод). Управление (белый провод) можно подключить к любому из свободных выходов, например к пину номер 2 (выходов контроллера 0 и 1 используются для связи по последовательному интерфейсу, поэтому использовать их не рекомендуется)

Для управления сервоприводом используется стандартынй класс Servo . Нам требуется процедура attach() , которая служит для инициализации сервопривода и write() , для управления его движением:

#include // Подключаем библиотеку для работы с сервоприводом

servo1.write(90); // Даем команду сервоприводу принять положение в 90 градусов,которое соответствует среднему положению

При запуске нашей программы подключнный сервопривод примет положение в 90 градусов. Если он уже в нем, то ничего не произойдет. Попробуем плавно поменять положение от минимального к максимальному:

Servo servo1; // Создаем один объект типа «сервопривод»

int angle = 0; // Переменная,в которой хранится положение сервопривода

servo1.attach(2); // Объясняем контроллеру, что управляющий провод сервопривода подключен к пину 2

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

Многие сервоприводы могут быть подключены к Arduino напрямую. Для этого от них идет шлейф из трех проводов:

красный – питание подключается к контакту 5V или непосредственно к источнику питания
коричневый или черный земля (GND контакт Arduino)
желтый или белый сигнал; подключается к цифровому выходу Arduino.

Можно генерировать управляющие импульсы самостоятельно, но это настолько распространенная задача, что для ее упрощения существует стандартная библиотека Servo ( ).
Детальнее о библиотеке
Сама библиотека также

Ограничения по питанию

Обычный хобби-сервопривод при работе потребляет более 100 мА. При этом Arduino способно выдавать до 500 мА. Поэтому, если вам в проекте необходимо использовать несколько сервоприводов, есть смысл задуматься о выделении сервоприводов в контур с дополнительным питанием.

Ограничения по количеству подключенных сервоприводов

На большинстве плат Arduino библиотека Servo поддерживает управление не более 12 сервоприводами, на Arduino Mega это число возрастает до значения 48. При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию analogWrite () на 9 і 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет. На Arduino Mega можно подключить до 12 сервоприводов без нарушения функционирования ШИМ/PWM, при использовании большего количества сервоприводов мы не сможем использовать analogWrite () на 11 и 12 контактах.

Функции библиотеки Servo

Библиотека Servo позволяет осуществлять программное управление сервоприводами. Для этого создается обьект servo класса Servo. Управление осуществляется следующими функциями:

attach () – закрепляет привод с конкретным пином. Возможны два варианта синтаксиса для этой функции: servo.attach (pin) і servo.attach (pin, min, max) . При этом pin – номер пина, к которому присоединяют сервопривод, min и max – длины импульсов в микросекундах, отвечающие за углы поворота 0 ° и 180 °. По умолчанию выставляются равными 544 мкс и 2400 мкс соответственно.
write () – отдает команду сервоприводу принять некоторое значение параметра. Синтаксис следующий: servo.write (angle) , где angle – угол, на который должен обернуться сервопривод.
writeMicroseconds () – отдает команду отправить на сервопривод импульс определенной длины, является низкоуровневым аналогом предыдущей команды. Синтаксис следующий: servo.writeMicroseconds (uS) , где uS – длина импульса в микросекундах.
read () – читает текущее значение угла, в котором находится сервопривод. Синтаксис следующий: servo.read () , возвращается целое значение от 0 до 180.
attached () – проверка, был присоединен объект к конкретному пину. Синтаксис следующий:servo.attached () , логическая единица возвращается, если объект был присоединен к какому-либо пену, или ноль в противном случае.
detach () – выполняет действие, обратное действию attach () , т.е. отсоединяет объект от пина, к которому он был приписан. Синтаксис следующий: servo.detach () .

Для управления изменением положения сервопривода можно использовать потенциометр. Он имеет три контакта подключаемые следующим образом:
Два крайних контакты (как правило) это питание и земля, а средний – информационный. Подсоединяем питания потенциометра –> 5 V Arduino, земля –> GND Arduino, информационный –> аналоговый пин Arduino.
Вот так может выглядеть схема:

А так примитивная программа:

#include Servo myservo; // create servo object to control a servo int potpin = 0; // analog pin used to connect the potentiometer int val; // variable to read the value from the analog pin void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023) val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180) myservo.write(val); // sets the servo position according to the scaled value delay(15); // waits for the servo to get there }

#include

Servo myservo ; // create servo object to control a servo

int potpin = 0 ; // analog pin used to connect the potentiometer

int val ; // variable to read the value from the analog pin

Servoдвигатели - это тип электромеханических приводов, которые не вращаются постоянно,как DC / AC или шаговый двигателей, а перемещаются в определенное положение исохраняют его. Они применяются там, где не требуется непрерывное вращение. Серво приводы применяют там, где необходимоперейти к конкретной позиции,а затем остановиться и сохранять положение .Наиболеечасто серво двигатели используются для управлением положением руля воздушныхсудов и лодок т.д. Сервоприводы эффективно используются в этих областях, потомучто руль не нужно перемещать на 360 градусов и не требуют непрерывного вращениякак например колеса. В с ервоприводахтакже используется механизм обратной связи, поэтому он может обрабатыватьошибки и при позиционировании их исправить. Такая система называется следящей . Такимобразом, если поток воздуха оказывает давление на руль и отклоняет его, тосервопривод будет применять силу в противоположном направлении и попытаетсяисправить ошибку.Например, есливы скажете серво пойти и заблокироваться на 30 градусах, а затем попытаетесь повернутьего рукой, серво будут стараться, чтобы преодолеть силу и сохранить заданныйугол.

Сервоприводыприменяются также для контроля руля RC- автомобилей, робототехники и т.д. Существует много видов сервоприводов, но здесь мы сосредоточимсяна малых сервоприводы так называемых hobby . H obb y двигатель и его механизм управления встроен в один блок. Подключение осуществляеться спомощью трех присоединительных проводов . Мы будем использовать сервопривод FutabaS3003 .

FutabaS3003 проводки.

1.RED -> Управление позицией,питание +4.8В до 6В

2.BLACK-> Земля

3.WHITE -> Сигнал управления.

Управление Сервоприводом.

Управлятьсервоприводом легко с помощью микроконтроллера,не нужно никаких внешнихдрайверов.Просто подаваяуправляющий сигнал сервопривод будет позиционировать на любойзаданный угол.Частота управляющего сигнала обычно 50hz (т.е.период 20 мс), а длительность импульса задает величину угла.

Для FutabaS3003 яузнал следующие синхронизацию .Соотношение между шириной импульса иуглом поворота сервопривода, приводится ниже.Заметим,что этот сервопривод способен вращаться только между 0 и 180 градусов.

  • 0.388ms= 0 градусов.
  • 1.264ms= 90 градусов.
  • (Нейтральнаяпозиция) 2.14ms= 180 градусов.

Управление Серво двигателем.

Вы можете использовать микроконтроллер AVR с функцией PWM дляуправления сервомоторов. Таким образом, PWM автоматически сгенерирует сигналыблокировки сервопривода и центральный процессор контролера освободится длядругих задач. Чтобы понять, как можно настроить и использовать PWM необходимоиметь базовые знания аппаратных таймеров и PWM модулей в AVR.

Здесь мы будемиспользовать AVR Timer модуль, который является 16bit таймером и имеет два канала PWM (А и B).

Частота центрального процессора составляет 16 МГц,эта частота - максимальная частота,на которой большинство AVR способны работать.Так же будем использовать делитель частоты на 64. Так таймера получат 16MHz/64 =250khz (4 мкс).Таймер установим в режим 14.

Функциитаймера в режими 14

  • РежимFAST PWM
  • T T OP Значение = ICR1

Такимобразом, мы устанавливаемICR1A = 4999,это дает нам PWM периода 20мс (50 Гц).Убедитесь что в режими выводаустанавленны правильные настройки COM1A1, COM1A0 (для PWM канала) и COM1B1,COM1B0 (для PWM канал B)

COM1A1= 1 и COM1A0 = 0 (PWM Источник)

COM1B1= 1 и COM1B0 = 0 (PWM канал B)

Теперь рабочий цикл может быть установлен путем настройки OCR1A иOCR1B регистров.Эти два регистрауправления PWM периодом Так как период таймера 4мкс (помните 16 МГц разделили на 64), Мы можем вычислить значения, необходимые для поворотасервопривод на определенный угол.

§ Servoугол 0 градусов требуется ширина импульса 0.388ms (388uS), поэтому значениеOCR1A = 388us/4us = 97

§ Servoугол 90 градусов требуется ширина импульса 1.264ms (1264uS), поэтому значениеOCR1A = 1264us/4us = 316

§ Servoугол 180 градусов требуется ширина импульса 2.140ms (2140uS), поэтому значениеOCR1A = 2140us/4us = 535

Такимобразом, мы можете вычислить значение OCR1A (или OCR1B для второгосервопривода) для любого угла.Заметимчтозначение OCR1x колеблются от 97 до535 для углов от 0 до 180 градусов.

Программа управления двигателем.

Демонстрационнаяпрограмма приведена ниже, показано, как использовать сервомоторов смикроконтроллером AVR. Работы программы очень проста, она начинается синициализации таймера и PWM.В начале фиксируеться сервопривод на 0 градусов, азатем перемещается на 90 градусов и подождатв некоторое время перемещается на135 градусов, и наконец, на 180градусов. Этот процесс повторяется до тех пор, пока привод подключен к питанию.

Параметрыдля правильной работы программы .

  • LOW Fuse = 0xFF и HIGH Fuse = 0xC9
  • Частота= 16 МГц.
  • СервомоторклеймоFutaba S3003 .
  • MCUявляется AtMega32 или однокристальный микроконтроллер ATmega16.

Схема

ПРИЛОЖЕНИЯ:

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

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

Используемые компоненты (купить в Китае):

. Управляющая плата

. Соединительные провода

Полезная вещь для проверки сервориводов

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

Управляющий сигнал представляет из себя импульсы с нужной нам шириной, которые посылаются с определенной частотой. Для рассматриваемых нами сервоприводов частота посылания импульса почти всегда будет около 50 Гц (это примерно 1 раз в 20мс), а ширина импульса будет лежать в пределе от 544мкс до 2400мкс.

Как видно из картинке, импульс шириной в 544мкс выставит выводной вал в положение 0°, 1520мск соответствует углу в 90°, а 2400мкс соответствует 180°.

Изменяя ширину импульсов в данных пределах мы сможем точно задавать угол поворота выводного вала, но об этом чуть позже. На данном этапе статьи хочется рассказать о том как подключить сервопривод к Arduino.

Для подключения к контроллеру от сервопривода тянется 3 провода обжатых стандартным 3 пиновым разъемом с шагом 2.54мм. Цвета проводов могут варьироваться. Коричневый или черный - земля (GND), красный - плюс источника питания (VTG), оранжевый или белый - управляющий сигнал (SIG).

Подключение сервоприводов к Arduino

У старых Ардуин, укомплектованных мегой 8, имеется всего три ШИМ вывода (digital 9,10,11), у Ардуин укомплектованных мегой 168 или 328 их 6 (digital 3,5,6,9,10,11). Семейство Arduino MEGA имеет на своем борту целых 14 ШИМ выводов.

Купить в России




Top