Подключение сервопривода к Ардуино

Подключение сервопривода к Ардуино

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

Рассмотрим на этом занятии устройство и принцип работы сервоприводов. Разберем два простых скетча для управления сервоприводом с помощью потенциометра на Ардуино. Также мы узнаем новые команды в языке программирования C++ — servo.write, servo.read, servo.attach и научимся подключать в скетчах библиотеку для управления сервоприводами и другими устройствами через Ардуино.

Как это работает

Сервоприводы Arduino — это умные устройства. Используя только один входной пин, они получают значения для позиционирования от микроконтроллера и переходят в это положение. Как можно увидеть на рисунке в самом начале статьи внутри они имеют двигатель и цепь обратной связи, которая гарантирует, что вал/рычаг сервопривода достигнет желаемого положения.

Но какой сигнал сервомоторы получают на входе? Это прямоугольная волна, подобная PWM (англ. — pulse-width modulation, широтно-импульсная модуляция). Каждый цикл в сигнале длится 20 миллисекунд, и большая часть времени в значении LOW. В начале каждого цикла значение сигнала становится HIGH на время от 1 до 2 миллисекунд.

При 1 миллисекунде она составляет 0 градусов, а при 2 миллисекундах — 180 градусов, а в промежутке значение от 0 до 180. Это очень хороший и надежный метод. График выше упрощает понимание.

ДОКУМЕНТАЦИЯ

Документация

Данная библиотека является “дополнением” к стандартной библиотеке Servo.h и позволяет плавно управлять сервоприводом. Суть работы кроется в методе tick() , который нужно вызывать постоянно в loop (или прерывании таймера), внутри тика находится алгоритм с собственным таймером, который по чуть чуть поворачивает серво к нужному положению. Библиотека дублирует несколько методов из Servo.h (attach имеет расширенную инициализацию):

  • write() и writeMicroseconds() – повернут вал серво с максимальной скоростью
  • attach() и detach() – подключить и отключить серво от управления

Инициализация

Объект создаётся точно так же, как в Servo.h, без параметров. Также можно передать рабочий угол серво (если не передавать, будет равен стандартному 180 град.)

По инициализации attach() есть несколько вариантов:

  • attach(pin); – подключит серво на указанный pin , угол поворота будет установлен на градусов. Длина импульса* мин-макс будет стандартная, 500-2400 мкс
  • attach(pin, target); – подключит серво на указанный pin , угол поворота** будет установлен на target градусов. Длина импульса* мин-макс будет стандартная, 500-2400 мкс
  • attach(pin, min, max); – подключит серво на указанный pin , угол поворота будет установлен на градусов. Длина импульса* будет установлена min и max соответственно.
  • attach(pin, min, max, target); – подключит серво на указанный pin , угол поворота будет установлен на target градусов. Длина импульса* будет установлена min и max соответственно.

*Длина импульса – сервопривод управляется ШИМ сигналом, в котором длина импульса прямо управляет углом поворота, то есть подавая минимальную и максимальную длину мы получаем рабочий угол 180 градусов. По умолчанию мин. и макс. длина установлены 500 и 2400 соответственно, что подходит большинству сервоприводов, но желательно посмотреть и “откалибровать” свой привод так, чтобы он работал на все 180 градусов. Мин. и макс. время импульса отличаются у разных производителей и моделей серво.

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

Плавный пуск ( new! )

