Итак ставим перед собой задачу: управлять серво-мотором от 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 мс. Ширина этого импульса будет преобразована в угол поворота серво.
Как не сжечь Arduino и ESP32: GPIO, токи и напряжения простыми словами
Как не сжечь Arduino и ESP32: GPIO, токи и напряжения простыми словами Arduino и ESP32 не «нежные..
Модуль реле одноканальный 5В 10А
Одноканальный модуль реле для подключения напрямую к дискретному выходу контроллера. Светодиодная ин..
43.11грн.
Электро насос прозрачный 12 В 100°С
Насос работает на основе диафрагмы и может применяться для перекачки пищевых продуктовРасход жидкост..
269.59грн.
Двойной шилд расширения для WeMos D1 Mini
Шилд для параллельного выстраивания модулей платы WiFi контроллера WeMos D1 MiniТакое построени..
40.40грн.
Набор перемычек (папа-папа) 40шт 10см
Набор соединительных проводов для соединения плат контроллера с периферией без пайки. Подходят под с..
76.14грн.





