Меню Рубрики

Raspberry pi 3 сервопривод

Содержание

Итак ставим перед собой задачу: управлять серво-мотором от Raspberry PI, используя визуальный элемент на экране.

Мы будем генерировать широтно-импульсный сигнал PWM на дискретном выходе мини-компьютера и задавая длительность отдельного положительного импульса сигнала будем изменять угол поворота серво-двигателя. Так же мы должны изначально понимать, что на дискретном выходе Raspberry не получится супер-стабильных временных параметров сигнала, и поэтому серво всегда будет немного дёргать вместо стояния на месте.

Сам двигатель прийдется запитать от отдельного источника питания 5-6 В, чтобы не навредить любимой малинке.

Для данного проекта нам понадобятся такие составляющие:

  • Servo – мотор;
  • Монтажная плата и соединительные провода;
  • Резистор сопротивлением 1 кОм;
  • Блок питания 5 В 1 А (для двигателя)

Схема соединений показана на следующем рисунке.

Резистор 1 кОм не обязателен, но он защитит дискретный выход малинки от случайных замыканий.

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

Двигатель можно запитать от сетевого блока питания или от блока батареек.

Интерфейс пользователя для задания угла поворота шпинделя серво будет основана готовой программе из интернета gui_slider.py на языке Python, созданной для управления яркостью света. Но мы изменим её для изменения задания мотору в градусах от 0 до 180. Выглядит это так как на рисунке.

Запускаем консольную или графическую часть линукса на Raspberry PI, открываем текстовый редактор (nano или IDLE) и вставляем в него следующий код. Даем файлу название servo.py.

Кстати такой графический интерфейс пользователя не будет виден из окна SSH.

Запускать программу необходимо от имени администратора. В командной консоли это будет выглядеть так sudo python servo.py

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

Наша программа будет выдавать широтно-импульсный сигнал PWM частотой 100 Гц. Это означает, что положительный импульс будет генерироваться каждые 10 мс. Ширина этого импульса будет преобразована в угол поворота серво.

Коннектор на 40 пинов 2,54 мм мама

Коннектор под выводы электронных компонентов и провода. Всего в гребенке 40 пинов, но их можно откус..

Мотор-редуктор 30 об./мин с энкодером

Двигатель постоянного тока с червячным редуктором и энкодеромСкорость вращения 30 об./мин при напряж..

Радиомодуль NRF24L01

Радио передатчик-приемник с рабочей частотой 2,4 . 2,5 ГГц для работы в связке с платой контроллер..

Реле 12В 2А с двумя группами переключающихся контактов

Электромагнитное реле с двумя группами переключающихся контактов. Рабочее напряжение на катушке..

DIP панель 6 8 14 16 18 20 24 40 пин 2,54мм

Дип панелька для установки микросхемДает возможность быстро менять микросхемы на плате..

Raspberry Pi имеет несколько путей реализации PWM (ШИМ) (Широтно-импульсной модуляции). Мы рассмотрим как реализовать, ШИМ программно, и задействуем для генерации ШИМ аппаратные ресурсы Raspberry Pi. Сначала будем менять яркость светодиода, а затем научимся управлять сервоприводом.

Что такое PWM (ШИМ)?

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

Программная реализация ШИМ

Подключим светодиод к GPIO23 как указано на схеме:

Напишем скрипт pwm_soft.py:

Светодиод будет плавно загораться и плавно гаснуть.

Читайте также:  Зеркало на пластиковой основе

Программная реализация ШИМ позволяет сформировать ШИМ-сигнал на любому выводе. В этом примере мы используем RPi.GPIO для программной генерации ШИМ сигнала. А это значит, что тратятся вычислительные ресурсы микрокомпьютера. Если микрокомпьютер будет отвлекаться на другие задачи, ШИМ сигнал будет искажаться и не будет стабильным. Это не принципиально, если ШИМ применяется для управления яркостью светодиода. Но может стать неприемлемым, когда ШИМ применяется для формирования управляющего сигнала. Например, при управлении сервоприводами программная реализация ШИМ не может стабильно удерживать сервоприводы в заданном положении. Это заметно на видео ниже.

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

Генерирование ШИМ сигнала с использованием аппаратных ресурсов Raspberry Pi

Проект WiringPi – это библиотека, которая содержит утилиты для простого доступа к GPIO. Она позволяет настроить аппаратные модули для специальных выходов ШИМ. Установим wiringPi:

Подключим светодиод к GPIO18 как указано на схеме:

Первый выход ШИМ заведен на GPIO18, другие каналы ШИМ задействованы на аудио-выходе. Выполним следующие команды для формирования на GPIO18 ШИМ сигнала. Настраиваем первый канал PWM (GPIO18):

Задаем скважность от 0 до 1024:

Светодиод должен светиться вполсилы. Поэкспериментируйте с ШИМ. Попробуйте задать следующие значения:

Генерирование аппаратного ШИМ сигнала на Python

Чтобы использовать ШИМ в Python надо установили WiringPi-Python:

Напишем срипт pwm.py:

