Серводвигатели

Ответить
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Серводвигатели

Сообщение Oleg »

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

Поэтому серводвигатели очень удобны для проектов, где требуется осуществлять весьма быстрое и относительно точное перемещение какого-либо рабочего органа.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Типы серводвигателей

Сообщение Oleg »

Хотя можно встретить серводвигатели непрерывного типа, способные вращаться постоянно, большинство серводвигателей (их еще часто называют сервоприводами или сервомашинками) могут поворачивать выходной вал только в пределах примерно 180°. Они обычно используются в радиоуправляемых моделях автомобилей для поворота рулевых колес или в моделях радиоуправляемых самолетов для поворота управляющих поверхностей (рулей). На рисунке ниже показаны два серводвигателя разных размеров.
Сервопривод 9g (слева) и стандартный серводвигатель (справа)
Сервопривод 9g (слева) и стандартный серводвигатель (справа)
Серводвигатель справа представляет собой так называемый стандартный серводвигатель. Это наиболее распространенный тип серводвигателя. Такие серводвигатели довольно часто имеют одинаковые размеры и монтажные расстояния между отверстиями. Намного меньший (и более легкий) серводвигатель слева предназначен для летательных аппаратов. Эти серводвигатели называются сервоприводами 9g.

Сервоприводы с более высоким качеством исполнения и более высоким крутящим моментом имеют редуктор с шестернями из металла, а не из нейлона. Большинство серводвигателей работают на номинальном напряжении питания около 5 В при допустимом диапазоне питающих напряжений от 4 до 7 В. Подключение любительских сервоприводов обычно осуществляется через провода, заканчивающиеся 3-контактным разъемом: питание, питание и управляющий сигнал.

Большие и иногда весьма мощные серводвигатели также доступны для использования, но они не так стандартизированы, как любительские маломощные сервомашинки.

Устройство СЕРВОПРИВОДА
Сервопривод состоит из электродвигателя постоянного тока, приводящего в действие редуктор, уменьшающий скорость вращения двигателя и, в то же время, увеличивающий крутящий момент на валу. Для контроля положения выходного вала он соединен с датчиком положения (как правило, это переменный резистор). Для управления мощностью и направлением, в котором поворачивается двигатель сервопривода, схема управления использует входной сигнал от датчика положения в сочетании с сигналом управления, задающим требуемое положение.

Устройство серводвигателя
Устройство серводвигателя
Блок управления, получив через сигнал управления величину желаемого положения вала, вычитает из него величину действительного его положения и вырабатывает «сигнал ошибки», который может быть положительным или отрицательным. Этот «сигнал ошибки» подается на питание двигателя, заставляя его изменить положение вала в нужном направлении. Чем больше разница между желаемым и действительным положением выходного вала, тем быстрее двигатель будет поворачиваться к желаемой позиции. Чем ближе к нулю становится значение ошибки (рассогласования), тем меньше становится питание двигателя.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Управление серводвигателем

Сообщение Oleg »

Управляющий сигнал на серводвигатель - это не напряжение, как можно было бы ожидать, а сигнал широтно-импульсной модуляции (ШИМ). Этот сигнал является стандартным для всех любительских сервомашинок и выглядит так, как показано на рисунке.
Управление серводвигателем
Управление серводвигателем
Серводвигатель ожидает прихода импульса управления каждые 20 мс. Импульс длительностью 1,5 мс установит серводвигатель в центральное положение, соответствующее повороту выходного вала на 90°. Более короткие импульсы в 1,0 мс установят выходной вал в начальное положение 0°, а импульсы в 2,0 мс в крайнее положение 180°. В реальности этот диапазон может быть немного меньше, чем полные 180°, без укорочения импульсов на одном конце и удлинения на другом. Не редкость и ситуация, когда для 0° нужен импульс 0,5 мс, а для 180° - 2,5 мс.
Oleg
Сообщения: 186
Зарегистрирован: 12 июл 2023, 12:09
Эксперимент: управление положением серводвигателя

Сообщение Oleg »

В этом эксперименте мы с помощью сначала Arduino, а затем и Raspberry Pi на-учимся поворачивать выходной вал серводвигателя на заданный угол.

Для платы Arduino существует библиотека управления серводвигателями, которая способна генерировать импульсы на любом из ее контактов, так что вам не придется задействовать специальный контакт, помеченный как ШИМ-выход. Управление сервоприводом производится через окно монитора последовательного интерфейса (минитора порта), откуда на плату посылается значение угла, на который нужно повернуть вал двигателя.

