Рубрики
Проекты на Raspberry Pi

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

В данной статье мы рассмотрим подключение сервомотора (серводвигателя) к плате Raspberry Pi. Ранее на нашем сайте мы уже рассматривали подключение сервомотора к плате Arduino и к микроконтроллеру AVR – в этих же статьях можно более подробно прочитать о принципах работы сервомоторов (серводвигателей).

Управлять работой сервомотора мы будем с помощью широтно-импульсной модуляции (ШИМ), поэтому вначале кратко рассмотрим принципы. Более подробно про использование ШИМ в плате Raspberry Pi можно прочитать в этой статье.

Принципы ШИМ

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

Принцип ШИМ (широтно-импульсной модуляции) показан на следующем рисунке.

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

Duty Cycle =Turn ON time/ (Turn ON time + Turn OFF time)

 Если импульсы соответствуют включенному состоянию на протяжении лишь 5% всего времени цикла (коэффициент заполнения равен 5%), то на двигатель будет поступать не слишком много энергии, и он станет вращаться очень медленно (либо светодиод будет светить тускло). Стоит повысить коэффициент заполнения до 50% — и двигатель или светодиод получат половину мощности, соответственно, скорость вращения или яркость составят примерно половину от максимума. Если коэффициент заполнения возрастет до 90% , то двигатель будет вращаться почти с полной скоростью, а светодиод — светить в полную силу.

Сервомоторы и ШИМ

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

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

В сервомоторе присутствует управляющая система, которая считывает ШИМ сигнал с сигнального провода, декодирует его и извлекает из него значение коэффициента заполнения (duty ratio). Затем она сравнивает считанное значение коэффициента заполнения с его заранее определенными значениями, хранящимися в ее памяти. Если между этими значениями присутствует разница, то она корректирует позицию оси сервомотора соответствующим образом. Таким образом, позиция оси сервомотора определяется значением коэффициента заполнения ШИМ сигнала, поступающего на его сигнальный провод.

Необходимая частота ШИМ сигнала для управления серводвигателем определяется его типом (и ее можно узнать из даташита на конкретный двигатель), но для большинства небольших серводвигателей (в том числе и для SG90) она составляет величину 50 Гц. Если мы знаем необходимую частоту ШИМ сигнала, то последнее, с чем нам нужно определиться для управления сервомотором – это значение коэффициента заполнения ШИМ сигнала.

В следующей таблице представлены значения коэффициента заполнения ШИМ сигнала, необходимые для поворота оси сервомотора на конкретный угол.

Позиция оси сервомотора Коэффициент заполнения ШИМ
2.5
90º 7.5
180º 12.5

К примеру, для поворота оси сервомотора на угол 45º необходимо значение коэффициента заполнения ‘5’ (или 5%).

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

  1. Плата Raspberry Pi 2 Model B или другая аналогичная (купить на AliExpress).
  2. Сервомотор SG90 (купить на AliExpress).
  3. Конденсатор 1000 мкФ (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.

Схема проекта

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

Конденсатор 1000 мкФ должен быть соединен по питанию чтобы при управлении сервомотором плата Raspberry Pi работала стабильно (в ее работе не возникало сбоев).

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

После того, как все необходимые соединения в схеме сделаны, мы можем подать питание на Raspberry Pi и после загрузки ее операционной системы можно начать писать программу в ней на Python. Подробнее о том, как это можно сделать, можно прочитать в статье про мигание светодиода с помощью Raspberry Pi.

В программе нам первым делом необходимо подключить (импортировать) библиотеку для работы с контактами ввода/вывода. Также мы импортируем эту библиотеку RPi.GPIO под именем “IO” (то есть переименовываем ее для использования в программе), то есть далее в программе всегда, когда мы захотим обратиться к контактам ввода/вывода, мы будем использовать слово ‘IO’.

Иногда контакты ввода/вывода (GPIO pins), которые мы собираемся использовать в программе, могут выполнять другие функции. В этом случае во время исполнения программы мы будем получать предупреждения (warnings). Следующей командой мы укажем плате Raspberry Pi на то, чтобы она игнорировала эти предупреждения и продолжала исполнение программы.

Мы можем обращаться к контактам ввода/вывода (GPIO pins) платы Raspberry Pi используя либо номер контакта на плате, либо его функциональный номер. Например, если смотреть распиновку контактов ввода/вывода платы Raspberry Pi, то можно увидеть, что в ней обозначение GPIO5 соответствует контакту PIN 29. То есть в зависимости от того, какой способ обращения к контактам мы выбрали, мы можем обращаться к рассмотренному контакту либо по номеру ‘29’, либо по номеру ‘5’. В данном проекте мы выберем способ обращения к контактам по их функциональным номерам, поэтому используем следующую команду:

В качестве цифрового выхода, с которого будет осуществляться управление сервомотором, мы будем использовать контакт PIN39 (GPIO19). На этом контакте мы будем производить формирование ШИМ сигнала.

После конфигурации контакта в качестве цифрового выхода нам необходимо настроить его как выходной контакт формирования ШИМ.

Представленная команда определяет канал для формирования ШИМ и устанавливает частоту формируемого ШИМ сигнала. В качестве канала ШИМ в нашем проекте мы будем использовать контакт GPIO19, а в качестве частоты ШИМ сигнала мы зададим значение 50 – именно такая частота необходима для управления сервомотором SG90.

Но ШИМ-контакт не начнет работать, пока не будет вызвана функция start(). Ее параметр – это исходное значение коэффициента заполнения (duty cycle).

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

Далее в программе мы будем изменять значение коэффициента заполнения 3 раза в течение 3-х секунд. То есть каждую секунду сервомотор будет поворачиваться в одно из следующих положений: 0º, 90º и 180º.

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

В нашей программе мы используем самый простой способ формирования ШИМ для управления сервомотором — с помощью соответствующих функций платы Raspberry Pi. Однако в сети интернет можно найти аналогичные проекты, где формирование ШИМ сигнала для управления сервомотором осуществляется «вручную» – то есть с помощью чередования импульсов высокого и низкого уровня с заданными (рассчитанными) значениями на одном из контактов платы Raspberry Pi.

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

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

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