Сервопривод не имеет обратной связи по углу (для программы), поэтому при запуске будет “резко” повёрнут на стартовый угол (“в ноль” по умолчанию или на указанный в attach(pin, target) . Есть два варианта избежать резких рывков в механизме при запуске программы:

  • Заранее знать, на какой угол физически повёрнут привод при запуске и передать его в attach(pin, target) . Как узнать? Зависит от конкретной задачи и логики работы программы. Можно запоминать положение сервы в ЕЕПРОМ и восстанавливать при запуске, можно устанавливать серво в один и тот же угол перед выключением/перезагрузкой системы, и т.д.
  • Воспользоваться фичей smoothStart() , которая появилась в версии 3.2 данной библиотеки. Работает она очень просто: аттачит и детачит сервопривод с периодом в пару десятков миллисекунд, таким образом привод плавно движется до заданного угла из любого начального положения. Вызывать smoothStart() нужно однократно (при старте программы) сразу после attach(pin, target) в блоке setup() . Внимание! Функция блокирующая, выполнение занимает 900 миллисекунд. Период “рывка” сервопривода выбран минимальный, при котором серво начинает понимать, чего от неё хотят. Период довольно большой, поэтому движение к заданной позиции происходит рывками, но в целом гораздо плавнее, чем без smoothStart() . В массивном механизме рывки практически незаметны!

Управление

Движение серво происходит автоматически в методе tick() , нам нужно всего лишь вызывать его как можно чаще в loop() ( tick() имеет встроенный таймер на 20 миллисекунд). Также есть метод tickManual() , который поворачивает серву на следующий “шаг” при каждом вызове (тот же tick() , но не имеет своего таймера). Оба метода tick() возвращают false , пока серво движется, и true , когда серво достигла установленного угла, это можно использовать. Также серво автоматически отключается от управления при достижении заданного угла поворота (это уменьшает жужжание серво в простое). Эту функцию можно отключить, вызвав setAutoDetach(false) . Инструменты для управления движением привода:

    setTarget(длина); – устанавливает целевую позицию для серво в величине длина импульса, мкс (

500-2400)

  • setTargetDeg(угол); – устанавливает целевую позицию для серво в градусах (0-180)
  • setSpeed(скорость); – установка максимальной скорости (больше нуля) в градусах в секунду
  • setAccel(ускорение); – установка ускорения (float числа 0.01 – 1.0). Можно больше 1, будет ещё резче. Если установить ускорение 0 – оно будет отключено и серво будет двигаться по профилю постоянной скорости (с бесконечным ускорением)
    • Если передавать ускорение в целых числах (с версии 3.7 библиотеки) – ускорение будет установлено в градусах/сек/сек. Рабочий диапазон ускорений 1 — 1500 , чем больше – тем резче. При значении 0 ускорение будет отключено.
  • start(); – автоматический attach + разрешает работу tick – серво движется к заданной позиции
  • stop(); – detach + запрещает работу tick – серво останавливается
  • Полезные вспомогательные методы для различных ситуаций:

    • setDirection(напр); – принимает NORMAL (false) или REVERSE (true), меняет направление серво
    • setCurrent(длина); – установка текущей позиции в мкс (500 – 2400). Может пригодиться в ситуации, когда мы знаем реальный угол серво и хотим сообщить о нём программе, чтобы алгоритм не дёргал привод.
    • setCurrentDeg(угол); – установка текущей позиции в градусах (0-180). Зависит от min и max.
    • getCurrent(); – получение текущей позиции в мкс (500 – 2400)
    • getCurrentDeg(); – получение текущей позиции в градусах (0-180). Зависит от min и max
    • getTarget(); – получение целевой позиции в мкс (500 – 2400)
    • getTargetDeg(); – получение целевой позиции в градусах (0-180). Зависит от min и max
    • setMaxAngle(); – установка макс. угла серво, по умолчанию 180 . Позволяет удобно работать с разными сервами (на 270 и 360 градусов)
    Читайте также  Сундуки своими руками

    Расширитель серво PCA9685

    В версии библиотеки 3 и выше добавлена поддержка драйвера PCA9685, подключать нужно файл #include «ServoDriverSmooth.h»

    • ServoDriverSmooth servo; // по умолчанию (адрес 0x40, угол 180)
    • ServoDriverSmooth servo(0x40); // с указанием адреса драйвера
    • ServoDriverSmooth servo(0x40, 270); // с указанием адреса и макс. угла

    Метод attach(pin) принимает номер вывода на драйвере. В остальном всё работает точно так же, как с обычной сервой.

    Пример проекта

    Ниже представлен проект с сервоприводом на «Ардуино». Представьте ситуацию, что требуется создать автоматическое открывание форточек в теплице при достижении определенной температуры. Для этого используется датчик DHT-11 и сервопривод SG92R. Программный код выглядит следующим образом:

    Для начала подключаются библиотеки для работы с датчиком DHT-11 и сервоприводом. Следом обозначаются переменные и к каким контактам они подключены. После чего каждые две секунды датчик узнает температуру, и если она выше тридцати градусов, то срабатывает сервопривод, тем самым открывая форточку. Это пример его работы с «Ардуино» и датчиком DHT-11.

    Характеристики сервопривода SG90:

    • Вес сервопривода: 9 гр
    • Габариты: 21,5мм х 11,8мм х 22,7мм
    • Напряжение питания: от 4,8В до 6В
    • Крутящий момент: 1,2 кг*см при напряжении питания 4,7В
    • Время поворота на угол 60 гр: 0,12 сек. при напряжении питания 4,7В
    • Рабочая температура: -30°C…+60°C

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

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

    Схема подключения сервопривода SG90 к Ардуино

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

    Как мы уже сказали ранее — сервомоторы обычно имеют три провода:

    • VCC — плюс источника питания (красный провод).
    • GND — минус источника питания (черный или коричневый).
    • Signal — сигнальный провод (желтый или оранжевый).

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

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

    Сигнальный провод подключен к цифровому выводу D8 (ШИМ) Ардуино, поскольку управляющие сигналы от микроконтроллера Ардуино к сервоприводу отправляются в качестве импульсов ШИМ.

    Скетч управления сервоприводом SG90

    Скетч для этого проекта довольно прост благодаря функциональной и компактной библиотеке servo.h, разработанной командой Ардуино для облегчения использования серводвигателей в проектах Ардуино.

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

    Начинаем код проекта с подключения библиотек, которые мы будем использовать, в нашем случае это библиотека servo.h.

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

    После этого переходим к функции void setup (). Мы запускаем функцию, прикрепляя объект сервопривода к выводу D8 микроконтроллера, после чего мы центрируем сервопривод, поворачивая его на ноль градусов.

    Выполнив это, мы можем поворачивать вал сервопривода в любом направлении и делать это мы будем внутри функции void loop().

    Благодаря библиотеке servo.h, все что нам нужно сделать, чтобы повернуть сервопривод на нужный угол — это передать желаемый угол в качестве аргумента в функцию servo.write ().

    Чтобы продемонстрировать это, используем цикл с несколькими углами поворота в одном направлении, и другой цикл в обратном направлении (для возврата)

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

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

    Схема устройства представлена на следующем рисунке.

    В отличие от управления серводвигателем с помощью микроконтроллеров AVR в случае использования платы Arduino нам уже нет необходимости вручную устанавливать значения регистров чтобы получить нужную частоту и коэффициент заполнения управляющих сигналов для серводвигателя. Для платформы Arduino для этих целей разработаны специальные библиотеки, с помощью которых эти функции реализуются достаточно просто – необходимо в программе просто подключить заголовочные файлы этих библиотек. В этом случае мы достаточно просто сможем устанавливать позицию сервомотора с помощью сигналов ШИМ.

    Для задействования всей мощи библиотек Arduino по управлению серводвигателями мы должны сделать следующие вещи:

    1. #include
    2. Servo sg90servo;
    3. Sg90.attach(servo_signal_pin_attached_to);
    4. Sg90.write(needed_position_ angle);

    Вначале мы должны установить частоту ШИМ сигнала для управления сервомотором – в данном случае это делается простым подключением заголовочного файла “ #include ”. С подключением этого заголовочного файла необходимая частота ШИМ сигнала для управления серводвигателем устанавливается автоматически, кроме этого открываются возможности использования различных функций для простого управления серводвигателем.

    После этого мы должны определиться с именем сервомотора, которым будем управлять в программе. Делается это с помощью функции “ Servo sg90sevo ”, где ‘ sg90servo ’ – это выбранное имя для нашего сервомотора. Особенно актуально указание имен сервомоторов когда под нашим управлением будет находиться несколько сервомоторов (до 8 для Arduino) – в этом случае удобно их будет различать по данным им именам.

    Далее мы должны сообщить Arduino к какому контакту подключен сервомотор, то есть на каком контакте необходимо будет формировать сигнал ШИМ. Мы это будем делать с помощью функции “ Sg90.attach(3); ”, которая указывает Arduino что сервомотор подключен к контакту PIN3.

    Теперь все, что осталось сделать, это указать на какой угол необходимо повернуть ось серводвигателя, это можно сделать с помощью функции “ Sg90.write(30); ”, которая повернет ось серводвигателя на 30 градусов. В дальнейшем, если нам понадобится повернуть ось серводвигателя на какой-нибудь другой угол, то необходимо воспользоваться командой ” Sg90.write(needed_position_ angle); ”. На представленной схеме у нас есть две кнопки, одна из них будет увеличивать угол поворота оси серводвигателя (вращать его против часовой стрелки), а другая – уменьшать (вращать его по часовой стрелке).

    Сервопривод и его разновидности

    Как говорилось выше, сервопривод – это дополнительное оборудование, которое устанавливается на распределительный коллектор для теплого водяного пола.

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

    Механический сервопривод

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

    Он имеет не сложную конструкцию и приемлемую стоимость.

    Регулировка температуры производится непосредственно на самом устройстве вращением специального колесика, уменьшающего или увеличивающего показатели температуры.

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

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

    Читайте также  Подключение узо без заземления

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

    Электронный сервопривод для коллектора

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

    Схема коллектора с сервоприводом

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

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

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

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

    Если они случаются нередко, то стоит дополнительно устанавливать ИБП (индивидуальный блок питания) или свой выбор останавливать на механическом устройстве регулировки подачи теплоносителя. Подробнее о сервоприводах смотрите в этом видео:

    Дистанционный сервопривод

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

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

    Организовывая такую систему отопления, многие специалисты советуют приобретать надежные и функционально наполненные терморегуляторы, которые будут подавать на сервопривод своевременные команды, на основании которых устройство сможет создать свой уникальный микроклимат (по требованию хозяина) в каждой комнате. Подробнее о дистанционных устройствах смотрите в этом видео:

    Следует знать, что сервоприводы можно классифицировать еще по следующим параметрам:

    • нормально закрытые;
    • открытые.

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

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

    Управление сервоприводом SG90 без микроконтроллера

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

    Кому интересно, прошу под кат.

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

    Знания

    Всем известно, что опыт и знания помогают творить и находить решения. На страницах Гиктаймса немало примеров использования сервопривода с применением контроллеров. В них подробно рассказано про систему управления сервоприводом. Примем этот опыт других разработчиков за знания необходимые нам для решения задачи. Сервопривод SG90 управляется ШИМ сигналом, параметры которого определяют положение ротора. Период ШИМ около 20 мС, длительность сигнала управления от 500 до 2100 мкС.

    Задача

    Идея и знания порождают задачу, которую необходимо решить. Сформулируем задачу для воплощения идеи. Это что-то вроде Технического Задания. Кажется, все просто, надо взять генератор импульсов с изменяемой скважностью, подключить питание к сервоприводу, а с генератора подать управляющий сигнал. Особо отметим, что в требованиях есть изменения скважности — то есть должны быть органы управления или пользовательский интерфейс.

    Реализация

    Вот тут и начинаются муки творчества: что взять и где взять? Можно найти готовый лабораторный импульсный генератор, например Г5-54 с ручками, кнопками, выставить нужные параметры, подключить генератор к сервоприводу. Однако это громоздко и не все могут позволить себе такую роскошь. Поэтому разработчики, опираясь на свой опыт и знания, пытаются совместить желание (идею-задачу) и возможности (материальные и творческие) для реализации задачи. Материальные возможности — это та “жаба”“А сколько и чего я хочу потратить на реализацию идеи?” Творческие возможности — это, “посмотрю-ка я, что у меня уже есть”. Это не обязательно какие-то материальные ценности, а опыт и знания предыдущих разработок, которые можно приспособить под реализацию. Также не лишним будет поискать (погуглить), что кто-то уже реализовывал что-то подобное. Для сокращения вариантов решения необходимо самому добавлять дополнительные требования, ограничивающие фантазии реализации. Например, добавим к требованиям еще одно условие, пусть это будет материальное ограничение, реализация должна быть недорогой.

    Поиск альтернатив

    Воспользовавшись интернетом, поищем варианты, которые предлагает СЕТЬ. Зададим в поиске: “генератор прямоугольных импульсов с переменной скважностью”. Получим очень много вариантов, как с применением интегральных таймеров NE555 (отечественный аналог КР1006ВИ1), так и на логических микросхемах. Из всего разнообразия я выбрал вариант генератора на инверторе с триггером Шмитта на входе. Во-первых, он самый простой, во-вторых, требует минимум деталей и самое интересное использует единственный логический элемент из шести, если, например, использовать микросхему 74HC14.

    Схема такого генератора выглядит так:

    Немного теории

    Теория гласит, что частота такого генератора равна f = 1/T = 1/(0.8*R*C). Для получения требуемой частоты требуется выбрать номинал одного из элементов, задающих частоту. Так как логический элемент выполнен по технологии КМОП, то имеет большое входное сопротивление, поэтому можно применять элементы задающие небольшие рабочие токи. Выберем емкость С1 из ряда распространенных номиналов, например 0.47 мкФ. Тогда для получения требуемой частоты (50Гц) резистор должен быть приблизительно 53 кОм, но такого резистора в стандартном ряду нет, поэтому выберем 51 кОм.

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

    Тогда схема примет следующий вид:

    Казалось бы: все, задача решена, но в крайних положениях переменного резистора поведение сервопривода нестабильно. Это связано с тем, что значение длительности импульсов, в крайних положениях переменного резистора, не соответствует требуемым. Лично мне также не по душе применение переменного резистора, поэтому я хочу изменить интерфейс управления, добавив новую “хотелку” в техническое задание, например чтобы скважность менялась в зависимости от освещенности. Для этого есть простое и недорогое решение: применить в качестве регулирующего элемента фоторезистор GL55xx (используют в проектах Arduino), изменение сопротивления которого лежит в широком диапазоне.

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

    Читайте также  Наклейка флизелиновых обоев

    Итоговая схема принимает следующий вид:

    Пояснения к итоговой схеме

    Конденсатор С1 номиналом 0.47 мкФ, определяет время перезаряда. Резистор R1 номиналом 51 кОм задает основную частоту повторения импульсов в районе 50 Гц. Комбинация резисторов R2-R4 в сумме будет изменяться в диапазоне от 2.5 кОм до 24 кОм в зависимости от освещенности. Вместе с диодом D1 эти резисторы будут влиять на время перезаряда конденсатора С1 при действии положительного импульса на выходе логического элемента, тем самым определять его длительность.

    Результат

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

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

    Как управлять цифровым сервоприводом?

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

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