Итак ставим перед собой задачу: управлять серво-мотором от Raspberry PI, используя визуальный элемент на экране.
Мы будем генерировать широтно-импульсный сигнал PWM на дискретном выходе мини-компьютера и задавая длительность отдельного положительного импульса сигнала будем изменять угол поворота серво-двигателя. Так же мы должны изначально понимать, что на дискретном выходе Raspberry не получится супер-стабильных временных параметров сигнала, и поэтому серво всегда будет немного дёргать вместо стояния на месте.
Сам двигатель прийдется запитать от отдельного источника питания 5-6 В, чтобы не навредить любимой малинке.
Для данного проекта нам понадобятся такие составляющие:
- Servo - мотор;
- Монтажная плата и соединительные провода;
- Резистор сопротивлением 1 кОм;
- Блок питания 5 В 1 А (для двигателя)

Резистор 1 кОм не обязателен, но он защитит дискретный выход малинки от случайных замыканий.
Выводы серво-мотора по цвету могут отличаться у разных моделей - обратите на это внимание и поищите инфу. Но чаще всего у них красный - вывод питания 5 В, коричневый - земля и сигнальный провод - оранжевый.
Двигатель можно запитать от сетевого блока питания или от блока батареек.
Интерфейс пользователя для задания угла поворота шпинделя серво будет основана готовой программе из интернета gui_slider.py на языке Python, созданной для управления яркостью света. Но мы изменим её для изменения задания мотору в градусах от 0 до 180. Выглядит это так как на рисунке.

Запускаем консольную или графическую часть линукса на Raspberry PI, открываем текстовый редактор (nano или IDLE) и вставляем в него следующий код. Даем файлу название servo.py.
Кстати такой графический интерфейс пользователя не будет виден из окна SSH.
Запускать программу необходимо от имени администратора. В командной консоли это будет выглядеть так sudo python servo.py
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()
Сама графическая часть проекта основана на библиотеке Tkinter. Почитайте о ней по подробнее в вики. На ней можно строить сложные интерфейсы с кнопками, выпадающими списками, картинками...

Наша программа будет выдавать широтно-импульсный сигнал PWM частотой 100 Гц. Это означает, что положительный импульс будет генерироваться каждые 10 мс. Ширина этого импульса будет преобразована в угол поворота серво.
Модуль P-channel MOSFET 50A с опторазвязкой (IRF4905, 30В, 3–5В управление)
Модуль P-channel MOSFET на базе транзистора IRF4905 предназначен для коммутирования мощных нагрузок ..
177.66грн.
Разработка электроники и печатных плат в Украине
Ищете опытного инженера для разработки электроники, IoT-устройств или печатных плат в Украине? М..
Набор перемычек (папа-папа) 40шт 20см
Набор соединительных проводов для соединения плат контроллера с периферией без пайки. Подходят под с..
88.83грн.
Обмен данными между двумя Arduino при помощи программного UART
Обмен данными между двумя Arduino при помощи программного UARTКоммуникация по последовательному порт..
Двигатель 12В с редуктором 150RPM
Коллекторный двигатель постоянного тока с сильным редуктором для использования в различной робототех..
575.28грн.





