В этой статье мы рассмотрим подключение серводвигателя (сервомотора) к Arduino Uno. Серводвигатели в настоящее время находят широкое применения с целью точного позиционирования чего либо. Они не предназначены для применений, в которых требуется высокая скорость. Они используются в приложениях, в которых требуется низкоскоростное перемещение какого-либо предмета с высокой точностью. Наиболее часто их применяют в таких областях как робототехника, управление полетами и другие управляющие системы.
Мы можем контролировать (управлять) угол поворота и направление вращения сервомотора с использованием сигналов ШИМ (широтно-импульсной модуляции, в англ. – PWM). Необходимо отметить, что сервомоторы не могут поворачиваться на полные 360 градусов, они не используются там, где требуется непрерывное вращение двигателя. Обычно угол поворота для них лежит в пределах 0-180 градусов или от (-90) до (+90) градусов.
Общие принципы работы серводвигателей (сервомоторов)
Серводвигатели включают в свой состав небольшой двигатель постоянного тока, редуктор и схему управления, содержащую переменный резистор, дающий возможность установить выходной вал серводвигателя под определенным углом. Поэтому серводвигатели очень удобны для проектов, где требуется осуществлять весьма быстрое и относительно точное перемещение какого-либо рабочего органа.
Типы серводвигателей
Серводвигатели часто используются в радиоуправляемых моделях автомобилей для поворота рулевых колес или в моделях радиоуправляемых самолетов – для поворота управляющих поверхностей (рулей). На следующем рисунке показаны два серводвигателя разных размеров.
Серводвигатель справа представляет собой так называемый стандартный серводвигатель. Это наиболее распространенный тип серводвигателя. Такие серводвигатели достаточно часто имеют одинаковые размеры и монтажные расстояния между отверстиями. Намного меньший (и более легкий) серводвигатель слева предназначен для летательных аппаратов. Эти серводвигатели называются сервоприводами 9g .
Сервоприводы с более высоким качеством исполнения и более высоким крутящим моментом имеют редуктор с шестернями из металла, а не из нейлона. Большинство серводвигателей работают на номинальном напряжении питания около 5 В при допустимом диапазоне питающих напряжений от 4 до 7 В. Подключение любительских сервоприводов обычно осуществляется через провода, заканчивающиеся 3-контактным разъемом: питание +, питание — и управляющий сигнал.
Большие и иногда весьма мощные серводвигатели также доступны для использования, но они не так стандартизированы, как любительские маломощные сервомашинки.
Устройство сервопривода
Сервопривод (см. рисунок) состоит из электродвигателя, постоянного тока, приводящего в действие редуктор, уменьшающий скорость вращения двигателя и, в то же время увеличивающий крутящий момент на валу. Для контроля положения выходного вала он соединен с датчиком положения (как правило, это переменный резистор). Для управления мощностью и направлением, в котором поворачивается двигатель сервопривода, схема управления использует входной сигнал от датчика положения в сочетании с сигналом управления, задающим требуемое положение.
Блок управления, получив через сигнал управления величину желаемого положения вала, вычитает из него величину действительного его положения и вырабатывает «сигнал ошибки», который может быть положительным или отрицательным. Этот «сигнал ошибки» подается на питание двигателя, заставляя его изменить положение вала в нужном направлении. Чем больше разница между желаемым и действительным положением выходного вала, тем быстрее двигатель будет поворачиваться к желаемой позиции. Чем ближе к нулю становится значение ошибки (рассогласования), тем меньше становится питание двигателя.
Управление серводвигателем
Управляющий сигнал на серводвигатель — это не напряжение, как можно было бы ожидать, а сигнал широтно-импульсной модуляции (ШИМ). Этот сигнал является стандартным для всех любительских сервомашинок и выглядит так, как показано на следующем рисунке.
Серводвигатель ожидает прихода импульса управления каждые 20 мс. Импульс длительностью 1,5 мс установит серводвигатель в центральное положение, соответствующее повороту выходного вала на 90°. Более короткие импульсы в 1,0 мс установят выходной вал в начальное положение — 0°, а импульсы в 2,0 мс — крайнее положение — 180°. В реальности этот диапазон может быть немного меньше, чем полные 180°, без укорочения импульсов на одном конце и удлинения на другом. Не редкость и ситуация, когда для 0° нужен импульс 0,5 мс, а для 180° — 2,5 мс.
Назначение контактов сервомотора
Представлено на следующем рисунке. Я думаю, здесь все просто и понятно.
1. Red (красный) = Положительное напряжение питания (от 4.8V до 6V)
2. Brown (коричневый) = Ground (земля)
3. Orange (оранжевый) = Control Signal – управляющий сигнал (PWM Pin – контакт ШИМ)
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Сервомотор (купить на AliExpress).
- Конденсатор 100 пФ (купить на AliExpress).
- Резистор 1 кОм (2 шт.) (купить на AliExpress).
- Кнопка (2 шт.).
- Источник питания с напряжением 5 В.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы и программы
Схема устройства представлена на следующем рисунке.
В отличие от управления серводвигателем с помощью микроконтроллеров AVR в случае использования платы Arduino нам уже нет необходимости вручную устанавливать значения регистров чтобы получить нужную частоту и коэффициент заполнения управляющих сигналов для серводвигателя. Для платформы Arduino для этих целей разработаны специальные библиотеки, с помощью которых эти функции реализуются достаточно просто – необходимо в программе просто подключить заголовочные файлы этих библиотек. В этом случае мы достаточно просто сможем устанавливать позицию сервомотора с помощью сигналов ШИМ.
Для задействования всей мощи библиотек Arduino по управлению серводвигателями мы должны сделать следующие вещи:
1. #include <Servo.h>
2. Servo sg90servo;
3. Sg90.attach(servo_signal_pin_attached_to);
4. Sg90.write(needed_position_ angle);
Вначале мы должны установить частоту ШИМ сигнала для управления сервомотором – в данном случае это делается простым подключением заголовочного файла “#include <Servo.h>”. С подключением этого заголовочного файла необходимая частота ШИМ сигнала для управления серводвигателем устанавливается автоматически, кроме этого открываются возможности использования различных функций для простого управления серводвигателем.
После этого мы должны определиться с именем сервомотора, которым будем управлять в программе. Делается это с помощью функции “Servo sg90sevo”, где ‘sg90servo’ – это выбранное имя для нашего сервомотора. Особенно актуально указание имен сервомоторов когда под нашим управлением будет находиться несколько сервомоторов (до 8 для Arduino) – в этом случае удобно их будет различать по данным им именам.
Далее мы должны сообщить Arduino к какому контакту подключен сервомотор, то есть на каком контакте необходимо будет формировать сигнал ШИМ. Мы это будем делать с помощью функции “Sg90.attach(3);”, которая указывает Arduino что сервомотор подключен к контакту PIN3.
Теперь все, что осталось сделать, это указать на какой угол необходимо повернуть ось серводвигателя, это можно сделать с помощью функции “Sg90.write(30);”, которая повернет ось серводвигателя на 30 градусов. В дальнейшем, если нам понадобится повернуть ось серводвигателя на какой-нибудь другой угол, то необходимо воспользоваться командой ”Sg90.write(needed_position_ angle);”. На представленной схеме у нас есть две кнопки, одна из них будет увеличивать угол поворота оси серводвигателя (вращать его против часовой стрелки), а другая – уменьшать (вращать его по часовой стрелке).
Исходный код программы
Код программы снабжен комментариями, объясняющими смысл отдельных команд.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
volatile int i=0; // объявляем переменную целого типа для хранения значения угла поворота оси серводвигателя #include <Servo.h> // подключаем заголовочный файл для управления серводвигателем Servo servo; // указываем имя для нашего серводвигателя void setup() { pinMode(3, OUTPUT); // устанавливаем контакт 3 на вывод данных pinMode(5, INPUT);// устанавливаем контакт 5 на ввод данных pinMode(6, INPUT);// устанавливаем контакт 6 на ввод данных servo.attach(3): } void loop() { servo.write(i); // устанавливаем позицию оси сервомотора в ‘i’ градусов if (digitalRead(5)==LOW) { if (i<180) { i++; // если кнопка, подключенная к pin5, нажата и угол поворота (в градусах) меньше 180 delay(30); } } if (digitalRead(6)==LOW) { if (i>0) { i--; // если кнопка, подключенная к pin6, нажата и угол поворота (в градусах) больше 0 delay(30); } } } |
В коде отсутствует servo.attach(3) и номера контактов кнопок на схеме и коде разные. В таком виде схема не работает.
Да, спасибо за внимательность, исправил опечатки в коде программы.