Raspberry Pi:Примеры/Управление сервоприводом

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


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

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

Угол поворота изменяется шириной импульса ШИМ-сигнала. ШИМ-сигнал на выходе Raspberry Pi нестабилен и вызывает дрожание механизма сервопривода.

Будьте осторожны! Если у вас старая модель Raspberry Pi, желательно запитать сервопривод от отдельного источника питания. В противном случае вы можете повредить контакты GPIO. К новым моделям Raspberry Pi можно подключать маломощные сервоприводы напрямую т.к. в них применяется усовершенствованный регулятор напряжения.


Сервопривод относится к двигателям прерывного действия, вал поворачивается только на заданный угол(0-180).

Угол поворота определяется длительностью ШИМ-сигнала. Минимальная частота сигнала, воспринимаемая сервоприводом составляет 1/20мс. Как видно из рисунка снизу, при длительности импульса в 1мс, угол поворота равен нулю, при 1,5мс угол равен 90, а при 2мс угол равен 180.

В нашей программе частота ШИМ-сигнала равна 100Гц:

pwm = GPIO.PWM(18, 100)

т.е. по импульсу каждые 10мс. Угол поворота зависит от коэффициента заполнения сигнала, который принимает значения от 0 до 100.

Запустите программу и вы увидите графический интерфейс со слайдером:

Изменяйте положение ползунка и понаблюдайте за положением рычага сервопривода.

Необходимое оборудование

Схема

Будьте осторожны при обращении с портами GPIO вашего Raspberry Pi. Помните входы и выходы GPIO расссчитаны на напряжение +3,3В


Резистор в схеме необязателен и установлен для защиты контакта от скачков управляющих сигналов.


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


Код

Python 2.X

from Tkinter import *
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 100)
pwm.start(5)

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):
        duty = float(angle) / 10.0 + 2.5
        pwm.ChangeDutyCycle(duty)

root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()

Python 3.X

from tkinter import *
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
pwm = GPIO.PWM(18, 100)
pwm.start(5)

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):
        duty = float(angle) / 10.0 + 2.5
        pwm.ChangeDutyCycle(duty)

root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()

См.также

Внешние ссылки