Raspberry Pi:Примеры/Управление сервоприводом: различия между версиями
Myagkij (обсуждение | вклад) (→Схема) |
Нет описания правки |
||
Строка 20: | Строка 20: | ||
В нашей программе частота [[ШИМ-сигнал]]а равна 100Гц: | В нашей программе частота [[ШИМ-сигнал]]а равна 100Гц: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
pwm = GPIO.PWM(18, 100) | pwm = GPIO.PWM(18, 100) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 56: | Строка 56: | ||
===Python 2.X=== | ===Python 2.X=== | ||
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
from Tkinter import * | from Tkinter import * | ||
import RPi.GPIO as GPIO | import RPi.GPIO as GPIO | ||
Строка 89: | Строка 89: | ||
===Python 3.X=== | ===Python 3.X=== | ||
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
from tkinter import * | from tkinter import * | ||
import RPi.GPIO as GPIO | import RPi.GPIO as GPIO |
Текущая версия от 18:24, 14 мая 2023
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Черновик |
Управление сервоприводом
Данный пример демонстрирует как задать угол поворота сервопривода.
Угол поворота изменяется шириной импульса ШИМ-сигнала. ШИМ-сигнал на выходе 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.
Запустите программу и вы увидите графический интерфейс со слайдером:
Изменяйте положение ползунка и понаблюдайте за положением рычага сервопривода.
Необходимое оборудование
- плата Raspberry Pi - 1шт.;
- сервопривод - 1 шт.;
- пара перемычек;
- макетная плата;
- резистор 1кОм(необязательно) - 1шт.;
- блок питания на 5В(необязательно) - 1шт.;
Схема
Будьте осторожны при обращении с портами 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()