Подключение серводвигателя (сервомотора) к Arduino Due


Arduino Due представляет собой плату ARM контроллера, спроектированную для энтузиастов в мире электроники. Эта плата широко используется для конструирования 3D принтеров, роботизированных рук и других устройств. В этих устройствах требуется точное позиционирование какого-либо элемента – этой цели можно достичь при помощи использования серводвигателей (сервомоторов). В этой статье мы рассмотрим подключение и управление положением оси сервомотора с помощью платы Arduino Due. Ранее аналогичные проекты мы уже рассматривали на нашем сайте: подключение сервомотора к плате Arduino Uno и к микроконтроллеру AVR ATmega.

Подключение серводвигателя к Arduino Due: внешний вид конструкции

Мы можем контролировать (управлять) угол поворота и направление вращения сервомотора с использованием сигналов ШИМ (широтно-импульсной модуляции, в англ. – 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 – контакт ШИМ)

Необходимые компоненты

  1. Плата Arduino Due (купить на AliExpress).
  2. Серводвигатель SG90 (купить на AliExpress).
  3. Источник питания

Работа схемы

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

Схема подключения сервомотора к плате Arduino DueУправление сервомотором осуществляется с помощью ШИМ модуляции. Как уже отмечалось в статье про использование широтно-импульсной модуляции в Arduino Due в программной среде Arduino IDE есть уже все заранее сконфигурированные библиотеки для работы с ШИМ сигналами, в которых производится установка всех необходимых частот и конфигурирование необходимых регистров. Нам в программе нужно будет сделать лишь следующие вещи:

1. #include <Servo.h>
2. Servo myservo;
3. myservo.attach(servo_signal_pin_attached_to);
4. myservo.write(needed_position_ angle);

Команда “#include <Servo.h>” подключает необходимый заголовочный файл для работы с сервомоторами, который содержит все необходимые настройки для работы с ними. С его помощью работа с сервомотором у нас значительно упрощается.

Далее мы должны дать используемому нами сервомотору с помощью функции “Servo myservo” – если у нас несколько сервомоторов в схеме (до 12), то каждому из них необходимо будет дать уникальное имя. И далее все команды сервомотору мы уже будем давать с использованием этого имени.

Плата Arduino Due может формировать ШИМ сигнал на одном из своих 12 контактов, поэтому мы в программе должны сообщить нужный нам контакт – к которому подключен серводвигатель. Сделать это можно с помощью функции “myservo.attach (2);”, в которой мы сообщаем плате Arduino Due, что для формирования ШИМ мы будем использовать контакт PIN2.

Теперь единственное, что нам осталось сделать, это установить положение оси сервомотора с помощью функции “myservo.write(45);” – после этой команды ось сервомотора повернется на 45 градусов. Если мы изменим ‘45’ на ‘175’, то ось сервомотора повернется на 175 градусов и останется в этом положении до поступления очередной команды. То есть для изменения позиции оси сервомотора нам необходимо использовать команду “myservo.write(needed_position_angle);”.

Исходный код программы

В программе мы в цикле будем инкрементировать и декрементировать угол поворота оси сервомотора – сначала сервомотор будет поворачиваться от 0 до 180 градусов, а потом от 180 до 0 и т.д. Далее представлен полный текст программы с комментариями.

#include <Servo.h> // подключение библиотеки для работы с сервомоторами
Servo myservo; // задание имени для нашего сервомотора
int angle = 0; // переменная для хранения позиции оси сервомотора
void setup() {
myservo.attach(2); // сообщаем плате Arduino Due что мы будем использовать ШИМ сигнал на контакте pin 2 (к нему подсоединен сервомотор)
}
void loop() {
for (angle = 0; angle <= 180; angle += 1) { // цикл от 0 до 180 градусов с шагом 1 градус
myservo.write(angle); // поворачиваем ось сервомотора на угол 'angle'
delay(15); // ждем 15 мс чтобы сервомотор успел повернуться на нужную нам позицию
}
for (angle = 180; angle >= 0; angle -= 1) { // цикл от 180 до 0 градусов с шагом -1 градус
myservo.write(angle);
delay(15); // ждем 15 мс чтобы сервомотор успел повернуться на нужную нам позицию
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
553 просмотров

Добавить комментарий

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