Перейти к основному содержимому

Сервомотор

Устройство сервомотора

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

  • вал вращается на 180 градусов;
  • вал вращается по кругу на 360 градусов.

Сервомотор

Рисунок 1. Сервомотор

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

Устройство сервомотора

Рисунок 2. Устройство сервомотора

Вот так выглядят сервомоторы в Tinkercad.

Сервомоторы в Tinkercad

Рисунок 3. Сервомоторы в Tinkercad

У сервомотора есть 3 вывода: она окрашены в разные цвета.

  • красный - питание +5V;
  • коричневый - заземление GND;
  • оранжевый - управляющий пин, подключается к цифровому пину Arduino.

Выводы сервомотора

Рисунок 4. Выводы сервомотора

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

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

Подключение библиотеки

Рисунок 5. Подключение библиотеки

Для начала работы с сервомотором его нужно объявить: Servo пробел и название сервомотора. В примере название myservo. Объявление сервомотора должно быть до процедуры cpp void setup() .

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

  • attach() - указывает к какому пину подключен управляющий вывод сервомотора;
  • write() - задает позицию сервомотору. Позиция задается числом от 0 до 180;
  • read() - считывает текущую позицию сервомотора.

Управление сервомотором

Собираем схему

Схема управления сервомотора

Рисунок 6. Схема управления сервомотора

Программа для установки сервомотора в заданную позицию

#include <Servo.h>  //подключаем библиотеку для работы с сервомотором
Servo myservo; //объявляем сервомотор

void setup(){
myservo.attach(7); //настраиваем пин 7 как управляющий пин сервомотора
}

void loop(){
myservo.write(0); //задаем позицию 0
delay(2000); //ждем 2 секунды
myservo.write(90); //задаем позицию 90
delay(2000); //ждем 2 секунды
myservo.write(180); //задаем позицию 180
delay(2000); //ждем 2 секунды
}

Плавное вращение сервомотора в одну сторону

#include <Servo.h>  //подключаем библиотеку для работы с сервомотором
Servo myservo; //объявляем сервомотор

void setup(){
myservo.attach(7); //настраиваем пин 7 как управляющий пин сервомотора
}

void loop(){
for(int i=0; i<=180; i++){ //в цикле увеличиваем позицию сервомотора от 0 до 180,
myservo.write(i);
delay(50); //задерживаясь в каждой позиции на 50 миллисекунд
}
}

Плавное вращение сервомотора в обе стороны

#include <Servo.h>  //подключаем библиотеку для работы с сервомотором
Servo myservo; //объявляем сервомотор

void setup(){
myservo.attach(7); //настраиваем пин 7 как управляющий пин сервомотора
}

void loop(){
for(int i=0; i<=180; i++){ //в цикле увеличиваем позицию сервомотора от 0 до 180,
myservo.write(i);
delay(50); //задерживаясь в каждой позиции на 50 миллисекунд
}
for(int i=180; i>=0; i--){ //в цикле уменьшаем позицию сервомотора от 180 до 0,
myservo.write(i);
delay(50); //задерживаясь в каждой позиции на 50 миллисекунд
}
}

Управляем сервомотором с помощью потенциометра

Собираем схему

Схема управления сервомотора с помощью потенциометра

Рисунок 7. Схема управления сервомотора с помощью потенциометра

Управляем сервомотором с помощью потенциометра

#include <Servo.h>        //подключаем библиотеку для работы с сервомотором
#define potenciometr A0 //создаем переменную для потенциометра
Servo myservo; //объявляем сервомотор
int potValue; //создаем переменную для хранения показаний потенциометра

void setup(){
myservo.attach(7); //настраиваем пин 7 как управляющий пин сервомотора
pinMode(potenciometr, INPUT); //настраиваем пин, к которому подключен потенциометр, как вход
Serial.begin(9600); //настраиваем работу с монитором порта
}

void loop(){
potValue = analogRead(potenciometr); //считываем показания потенциометра и сохраняем в переменную potValue
potValue = map(potValue, 0, 1023, 0, 180); //преобразуем диапазон значений 0-1023 в новый диапазон 0-180
Serial.println(potValue); //выводим в монитор порта значение переменной potValue
myservo.write(potValue); //задаем позицию сервомотора равно значению переменной potValue
}

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

#include <Servo.h>    //подключаем библиотеку для работы с сервомотором
Servo myservo; //объявляем сервомотор
int position; //создаем переменную для хранения значения позиции для сервомотора
char data; //создаем переменную для хранения введенных в монитор последовательного интерфейса команд

void setup(){
myservo.attach(7); //настраиваем пин 7 как управляющий пин сервомотора
Serial.begin(9600); //настраиваем работу с монитором порта
}

void loop(){
myservo.write(position); //задаем позицию сервомотора равной значению переменной position
if(Serial.available()>0){ //проверяем поступили ли команды в монитор порта
data = Serial.read(); //считываем полученные команды
Serial.println(data); //выводим в монитор порта полученную команду
if(data == '+'){ //если полученная команда была '+', то переменная position увеличивается на 10,
position = position + 10;
}
else if(data == '-'){ // а если '-', то переменная position уменьшается на 10
position = position - 10;
}
myservo.write(position); //задаем позицию сервомотора равной значению переменной position
Serial.println(position); //выводим в монитор порта значение переменной position
}
}

Подробнее о цикле for можно почитать здесь.

Задания

  1. Сделайте аналоговые часы. Соберите схему из платы Arduino и сервомотора. Запрограммируйте Arduino чтобы вал сервомотора вращался как секундная стрелка - на 6 градусов в секунду.

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