Найти в Дзене
Алексей Кретов

3 способа управления сервоприводом с помощью Rspberry Pi

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

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

Эксперименты будем проводить с сервоприводом SG90. Сервопривод самый слабенький, что минимизирует риски нарушить работоспособность Raspberry Pi. Согласно даташиту на этот сервопривод положениям соответствуют следующие длительности импульсов:

  • Период ШИМ сигнала составляет 20 мс или 50 Гц;
  • -90 гр ШИМ составляет 1 мс. Мы привыкли это считать положением 0 гр;
  • 0 гр ШИМ составляет 1,5 мс. Соответствует среднему положению 90 гр;
  • 90 гр ШИМ составляет 2 мс. Второе крайнее положение 180 гр.
небольшая визуализация ШИМ сигнала
небольшая визуализация ШИМ сигнала

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

Для наших экспериментов создадим папку servo командами

cd ~

mkdir dev/servo

cd dev/servo

Так в файлах будет поддерживаться относительный порядок

1. Способ. Напрямую к Raspberry pi

Первый способ самый простой и использует программный ШИМ.

НЕДОПУСТИМО подключать большие сервоприводы.

Схема подключения сервопривода:

Схема подключения. Не забывайте, что черный или коричневый провод - земля
Схема подключения. Не забывайте, что черный или коричневый провод - земля

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

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

nano servo.py

1 пример:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)
sg=GPIO.PWM(17,50)
sg.start(7.5)
try:
while True:
sg.ChangeDutyCycle(7.5)
print "90 deg"
time.sleep(1)
sg.ChangeDutyCycle(12.5)
print "180 deg"
time.sleep(1)
sg.ChangeDutyCycle(7.5)
print "90 deg"
time.sleep(1)
sg.ChangeDutyCycle(2.5)
print "0 deg"
time.sleep(1)
except KeyboardInterrupt:
sg.stop()
GPIO.cleanup()

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

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

python servo.py

на резких рывках заметен дребезг
на резких рывках заметен дребезг

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

Для более плавного движения воспользуемся циклом for

2 пример:

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)
sg=GPIO.PWM(17,50)
sg.start(7.5)
try:
while True:
for angle in range(2, 12, 1):
sg.ChangeDutyCycle(angle + 0.5)
print angle
time.sleep(0.5)
for angle in range(12, 2, -1):
sg.ChangeDutyCycle(angle + 0.5)
print angle
time.sleep(0.5)
except KeyboardInterrupt:
sg.stop()
GPIO.cleanup()

На этом примере дрыгания видны еще заметнее.

-5

Вывод очевиден: напрямую подключать сервопривод к Raspberry не целесообразно, в силу низкой точности позиционирования.

2. Способ. ШИМ контролер на базе PCA9685

PCA9685 - это 16-ти канальный 12-разрядный контроллер. Частота ШИМ настраивается в пределах от 24 до 1526 Гц. Хотя на плате от Adafruit написано от 40 до 1000 Гц. С помощью ШИМ контроллера можно управлять яркостью светодиодов, сервоприводами, и другими устройствами, где в качестве управляющего сигналы применяется ШИМ сигнал.

Более подробно о нём рассказывается в рускоязычной статье или на сайте производителя

Подключение платы PCA9685

Данная плата позволяет подключать внешние питани, что позволяет подключать несколько сервоприводов. При использовании всех 16 каналов обычно требуется подключать дополнительный блок питания, т.к. токи становятся очень большими для встроенной схемы питания. Обязательно нужно объединить землю распберри и шилда

-6
-7

Если подключаете первый раз то потребуется выполнить следующие команды:

  1. sudo apt-get install build-essential python-dev python-smbus i2c-tools python-pip --yes устанавливаем библиотеки
  2. sudo raspi-config потребуется включить i2c в настройках
  3. i2cdetect -y 1 проверяем какой адрес имеет устройство
  4. в ответ получаем следующее сообщение:
    pi@raspberrypi:~ $ i2cdetect -y 1
      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40:
    40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70:
    70 -- -- -- -- -- -- --
  5. sudo pip install Adafruit-PCA9685 устанавливаем библиотеку для работы с модулем
  6. для запуска программы будем пользоваться командой

