В этом уроке Вы узнаете, как пользоваться сервоприводом на Python.
Сервоприводы контролируются импульсами разной длины. Для этого нужно достаточно точное тактирование. У Raspberry Pi есть один разъем, который генерирует импульс для аппаратного обеспечения без помощи операционной системы. У Occidentalis есть интерфейс, который использует этот разъем, чтобы управлять сервоприводом.
Вам понадобится
Сервоприводы
Крайние позиции разных сервоприводов могут отличаться. Многие сервоприводы могут осуществлять поворот до 170 градусов. Также бывают и «непрерывные» сервоприводы, которые могут вращаться на все 360 градусов.
Модуль ядра «ШИМ и Серво» (PWM and Servo)
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.
Программное обеспечение
# Servo Control
import time
def set(property, value):
try:
f = open(«/sys/class/rpi-pwm/pwm0/» + property, ‘w’)
f.write(value)
f.close()
except:
print(«Error writing to: « + property + » value: « + value)
def setServo(angle):
set(«servo», str(angle))
set(«delayed», «0»)
set(«mode», «servo»)
set(«servo_max», «180»)
set(«active», «1»)
delay_period = 0.01
while True:
for angle in range(0, 180):
setServo(angle)
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, а затем введите команду:
$ nano servo.py
Скопируйте код выше в редактор и нажмите CTRL-X и Y, чтобы сохранить файл.
Чтобы запустить программу сервопривода, введите следующую команду в окно SSH:
$ python servo.py
Сервопривод должен сразу же начать двигаться.
Тестируем и настраиваем
Если Вы хотите, чтобы сервопривод двигался быстрей, уменьшите параметр delay_period, например до 0.001. А чтобы замедлить его, увеличьте до 0.1.
Если Вы хотите управлять более чем одним сервоприводом одновременно, то проще всего сделать это с помощью чего-то наподобие I2C 16-канальный серво/ШИМ контроллера.