Инструменты пользователя

Перевод этой страницы:

Инструменты сайта


Боковая панель

Для чего нужен ОрбиКрафт

Подсистемы конструктора

Инструкции по работе с ОрбиКрафт

Уроки

Лабораторная оснастка

Знакомство с Arduino

Полезная нагрузка на базе Arduino

Обратная связь

Новости

arduino_s_06

6. Сервомотор

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#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 секунды
}

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

#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 миллисекунд
  }
}

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

#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 миллисекунд
  }
}

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

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

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

#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
}

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

#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 можно почитать здесь http://arduino.ru/Reference/For


Задания

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

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

arduino_s_06.txt · Последние изменения: 2020/05/08 17:51 — golikov

Инструменты страницы