sudo python servo.py

Пример программы для Adafruit-PCA968

3 пример:

from __future__ import division
import time
import Adafruit_PCA9685

pwm = Adafruit_PCA9685.PCA9685()
servo_min =300 # Min pulse length out of 4096
servo_max = 450 # Max pulse length out of 4096

def set_servo_pulse(channel, pulse):
pulse_length = 1000000 # 1,000,000 us per second
pulse_length //= 60 # 60 Hz
print('{0}us per period'.format(pulse_length))
pulse_length //= 4096 # 12 bits of resolution
print('{0}us per bit'.format(pulse_length))
pulse *= 1000
pulse //= pulse_length
pwm.set_pwm(channel, 0, pulse)

pwm.set_pwm_freq(60)
print('Moving servo on channel 0, press Ctrl-C to quit...')

while True:
for number in range(300, 450):
pwm.set_pwm(0, 0, number)
time.sleep(0.1)
for number in range(300,450 ):
pwm.set_pwm(0, 0, 750 - number)
time.sleep(0.1)


Это отличный способ, т.к. позволяет точно настроить каждый из 16 сервоприводов, ведь даже в одной партии не все сервоприводы идеально настроены по своим параметрам. Можно одновременно подключать разные сервоприводы с различным управляющим ШИМ сигналом. Тест с акселерометром продемонстрировал хорошую плавность и отсутствие ярко выраженного дребезга.

-8

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

3 Способ. Trema+Expander Hat для Raspberry Pi - шляпа от iarduino

Все её возможности можно найти на сайте производителя. Цена среди аналогов одна из самых низких и ребята её не задирают, вопреки изменениям курса валют.

Устанавливается очень плотно и удобно, но в комплекте нет стоек для установки платы!
Устанавливается очень плотно и удобно, но в комплекте нет стоек для установки платы!

На плате есть 4 вывода, доступных как генератор 12 битного ШИМ сигнала c 0 по 3. При этом выводы с 0 по 7 могут работать в режиме АЦП.

-10

Библиотека для работы с шилдом устанавливается командой

sudo pip3 install pyiArduinoI2Cexpander

Простейший пример работы с сервоприводом:

4 пример:

from pyiArduinoI2Cexpander import *
from time import sleep

ext = pyiArduinoI2Cexpander(0x08)
ext.pinMode(0, OUTPUT, SERVO)
print("Servo test " "Press ctrl+c to exit.")

while True:
ext.servoWrite(0, 90)
sleep(1.5)

Запускается программа командой python3 servo.py

Данный пример выставляет сервопривод в 90 градусов, что позволяет разместить на нём коромысло.

Для циклического движения сервопривода воспользуемся циклом for

5 пример:

from pyiArduinoI2Cexpander import *
from time import sleep
ext = pyiArduinoI2Cexpander(0x08)

ext.pinMode(1, OUTPUT, SERVO)
ext.pinMode(3, OUTPUT, SERVO)
print("Servo test " "Press ctrl+c to exit.")

while True:
for number in range(0, 180):
ext.servoWrite(1, 180 - number)
ext.servoWrite(3, number)
sleep(.1)
for number in range(0, 180):
ext.servoWrite(1, number)
ext.servoWrite(3, 180 - number)
sleep(.1)

-11

При подключении 4х сервоприводов MG996 при вращении с маленькой задержкой происходит превышение допустимого тока для ЭКСПАНДЕРА и при питании от аккумулятора распберри отключается и уходит в перезагрузку. Не рекомендую подключать больше двух мощных сервоприводов. 4 привода типа MG90 стабилизатор питания тянет на ура!

ВЫВОДЫ

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