Сервопривод для raspberry pi

Содержание

Raspberry Pi Servo Motor control

In addition to stepper motors, there are also small and cheap servo motors. The control of Raspberry Pi servo motors is very simple and thanks to the small size and weight they are used in many areas.
Unlike stepper motors, servomotors can be controlled with a single GPIO.

In this tutorial, I’ll show an example of how to use Python to control one or more servo motors.

Required Hardware Parts

  • Servo motor
  • Jumper cable
  • (Breadboard)
  • if necessary, a battery holder + (rechargeable) batteries, as an external power supply

Of course, it is possible to supply the servo motor with an external power source, but this only makes sense when using several motors. For that, rechargeable batteries/regular batteries would still be needed.

Setup

In most cases, the colors of the servo are as follows and are connected to the Pi:

Black – comes to GND (pin 6) from the Pi
Red – comes to 3V3 (pin 1) from the Pi
Yellow/Orange – to a free GPIO pin (e.g., GPIO17, pin 11)

If you want to play it safe, you can set a

1kΩ resistor between the data pin (yellow/orange) and the Pi. Normally this is not necessary.

If the servo motor does not rotate correctly, this may also influence the power supply of the Raspberry Pi (just look at the datasheet, what the engine consumes). In such a case an external power source makes sense (usually it is 4 to 6V).

Software for controlling the Raspberry Pi servo motors

Unlike stepper motors, servo motors don’t occupy many GPIO pins to command a movement. For this, the rotation is controlled by the length of the pulse.

The angle of the motor is set along the length of the pulse, so PWM is particularly useful, which sends repetitive signals at even intervals (the Raspberry Pi Python library must be installed).

We either start python ( sudo python ) or open a new script ( sudo nano servomotor.py ) with the following content:

If the servo motor shakes a bit while it is not moving, you can pause the pulse with ChangeDutyCycle(0)

For servo motors and their driver boards, the indication of the period and the duty cycle is usually made in the datasheet. In the example of a MG996R we have the following: The period is 20ms long. In addition, a duty cycle of between 5% and 10% of the period is expected. Thus the pulse duration is between 1ms and 2ms. Usually, servos can rotate between 0 and 180°. So we have to adjust the pulse length in between. A length of 1.5ms (7.5%) thus gives an angle of 90 °. And all at precisely 50x per second (50Hz).

If it bothers you that the servo (SG90) can not rotate 360 °, there is a “hack“.

Источник

Подключение сервомотора к Raspberry Pi Pico с помощью MicroPython

Ранее на нашем сайте мы уже рассмотрели серию статей про набирающую сейчас популярность плату Raspberry Pi Pico: подключение к ней ЖК дисплея и OLED дисплея, использование в ней АЦП и подключение ультразвукового датчика для определения расстояний.

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

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

  1. Плата Raspberry Pi Pico (купить на AliExpress).
  2. Сервомотор SG90 (купить на AliExpress).
  3. Макетная плата.
  4. Соединительные провода.

Основные принципы ШИМ

Широтно-импульсная модуляция (на англ. Pulse-width modulation – PWM) – это технология, которая изменяет амплитуду цифрового сигнала таким образом, чтобы обеспечить на нагрузке необходимое среднее значение напряжения. Изменяя коэффициент заполнения (цикл занятости, duty cycle) широтно-импульсной модуляции, можно регулировать значение мощности сигнала, поступающего на нагрузку. На следующем рисунке показан пример ШИМ сигнала.

На представленном рисунке показан ШИМ сигнал с коэффициентом заполнения 50%. Мы можем изменять коэффициент заполнения ШИМ сигнала в пределах от 0% to 100%. Период ШИМ сигнала – это сумма длительности моментов ON и OFF как показано на рисунке. Частота ШИМ сигнала показывает как быстро в ШИМ сигнала протекает один период. Формула для ее расчета выглядит следующим образом:

Frequency = 1/Time Period
Time Period = On time + Off time

Более подробно про технологию широтно-импульсной модуляции вы можете прочитать в статье про использование ШИМ в плате Arduino.

