Управление сервоприводом SG90 с помощью PCA9685 из Python на Raspberry Pi/Orange Pi/Banana Pi

Сервопривод — это мотор-редуктор, способный поворачивать выходной вал в заданное положение (на заданный угол) и удерживать его в этом положении, вопреки сопротивлениям и возмущениям. Сервопривод Tower Pro 9g SG90 не имеет мощные характеристики (всего 1,2-1,6 кг*см), но имеет недорогую цену. Отлично подходит для управления небольшими легкими механизмами под управлением контроллеров Arduino, Raspberry Pi  и т.п.. Рабочее напряжение Tower Pro 9g SG90 от 3В до 7.2В, угол поворота ограничен диапазоном от 0 до 180 градусов (в реальность — чуть больше).

Управление сервоприводом SG90 с помощью PCA9685 из Python на Raspberry Pi

В этой статье будем управлять сервоприводом SG90 с помощью PCA9685 из Python на Orange Pi PC. Можно использовать Raspberry Pi, Banana Pi, NanoPi или любой другой мини-компьютер под управлением ОС Linux имеющий I2C порт.

Библиотека на Python для PCA9685

Поскольку библиотека Adafruit_Python_PCA9685 для работы с PCA9685 из Python работает только на Raspberry Pi, она была переписана так, чтобы ее можно было использовать на Orange Pi и Banana Pi. Теперь используется SMBus в качестве I2C драйвера, как установить тут: SMBus: Работа с шиной I2C на Python в Raspberry Pi/Orange Pi/Banana Pi.

Файл PCA9685.py

Описание методов (функций)

__init__()

Конструктор класса.

Параметры
i2cBus — Объект типа PCA9685.
address — I2C адрес устройства. По умолчанию PCA9685_ADDRESS = 0x40.

begin()

Инициализация устройства.

set_address()

Установка адреса устройства.

Параметры
address — I2C адрес устройства.

set_i2c_bus()

Установка I2C шины.

Параметры
i2cBus — Объект типа PCA9685.

set_pwm()

Устанавливает ШИМ одного из выводов PCA9685.

Параметры
channel — Один из выводов PWM от 0 до 15.
on — В какой момент цикла из 4096 частей включить ШИМ.
off — В какой момент цикла из 4096 частей выключить ШИМ.

set_all_pwm()

Устанавливает ШИМ на все выводы PCA9685.

Параметры
on — В какой момент цикла из 4096 частей включить ШИМ.
off — В какой момент цикла из 4096 частей выключить ШИМ.

set_pwm_freq()

Устанавливает частоту ШИМ для всего чипа, до ~ 1,6 кГц.

Параметры
freq_hz — Частота в Герцах.

Библиотека на Python для сервоприводов

Для более удобного управления сервоприводом, основные функции были собраны в одном классе — ServoPCA9685. Тут можно найти минимальную (servo_min = 130) и максимальную (servo_max = 510) длину импульса для безопасного управления сервоприводом SG90.

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

Файл ServoPCA9685.py

Описание методов (функций)

__init__()

Конструктор класса.

pca9685 — Объект типа PCA9685.
channel — Один из ШИМ выводов PCA9685 от 0 до 15.

set_pwm_freq()

Установка частоты ШИМ для вашего сервопривода.

freq — Частота в Герцах. По умолчанию freq=50.

set_angle()

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

angle — Угол от 0 до 180 градусов.

set_pulse()

Установка длины импульса.

pulse — Длина ШИМ импульса.

disable()

Отключение сервопривода (установка длины импульса в ноль «0»).

Примеры программ

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

Схема подключения сервопривода SG90 к PCA9685 и Orange Pi OneУправление одним сервоприводом SG90

Чтобы управлять сервоприводом посредством PCA9685 нужно соблюдать следующие шаги:

  1. Нужно открыть шину I2C «0» (или «1»);
  2. Создаём объект класса PCA9685, а в качестве параметра конструктора используем выше созданный объект: i2cBus;
  3. Создаём объект класса ServoPCA9685 для управления одного сервопривода, в качестве первого параметра используем выше созданный объект, pca9685, а второй параметр — это номер канала PCA9685, можно выбрать следующие значения: PCA9685.CHANNEL00PCA9685.CHANNEL01PCA9685.CHANNEL02, …, PCA9685.CHANNEL15 или номера от 0 до 15;
  4. Для управления сервоприводом можно использовать два метода, а именно: set_pulse(pulse), где pulse — это длина ШИМ импульса от servo_min = 130 до servo_max = 510; и set_angle(angle), где angle — это угол поворота от 0 до 180 градусов, метод (функция) пропорционально переносит значение из текущего диапазона значений в градусах (от 0 до 180) в новый диапазон (от 130 до 510) в импульсах.

Нижеприведённый пример кода поварачивает сервопривод в одну сторону,

потом в другую

с использованием метода set_pulse(pulse), а в конце отключает подаваемый на сервопривод ШИМ.

Файл servo_1x_pulse.py

Пример управления сервоприводом используя метод set_pulse(pulse).

Файл servo_1x_angle.py

Пример управления сервоприводом используя метод set_angle(angle).

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

Управлять несколькими сервоприводами можно аналогичным способом, как и одним. Единственное отличие в том, что нужно создать для каждого сервопривода отдельный экземпляр класса ServoPCA9685. К примеру:

каждый объект должен иметь отличное от других имя и свой собственный канал (от 0 до 15).

servo_Nx_pulse.py

Пример управления несколькими (четырьмя) сервоприводами используя метод set_pulse(pulse).

Материалы

Все файлы в одном архиве (Скачать zip архив)
SMBus: Работа с шиной I2C на Python в Raspberry Pi/Orange Pi/Banana Pi
GitHub — adafruit/Adafruit_Python_PCA9685: Python code to use the PCA9685 PWM servo/LED controller with a Raspberry Pi or BeagleBone black.

Похожие записи

Комментарии 2

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

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