Raspberry Pi:Примеры/Управление несколькими сервоприводами с помощью Servo HAT
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Черновик |
Управление несколькими сервоприводами с помощью Servo HAT
Данный пример демонстрирует как задать угол поворота нескольким сервоприводам с помощью Servo HAT.
Servo HAT позволяет подключать до 16 сервоприводов или других устройств, управляемыми ШИМ-сигналом через интерфейс I2C.
Чтобы использовать данный модуль необходимо активировать интерфейс I2C |
Для использования модуля загрузим модуль Python, разработанный Adafruit:
git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
cd Adafruit_Python_PCA9685
sudo python setup.py install
или можно установить через pip для python 2.X:
sudo pip install adafruit-pca9685
или для python 3.X:
sudo pip3 install adafruit-pca9685
Вставьте код программы из раздела код, сохраните и запустите(запускать нужно из графического интерфейса,а не по SSH).
В коде программы управление осуществляется по двум канала сразу(0 и 1). Вы можете закомментировать ненужный канал.
Запустите программу и вы увидите графический интерфейс со слайдером:
Изменяйте положение ползунка и понаблюдайте за положением рычага сервопривода.
В программе сначала создается новый объект:
pwm = Adafruit_PCA9685.PCA9685()
при создании передается адрес I2C оборудования(если не указать будет использован адрес по умолчанию 0x40). На модуле есть специальные контактные площадки, перемыкая которые, можно изменить адрес ведомого устройства на шине I2C.
После задается частота ШИМ-сигнала, равная 50Гц:
pwm.setPWMFreq(50)
что соответствует подаче импульсов каждые 20мс.
ШИМ-сигнал передается на один из каналов с помощью команды:
pwm.setPWM(0, 0, pulse_len)
где первый аргумент это номер канала, второй аргумент определяет такт с которого начинается импульс(каждый цикл ШИМ-сигнала разделяется на 4096 тактов), третий аргумент указывает такт на котором импульс обрывается.
Необходимое оборудование
- плата Raspberry Pi - 1шт.;
- Servo HAT - 1шт.;
- сервопривод - 1 шт.;
Схема
Будьте осторожны при обращении с портами GPIO вашего Raspberry Pi. Помните входы и выходы GPIO расссчитаны на напряжение +3,3В |
Сервоприводы подключаются к удобной колодке выводов модуля расширения, смонтированного поверх платы Raspberry Pi. Модуль Servo HAT получает питание от вывода 3.3V платы Raspberry Pi. Цепь питания модуля изолирована от цепи питания сервоприводов, которым необходим внешний источник питания 5В.
Контактная колодка модуля позволяет подключать все сервоприводы последовательно один за другим. Не забывайте следить за полярностью выводов.
Все манипуляции по подключению производите только при отключенном питании платы Raspberry Pi |
Код
Python 2.X
from Tkinter import *
import Adafruit_PCA9685
import time
pwm = Adafruit_PCA9685.PCA9685() # по умолчанию, если не введен адрес устройства, используется адрес 0x40
pwm.setPWMFreq(50)
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
scale = Scale(frame, from_=0, to=180,
orient=HORIZONTAL, command=self.update)
scale.grid(row=0)
def update(self, angle):
pulse_len = int(float(angle) * 500.0 / 180.0) + 110
pwm.setPWM(0, 0, pulse_len)
pwm.setPWM(1, 0, pulse_len)
root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()
Python 3.X
from tkinter import *
import Adafruit_PCA9685
import time
pwm = Adafruit_PCA9685.PCA9685() # по умолчанию, если не введен адрес устройства, используется адрес 0x40
pwm.setPWMFreq(50)
class App:
def __init__(self, master):
frame = Frame(master)
frame.pack()
scale = Scale(frame, from_=0, to=180,
orient=HORIZONTAL, command=self.update)
scale.grid(row=0)
def update(self, angle):
pulse_len = int(float(angle) * 500.0 / 180.0) + 110
pwm.setPWM(0, 0, pulse_len)
pwm.setPWM(1, 0, pulse_len)
root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()