В данном проекте мы, изменяя коэффициент заполнения ШИМ сигнала, будем управлять сервомотором (серводвигателем), подключенным к плате Raspberry Pi Pico.

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

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

Как видите, схема соединений очень проста. Мы знаем, что у сервомотора три провода. Черный или коричневый провод – для подключения к земле (ground), красный – для подачи питания (VCC), желтый или оранжевый – для подачи управляющего импульсного сигнала. В схеме мы подключили провод VCC серводвигателя к контакту VBUS платы Raspberry Pi Pico, сигнальный провод сервомотора подключен к контакту GPIO0 платы, а земля сервомотора – к земле платы.

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

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

Для начала вам необходимо скачать с репозитория GitHub каталог обучающих программ для платы Raspberry Pi Pico. В этом каталоге вам нужен будет подкаталог с именем “T6_How to Control a Servo Motor using Pico”. Внутри этого подкаталога вы найдете подкаталог “code”, а в нем файл программы “main.py”, который вам нужно открыть в редакторе Thonny (или другом аналогичном).

Вначале в программе мы подключаем (импортируем) необходимые библиотеки.

Источник

Управление сервоприводом 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 на 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()

Устанавливает частоту ШИМ для всего чипа, до

Параметры
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 нужно соблюдать следующие шаги:

  1. Нужно открыть шину I2C «0» (или «1»);
  2. Создаём объект класса PCA9685 , а в качестве параметра конструктора используем выше созданный объект: i2cBus ;
  3. Создаём объект класса ServoPCA9685 для управления одного сервопривода, в качестве первого параметра используем выше созданный объект, pca9685 , а второй параметр — это номер канала PCA9685, можно выбрать следующие значения: PCA9685.CHANNEL00 , PCA9685.CHANNEL01 , PCA9685.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) .

Источник

Управление несколькими сервоприводами на Raspberry Pi для механизма поворота/наклона PI-камеры

В этом обучающем проекте будет рассмотрено управление несколькими сервоприводами для позиционирования PI-камеры с помощью механизма поворота/наклона с использованием Raspberry Pi 3 Model B и программы на Python.

У подобной камеры с механизмом поворота/наклона множество применений. Это может быть система видеонаблюдения или робот с дистанционным управлением. У Raspberry PI вычислительной мощности достаточно и что бы реализовать относительно несложную обработку изображений и к примеру, реализовать автоматическое слежение за движущимся объектом или поиск нужного объекта. И многое другое. Примеры реализации некоторых подобных вещей будут рассмотрены в будущих обучающих проектах.

Шаг 1: компоненты

Основные используемые детали:
1 x Raspberry Pi 3b
1 x RPI-камера OV5647 (5-мегапикселей, 1080p)
2 x сервопривод SG90
1 x самодельное или готовое крепление поворота/наклона для SG90
2 x резистор 1кОм, опционально

Шаг 2: ШИМ

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

Принцип работы следующий. Генератор создаёт прямоугольные импульсы определённой частоты. Эта частота постоянна, а длительность импульса можно изменять. К примеру, если нужно управлять яркостью свечения светодиода, для этого можно использовать ЦАП (цифро-аналоговый преобразователь, DAC). У Raspberry Pi нет аналогового выхода (ЦАП), вместо него можно использовать ШИМ. Чем больше длительность импульса, тем больше среднее значение напряжения и наоборот, чем меньше длительность импульса, тем меньше среднее напряжение.

В случае со светодиодом, если частота будет слишком низкая, визуально светодиод будет мигать, а не менять яркость.

Кроме уже упомянутого, ШИМ используется и при управлении некоторых сервоприводов, контроллеров оборотов коллекторных или BLDC моторов и прочих вещах, используемых в моделизме и робототехнике. В данном случае нас интересуют сервоприводы. Угол, на который будет проворачиваться сервопривод задаётся длительностью импульса.

Шаг 3: схема подключения

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

  • коричневый — «земля»
  • красный — «+5В»
  • желтый — сигнальный