Генерация точных по длительности импульсов на Raspberry Pi осуществляется гораздо сложнее, чем на Arduino. Плата Arduino оснащена аппаратными таймерами, которые генерируют нужные импульсы, а Raspberry Pi приходится генерировать импульсы программным способом. При этом, поскольку Raspberry Pi имеет операционную систему, которая позволяет выполняться множеству процессов, конкурирующих за время процессора, длительность ШИМ-импульсов иногда получается большей, чем нужно, что может приводить к небольшому дрожанию выходного вала серводвигателя. Несмотря на то, что Raspberry Pi можно использовать как есть, в случаях, когда необходима большая точность, следует задействовать внешние устройства ШИМ (разд. «Проект: танцующая кукла Пепе на Raspberry Pi»).

Оборудование

Замечательной особенностью сервоприводов является то, что управляющая электроника их двигателей заключена внутри корпуса привода, так что нет никакой необходимости в специальных отдельных Н-мостах или транзисторных блоках управления двигателями. Все, что нужно, это подключить питание 5 или 6 В к контактам питания двигателя и подать слаботочные импульсы управления с цифрового выхода платы Arduino или Raspberry Pi.

На рисунке ниже показано подключение сервопривода к Raspberry Pi. При этом к сервоприводу уже присоединена одна из качалок (они поставляются вместе с сервоприводом в маленьком пакетике), так что теперь можно увидеть, в каком положении находится вал сервопривода.

Комплектующие

В этом эксперименте для работы с Arduino и Raspberry Pi понадобятся следующие комплектующие:

Серводвигатель 9g
Перемычки "папа-папа"
Перемычки мама-папа» (только для Рі)
Схема для управления сервоприводом с Raspberry Pi в сборе
Схема для управления сервоприводом с Raspberry Pi в сборе
Небольшой серводвигатель 9В должен работать просто отлично, получая питание 5 В непосредственно от платы Рі или Arduino. Однако если вы соберетесь управлять более мощным серводвигателем, то вам потребуется внешний источник питания, например, отсек с батарейками на 6 В, который применялся в предыдущих экспериментах.

Подключение Arduino

Для подключения 3-контактного разъема серводвигателя к Arduino используются перемычки «папа-папа»
Подключение серводвигателя к Arduino
Подключение серводвигателя к Arduino
Подключение СЕРВОДВИГАТЕЛЕЙ

На рисунке ниже крупным планом показан серводвигатель и его разъем. Как и во многих других случаях с серводвигателями, такой разъем является практически стандартом для всех производителей серводвигателей. Назначение проводов, подключаемых к серводвигателю, определяют по их цвету

Провода почти всегда следуют в таком порядке:

• коричневый (иногда черный) - заземление (GND);

• красный - положительное напряжение источника питания;

• оранжевый (иногда желтый) - управляющий сигнал (Control)

Серводвигатель и его разъем
Серводвигатель и его разъем
Программа для Arduino

Библиотека servo для Arduino входит в комплект Arduino IDE и берет на себя всю тяжелую работу по работе с серводвигателями.

Скетч Arduino для этого эксперимента:

Код: Выделить всё

#include <Servo.h> 

const int servoPin = 9;   // (1)

Servo servo;            // (2)

void setup() {            
  servo.attach(servoPin);       // (3)
  servo.write(90);
  Serial.begin(9600);           // (4)
  Serial.println("Enter angle in degrees");
}

void loop() {       // (5)
  if (Serial.available()) {
    int angle = Serial.parseInt();
    servo.write(angle);        // (6)
  }
}
ПРИМЕЧАНИЕ
Вы, разумеется, можете задействовать ШИМ и команду analogWritе, чтобы сгенерировать для управления серводвигателем импульс нужной длительности, однако такой подход повлечет за собой изменение частоты ШИМ и ограничит варианты контактов для управления серводвигателем только теми выходами платы Arduino, которые могут работать в режиме ШИМ. Это метод описан далее, в разд. «Программа для Raspberry Рі», но на Arduinо проще и лучше использовать библиотеку sегvo.


Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

1. После подключения библиотеки константа servoPin определена как вывод, на который будет выдаваться сигнал управления серводвигателем.

2. Объявляется переменная servo типа Servo. Затем эта переменная используется всякий раз, когда положение серводвигателя необходимо изменить.

3. Устанавливается соответствие выходов, которые будут использоваться для генерации импульсов с использованием servo.attach.

4. Задается угол поворота вала серводвигателя в 90° (среднее положение).

5. Запускается последовательный интерфейс, так что теперь можно задать угол поворота вала серводвигателя с помощью окна монитора порта.

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

7. Задается новый угол поворота с помощью servo.write.

Загружаем и выполняем программу

