Урок 1 -Подключает servo-привод к arduino. Сервопривод + кнопка

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

В этом проекте мы будет подключать сервомотор к микроконтроллеру ATmega16 (семейство AVR) используя программную среду Atmel Studio 7.0. Сервомотор работает от напряжения 4.8-6В. Мы можем контролировать (управлять) угол поворота и направление вращения сервомотора с использованием сигналов ШИМ (широтно-импульсной модуляции, в англ. – 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 – контакт ШИМ)

Управление сервоприводом по заданной программе

Когда последовательность действий заранее известна, можно записать её в массив и затем поочередно передавать сервоприводу.

Соберем схему:


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

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

// Программное управление сервоприводом // (с) Роман Исаков, 2020 // (с) LabData.ru #include #define servo_pin 8 // Разъем для подключения сервы #define servo_speed 500 // Скорость обработки команд uint32_t servo_T = 0; // Служебная переменная int pos = 0; // Номер текущей команды int prog[] = {180, 100, 80, 90, 85, 90, 85, 90, 70, 60, 50, 40, 20, 10}; // Команды серве Servo servo1; // Объект сервы void setup() { servo1.attach(servo_pin); // Подключение сервы servo_T = millis(); } void loop() { int N = sizeof(prog)/sizeof(int); // число элементов массива prog if (millis() — servo_T >= servo_speed) { // Программное прерывание по таймеру servo_T = millis(); servo1.write(prog[pos]); // Отправка команды серве pos++; // Выбор следующей команды if (pos>=N) pos = 0; // Если дошли до конца – повторить сначала } }

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

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

  1. Микроконтроллер ATmega16 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. Микро сервомотор SG90 Tower Pro (купить на AliExpress).
  4. Кварцевый резонатор 16 МГц (купить на AliExpress).
  5. Конденсатор 100 нФ (2 шт.) (купить на AliExpress).
  6. Конденсатор 22 пФ (2 шт.) (купить на AliExpress).
  7. Кнопка.
  8. Светодиод (купить на AliExpress).
  9. Макетная плата.
  10. Навесные проводники.
  11. Источник питания с напряжением 5 Вольт.

Работа схемы

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

У микроконтроллера Atmega16 четыре контакта ШИМ, мы можем использовать любой из них. В этом проекте мы будем использовать контакт PD5 (OC1A) – мы его будем напрямую соединять с оранжевым проводом сервомотора. Светодиод будет использоваться для индикации питания. Также необходимо соединить одну кнопку с контактом сброса (Reset) микроконтроллера чтобы иметь возможность осуществлять его сброс в любое время. Соедините Atmega16 с кварцевым генератором. Вся наша конструкция будет работать от напряжения 5В.

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

Управление сервомотором с использованием AVR ATmega16

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

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

Чтобы генерировать нужные нам импульсы мы будем использовать Таймер 1 микроконтроллера Atmega16. Микроконтроллер способен работать на частоте 16 МГц, но мы будем использовать частоту 1 МГц поскольку в нашем проекте нам ее вполне хватит для того чтобы микроконтроллер справился с возложенными на него функциями. Предделитель установим в 1, то есть получим шкалу 1 МГц/1 = 1 МГц. Таймер 1 будем использовать в режиме быстрой ШИМ (то есть Fast PWM Mode), то есть в режиме 14 (Mode 14). Вы можете использовать различные режимы таймера чтобы генерировать нужную вам последовательность импульсов. Более подробную информацию об этом вы можете найти в Atmega16 Official Datasheet.

Чтобы использовать Таймер 1 в режиме быстрой ШИМ нам необходимо будет верхнее значение (TOP value) регистра ICR1 (Input Capture Register1 – входной захватывающий регистр). Найти значение TOP можно по следующей формуле:

fpwm = fcpu / n x (1 + TOP) Это выражение можно упростить до следующего:

TOP = (fcpu / (fpwm x n)) – 1 где N = коэффициент деления предделителя fcpu = частота процессора fpwm = частота следования импульсов на входе серводвигателя, которая равна 50 Гц

То есть мы должны подставить в приведенную формулу следующие значения переменных: N = 1, fcpu = 1MHz, fpwm = 50Hz.

Подставив все это, мы получим ICR1 = 1999.

Это значит, что для того чтобы достичь максимального уровня, т.е. 1800 (поворот оси сервомотора на 180 градусов), необходимо чтобы ICR1 = 1999.

Для частоты 16 МГц и коэффициенте деления предделителя равному 16, получим ICR1 = 4999.

Управление несколькими сервоприводами сигналом с датчика

Если сигнал управления зависит от каких-то внешних факторов, то нужно подключать к Ардуино соответствующий датчик. В данном примере — аналоговый датчик угла (потенциометр). Управлять будем независимо двумя сервоприводами. Задача — следить за напряжением на датчике и закрывать один сервопривод в одну строну, а другой — в другую. Как-бы имитируя ворота.

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


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

Алгоритм реализован в программе Ардуино:

// Управление сервоприводами с датчика // (с) Роман Исаков, 2020 // (с) LabData.ru #include #define servo_speed 200 // Установка скорости работы #define servo1_pin 8 // Выход 1 сервы #define servo2_pin 9 // Выход 2 сервы uint32_t servo_T = 0; #define DAT_pin A0 // Вход потенциометра Servo servo1; Servo servo2; void setup() { servo1.attach(servo1_pin); servo2.attach(servo2_pin); servo_T = millis(); } void loop() { if (millis() — servo_T >= servo_speed) { servo_T = millis(); int DAT = analogRead(DAT_pin); // Получение аналогового сигнала с потенциометра servo1.write(map(DAT, 0, 1024, 90, 180)); // Преобразование уровня напряжения от 0..1024 в угол от 90 до 180* и отправка на 1 серву servo2.write(map(DAT, 0, 1024, 90, 0)); // Преобразование уровня напряжения от 0..1024 в угол от 90 до 0* и отправка на 2 серву } }

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

Рейтинг
( 2 оценки, среднее 4.5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]