К GPIO 17 подключается управляющий провод сервопривода наклона, к GPIO 27 сервопривод поворота. Дополнительно для защиты выводов Raspberry Pi можно использовать резистор 1кОм.

Если Вы также будете использовать отдельные источники питания для Raspbery Pi и сервоприводов, обязательно соедините их земли, в противном случае электроника может выйти из строя. В данном случае земля от внешнего источника питания для сервоприводов подключена к выводу земли (возле GPIO 17) на Raspberry Pi.

Шаг 4: калибровка сервоприводов

У SG90 от различных производителей (могут выпускаться со своей наклейкой, например, «FeeTech FS90» или как в оригинальной «TowerPro SG90») параметры сервопривода могут немного отличаться. Если питающее напряжение обычно до 4.8-5в, частота управляющих импульсов 50Гц (т.е. период следования сигнала 20мс), а угол, на который проворачивается сервопривод примерно 180градусов, то длительность управляющего импульса очень часто отличается.

К примеру длительность управляющего импульса может быть от 1мс до 2мс или от 0.75мс до 1.85мс или от 0.5мс до 2.4мс и т.д. Для сервоприводов от одного производителя, длительность управляющего импульса тоже может немного отличаться. Калибровка — это определение, какие длительности импульсов соответствуют минимальной и максимальной длительность управляющего импульса и каким углам проворачивания вала сервопривода они соответствуют.

Под нейтральным положением может подразумеваться то положение, в которое проворачивается вал при средней длительности импульса (в данном случае это 1.5мс). Обозначать в градусах могут как на картинке выше, т.е. нейтральное 90 градусов и крайние положения как 0 и 180. Или под нейтральным подразумевать 0 градусов, а крайние обозначать как -90 и +90. С обозначениями углов это условность, могут быть и другие варианты. В данном случае будет использоваться первый вариант.

Для программирования позиции сервопривода с использованием Python очень важно знать соответствующий коэффициент заполнения (англ. duty cycle) для вышеуказанных позиций (задаётся в процентах). К примеру длительность импульса 2мс, при периоде следования сигнала 20мс это коэффициент заполнения 10%. Давайте сделаем вычисления для всех углов:

  • исходное положение ==> (0 градусов) длительность импульса 1мс ==> коэффициент заполнения = 1мс/20мс*100% = 5%
  • нейтральное положение ==> (90 градусов) длительность импульса 1,5мс ==> коэффициент заполнения = 1,5мс/20мс*100% = 7,5%
  • конечная позиция ==> (180 градусов) длительность импульса 2мс ==> коэффициент заполнения = 2мс/20мс*100% = 10%

Таким образом коэффициент заполнения варьируется от 5% до 10%.

Давайте откалибруем сервоприводы. Для этого откроем терминал на Raspberry и запустим редактор Python 3 с правами от суперпользователя (нужно для работы с GPIO):

Импортируем модуль RPI.GPIO и называем его GPIO:

import RPi.GPIO as GPIO

Определите, какие схемы нумерации выводов хотите использовать (BCM или BOARD). Я провел этот тест с BOARD, поэтому используемые контакты были физическими (GPIO 17 это контакт 11 и GPIO 27 это контакт 13). Мне было легко их идентифицировать и не ошибиться во время теста (в финальной программе я буду использовать BCM). Выбираем:

Определяем вывод сервопривода, который будет использоваться:

Если хотите использовать схему BCM, последние 2 команды должны быть заменены на:

GPIO.setmode(GPIO.BCM)
tiltPin = 17

Теперь указываем, что этот вывод будет работать как выход:

Настраиваем частоту, для SG90 нужно 50 Гц:

tilt = GPIO.PWM(tiltPin, 50)

Включаем генерацию сигнала ШИМ на выводе и задаём начальный коэффициент заполнения равный нулю:

Теперь мы можем устанавливать различные значения коэффициента заполнения и наблюдать за движением сервопривода. Давайте начнем с 5% и посмотрим, что происходит:

Сервопривод перешел в «нулевое положение». Сервопривод продолжал вращаться, при задании заполнения вплоть до 3%. При задании заполнения 2% сервопривод оставался в том же положении. После чего начав задавать значения больше 2%, движение сервопривода в моём случае начало происходить при установке коэффициента заполнения более 3%. Итак, 3% — это минимальное заполнение (позиция «0 градусов») для этого сервопривода.

То же самое произошло и с максимальным коэффициентом заполнения. Для начала установлено 10%:

Затем задавались большие значения, сервопривод продолжал проворачиваться при установке коэффициента заполнения вплоть до 13%. Таким образом максимальный коэффициент заполнения для данного сервопривода это 13%, угол, на который проворачивается вал сервопривода составил примерно 180 градусов (но это в данном случае, в зависимости от сервопривода физический угол может оказаться и больше и меньше). Итак, в результате калибровки получены следующие данные:

0 градусов ==> заполнение 3%
90 градусов ==> заполнение 8%
180 градусов ==> заполнение 13%

После окончания калибровки останавливаем ШИМ и очищаем GPIO:

Для второго сервопривода процедура калибровки аналогична.

Шаг 5: создание скрипта Python

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

Сделать это очень просто. Мы знаем, что диапазон заполнения в пределах от 3% до 13% и что это эквивалентно диапазону углов от 0 до 180 градусов. Так же мы знаем, что зависимость линейная.

Позже в коде пересчёт заданного угла в коэффициент заполнения соответственно будет таким:

dutycycle = angle/18 + 3

Давайте создадим файл «angleServoCtrl.py» скрипта на Python для выполнения тестов. По сути, мы повторим то, что мы делали раньше в Python Shell:

Функция setServoAngle(servo, angle) получает в качестве аргументов номер вывода GPIO, к которому подключен сервопривод и значение угла, в который сервопривод должен провернуться.

В консоли этот скрипт запускается так:

sudo python3 angleServoCtrl.py 17 45

Вышеприведенная команда установит сервопривод, подключенный к GPIO 17, под углом 45 градусов.

Файл «angleServoCtrl.py» можно скачать по ссылке.

Шаг 6: Механизм поворота и наклона

На следующем изображении показано, как работает механизм:

В этом проекте pan/tilt механизм будет вращать камеру только в диапазоне углов от 30 до 150 градусов.

Этого диапазона будет достаточно для камеры.

Шаг 7: самодельный механизм поворота и наклона

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

В этом проекте будет использован самодельный:

Шаг 8: подключение электроники

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

  • отключить питание Raspberry Pi и сервоприводов
  • соберите всю схему
  • на всякий случай ещё раз всё перепроверьте
  • включите питание Raspberry Pi
  • если все в порядке, подключите питание сервоприводов

Подключать и настраивать камеру пока не будем, это будет рассмотрено в следующем обучающем проекте.

Шаг 9: скрипт Python

Создадим скрипт «servoCtrl.py» для одновременного управления обоими сервоприводами:

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

sudo python3 servoCtrl.py 45 120

Приведенная выше команда установит сервопривод поворота в позицию «45 градусов», сервопривод наклона в позицию «120 градусов». Если скрипту не будут переданы параметры, оба сервопривода провернуться в позицию «90 градусов».

Файл крипта «servoCtrl.py» можно скачать по ссылке.

Шаг 10: циклический тест для сервоприводов

Создадим скрипт » servoTest.py» для автоматического движения обоими сервоприводами в диапазоне углов от 30 до 150 градусов:

Осциллограф только для иллюстрации теории ШИМ, как объяснялось ранее.

Приведенный выше код скрипта «servoTest.py» можно скачать по ссылке.

Шаг 11: Заключение

Сделанное в этом обучающем проекте можно использовать для различных целей, некоторые примеры реализации будут рассмотрены в следующих обучающих проектах. К примеру управление и просмотр изображения с RPi-камеры через веб-страницу:

Или создание автоматического слежения за предметом:

Источник

Adblock
detector