Загрузите скетч в Arduino качалка на валу серводвигателя немедленно займет среднее положение (90°). Откройте окно монитора порта и попробуйте ввести несколько значений угла поворота между 0° и 180°. Серводвигатель будет перемещаться в новую позицию всякий раз, как только будет введено новое значение угла.
Управление положением серводвигателя с использованием монитора порта
Управление положением серводвигателя с использованием монитора порта
Подключение Raspberry Pi

Подключение контактов серводвигателя к GPIO-контактам Raspberry Pi осуществляется с помощью перемычек «мама-папа».
Подключение серводвигателя к Raspberry Pi
Подключение серводвигателя к Raspberry Pi
Программа для Raspberry Pi

Программа на языке Python использует ШИМ-функции библиотеки RPi. GPIO для генерации импульсов управления серводвигателем.

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

Код: Выделить всё

import RPi.GPIO as GPIO
import time

servo_pin = 18

# Tweak these values to get full range of servo movement
deg_0_pulse = 0.5   # ms (1)
deg_180_pulse = 2.5 # ms
f = 50.0   #50Hz = 20ms between pulses (2)

# Do some calculations on the pulse width parameters
period = 1000 / f # 20ms  (3)
k = 100 / period         # duty 0..100 over 20ms (4)
deg_0_duty = deg_0_pulse * k  # (5)
pulse_range = deg_180_pulse - deg_0_pulse
duty_range = pulse_range * k  # (6)

# Initialize the GPIO pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)  # (7)
pwm = GPIO.PWM(servo_pin, f)      
pwm.start(0)

def set_angle(angle):   # (8)
    duty = deg_0_duty + (angle / 180.0) * duty_range
    pwm.ChangeDutyCycle(duty)

try:
    while True:    # (9)
        angle = input("Enter angle (0 to 180): ")
        set_angle(angle)
finally:
    print("Cleaning up")
    GPIO.cleanup()
ПРИМЕЧАНИЕ

Каждому серводвигателю нужны немного разные длительности импульсов управления, чтобы обеспечить работу с максимальным диапазоном углов. Для установки импульсов управления на углах поворота 0° и 180° используются две константы: deg_0_pulse и deg_180_pulse соответственно. Чтобы получить максимальный диапазон движения, эти константы следует подстроить по месту.

Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:

1. Следующий фрагмент программы производит некоторые вычисления, связанные с длительностью импульса.

2. Подача импульса каждые 20 мс означает, что необходимо установить частоту ШИМ (f) равную 50 импульсам в секунду.

3. Период (20 мс) равен 1000, деленной на f. Если нужно использовать другую частоту импульсов, следует просто изменить значение. Остальные расчеты будут сделаны автоматически.

4. При изменении цикла ШИМ-сигнала необходимо устанавливать его значения в диапазоне от 0 до 100. Константа к изначально определена как 100 за период и может быть использована для масштабирования величины угла до рабочих значений.

5. Чтобы преобразовать величину длительности импульса, соответствующего нулевому углу, к рабочему диапазону от 0 до 100, длительность импульса умножают на k.

6. Аналогичным образом, диапазон рабочих значений также вычисляется путем умножения периода следования импульсов pulse_range на k

7. Настраиваются выводы GPIO, и ШИМ начинает работать.

8. Функция set_angle преобразует величину угла в значение рабочего цикла, а затем вызывает ChangebutyCycle для задания новой длины импульса.

9. Главный цикл очень похож на версию аналогичной программы для Arduino: значение угла сначала запрашивается, а затем пересчитывается и выдается.

Загружаем и выполняем программу

Запустите программу следующей командой:

$ sudo python servo.py

Используйте окно монитора порта для управления серводвигателем так же, как это было в случае с Arduino, вводите углы и наблюдайте, как серводвигатель уверенно занимает заданную позицию:

Код: Выделить всё

$ sudo python servo.py 
Enter angle (0 to 180) : 90
Enter angle (0 to 180) : 0 
Enter angle (0 to 180) : 180
Enter angle (0 to 180) : 90 
Enter angle (0 to 180) : 0
По большей части серводвигатель будет реагировать на команды плавно, но если проследить за ним внимательно некоторое время, то можно заметить небольшую дрожь, особенно если Raspberry Pi в это время выполняет множество каких-либо других задач. Этого следовало ожидать, т. к. чем длиннее импульс, генерируемый Raspberry Pi, тем чаще процессор будет отвлекаться на выполнение чего-нибудь еще.

Если дрожание серводвигателя окажется слишком велико, то альтернативой программной генерации импульса на Raspberry Pi может стать использование аппаратных модулей, таких как 16-канальная плата-драйвер PWM/Servo компании Adafruit (код товара 815). Этот модуль задействует только два сигнальных контакта Raspberry Pi для взаимодействия с ним и при использовании библиотеки Python также поставляемой Adafruit, позволяет управлять 16-ю серводвигателями.

Ответить