Светодиод будет плавно загораться и плавно гаснуть. Аппаратная реализация ШИМ обеспечивает более стабильный результат. К сожалению аппаратный выход в Raspberry Pi только один. Но существует еще пара методов генерирования ШИМ. Через DMA, и использование внешнего PWM контроллера (ШИМ контроллера). Эти методы рассмотрим ниже для управления сервоприводами, поскольку на светодиодах разница не будет заметна.

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

Обычно сервоприводы используют питание 5В. Маломощный сервопривод можно питать от Raspberry Pi. Но если привод потребляет достаточно большой ток, или Вам нужно подключить несколько сервомашинок, лучше не нагружать Raspberry Pi и использовать отдельный источник питания. Схема подключения сервопривода:

Управление сервоприводом с помощью программно сформированного ШИМ

Сначала попробуем формировать ШИМ для управления сервоприводом программно. Создадим скрипт servo.py:

Запустим servo.py:

Я намеренно вставил функции print в код. Наличие этих функций оказывает описанную ранее проблему нестабильности программно сформированного ШИМ. Сервомашинка НЕ фиксируется в заданном положении и дергается. Если удалить инструкции print, проблема уменьшается или вообще исчезает.

Управление сервоприводом с помощью ШИМ, сформированного через DMA

Устанавливаем RPIO:

Создаем срипт servo_dma.py:

Теперь сервопривод работает стабильно. То есть, для управления сервоприводами о программном ШИМ желательно вообще забыть.

Подробности использования RPIO читайте здесь: http://pythonhosted.org/RPIO/pwm_py.html#examples

На этом видео видно разницу между различными способами генерирования ШИМ сигнала:

Servoblaster

Существует проект Servoblaster, который тоже работает через DMA. С помощью него можно управлять до 8 сервоприводами. Servoblaster устанавливается как демон и позволяет управлять сервоприводами через файлы устройств. То есть, управлять сервами можно через файловую систему. Это позволяет управлять сервами, используя любой язык программирования или из командной строки и не требует установки дополнительных модулей таких как RPIO, который мы устанавливали ранее для Python.

Установим Servoblaster:

Проверяем установился ли Servoblaster корректно:

Можно просмотреть конфиг Servoblaster-а:

Выводы на которые можно подключать сервоприводы приведены в следующей таблице:

Servo number GPIO number Pin in P1 header
0 4 P1-7
1 17 P1-11
2 18 P1-12
3 21/27 * P1-13
4 22 P1-15
5 23 P1-16
6 24 P1-18
7 25 P1-22

* – RaspberryPi B и RaspberryPi B Revision 2 имеют разницу в распиновке. Подробнее здесь: http://www.avislab.com/blog/raspberry-pi-install/

Допустимые значения положения зависят от вашего сервопривода. В большинстве случаев они лежат в диапазоне от 80 до 249. Напишем следующий срипт для управления сервоприводом:

Читайте также:  Вентиляционные трубы на газовую колонку

Есть одна особенность Servoblaster. Пока он запущен, он занимает 8 указанных в таблице выходов и под другие цели Вы их уже не сможете задействовать. Попробуйте запустить ранее написанные скрипты:

Сервомашинка не работает как следует.

Попробуем остановить демон Servoblaster и повторить попытку. Останавливаем Servoblaster с помощью команды:

Проверяем нет теперь servod в запущенных процессах:

Повторяем запуск скриптов:

Все работает как следует. Запускаем servod командой:

Возникает вопрос: а что делать, если надо задействовать лишь несколько каналов, а не все 8? Servoblaster можно конфигурировать благодаря следующим опциям:

–pcm tells servod to use PCM rather than PWM hardware to implement delays
– > –cycle-time=Nus Control pulse cycle time in microseconds, default 20000us
–step-size=Nus Pulse width increment step size in microseconds, default 10us
–min= specifies the minimum allowed pulse width, default 50 steps or 500us
–max= specifies the maximum allowed pulse width, default 250 steps or 2500us
–invert Inverts outputs
–dma-chan=N tells servod which dma channel to use, default 14
–p1pins=

  • tells servod which pins on the P1 header to use
    –p5pins=
  • tells servod which pins on the P5 header to use
  • Сейчас нас интересует опция –p1pins. Остановим Servoblaster:

    И запустим его с новыми опциями:

    Теперь Servoblaster занимать одну ногу P1-11 (GPIO17). Проверить это можно просмотрев конфиг:

    Если перезагрузить Raspbery Pi, Servoblaster снова будет работать с начальными настройками. Для того, чтобы при старте системы Servoblaster запускался с Вашими настройками, укажите их в файле /etc/init.d/servoblaster

    Adafruit 16-channel servo driver

    Если Вам нужно управлять чрезвычайным количеством сервоприводов, уместно использовать многоканальный внешний ШИМ контроллер. Например Adafruit 16-channel servo driver, или его аналоги. Эта плата подключается к Raspberry Pi по интерфейсу I2C и может одновременно управлять 16-ю сервоприводами. Подробнее об этом устройстве: PWM контролер на базе микросхемы PCA9685

    Arduino и многое другое купить в Киеве

    В вашей корзине

    В этом уроке Вы узнаете, как пользоваться сервоприводом на Python.

    Сервоприводы контролируются импульсами разной длины. Для этого нужно достаточно точное тактирование. У Raspberry Pi есть один разъем, который генерирует импульс для аппаратного обеспечения без помощи операционной системы. У Occidentalis есть интерфейс, который использует этот разъем, чтобы управлять сервоприводом.

    Крайние позиции разных сервоприводов могут отличаться. Многие сервоприводы могут осуществлять поворот до 170 градусов. Также бывают и «непрерывные» сервоприводы, которые могут вращаться на все 360 градусов.

    Adafruit и Sean Cross разработали модуль ядра со встроенным дистрибутивом Occidentalis. Подробнее про создание Occidentalis здесь. Если Вы хотите использовать модуль с Raspbian или каким-либо другим дистрибутивом, Вы найдете информацию об установке модуля ядра для своей среды здесь.

    Наш модуль называется «ШИМ и Серво», посколько помимо управления сервоприводами, он может вырабатывать ШИМ-сигналы (широтно-импульсная модуляция), которые могут использоваться (при наличии дополнительной электроники) для управлением питания моторов или индикаторов. В этом уроке мы не будем касаться функции ШИМ.

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

    Список файлов, которые модуль использует, чтобы приводить в действие сервопривод, приведен ниже. Все эти файлы находятся в каталоге /sys/class/rpi-pwm/pwm0/ Вашего Raspberry Pi.

    Описание

    active Будет иметь значение 1 для активного состояния, 0 — для неактивного. Прочитав этот файл можно узнать активен ли выходной разъем, а записав его — сделать активным или неактивным. delayed Если значение 1, то любые изменения в других файлах не будут иметь никаких последствий, пока Вы не активируете выходной разъем с помощью файла выше. mode Записывайте этот файл, чтобы перевести разъем в режим ШИМ, серво или аудио. Конечно же, в данном случае нам нужен режим серво. Обратите внимание, что разъем также используется разъемом Pi для аудио, поэтому Вы не сможете одновременно использовать звук и контролировать сервопривод. servo_max Записывайте этот файл, чтобы задать максимальную величину позиции сервопривода. Мы зададим значение 180, чтобы сервопривод можно было привести в любую позицию между 0 и 180. servo Величина, которую Вы назначите для этого файла, задает длину импульса сервопривода в соответствии с servo_max. То есть если мы зададим значение 90 при servo_max 180, сервопривод будет приведен в центральную позицию.
    Читайте также:  Дизайн потолков в столовой

    Только один из разъемов Pi может генерировать импульсы нужным нам образом. Это разъем GPIO 18. Мы подключим его к управляющему выводу сервопривода. Питание сервопривода осуществляется через внешнюю батарейку, поскольку питание через Pi скорее всего приведет ко сбою, так как сервопривод при работе потребляет очень много тока. Сервоприводу требуется 4,8-6В постоянного тока для моторчика, но уровень сигнала (выходной импульс) может быть 3,3В. Именно поэтому можно просто присоединить сигнальную шину напрямую к GPIO-разъему Pi.

    def set ( property , value ):

    f = open ( «/sys/class/rpi-pwm/pwm0/» + property , ‘w’ )

    f . write ( value )

    print ( «Error writing to: « + property + » value: « + value )

    def setServo ( angle ):

    set ( «servo» , str ( angle ))

    set ( «delayed» , «0» )

    set ( «mode» , «servo» )

    set ( «servo_max» , «180» )

    for angle in range ( 0 , 180 ):

    time . sleep ( delay_period )

    for angle in range ( 0 , 180 ):

    setServo ( 180 – angle )

    time . sleep ( delay_period )

    Чтобы сделать запись файлов проще, я написал служебную программу ‘set’. Первый параметр для нее — это файл, который должен быть записан, или характеристика, а второй параметр — значение, которое нужно записать.

    В самом начале нужно сделать несколько записей, чтобы выключить режим с задержками, включить режим серво, задать максимальную величину серво как 180 и активировать выходной разъем.

    Переменная (delay_period) содержит время в секундах между каждым шагом сервопривода.

    Цикл while будет продолжаться вечно или пока программа не будет остановлена нажатием CTRL-C. В этом цикле есть два почти одинаковых цикла for. Первый отсчитывает угол от 0 до 180, а второй задает угол сервопривода как 180, то есть угол, на который повернется назад серворычаг от 180 до 0 градусов.

    Чтобы установить программу, подключитесь к Pi через SSH, а затем введите команду:

    Скопируйте код выше в редактор и нажмите CTRL-X и Y, чтобы сохранить файл.

    Чтобы запустить программу сервопривода, введите следующую команду в окно SSH:

    Сервопривод должен сразу же начать двигаться.

    Если Вы хотите, чтобы сервопривод двигался быстрей, уменьшите параметр delay_period, например до 0.001. А чтобы замедлить его, увеличьте до 0.1.

    Если Вы хотите управлять более чем одним сервоприводом одновременно, то проще всего сделать это с помощью чего-то наподобие I2C 16-канальный серво/ШИМ контроллера.

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

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