Итак ставим перед собой задачу: управлять серво-мотором от 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 - что это такое? Популярно для начинающих
Самые популярные платы контроллеров популярно для начинающихArduino это недорогая, доступная в смысл..
Линейный шаговый двигатель - что это?
Линейный шаговый двигатель Привет, друзья! Мне выпала удачная возможность познакомить вас с, разр..
Модуль 4-х MOSFET транзисторов 20А
Модуль для коммутации 4-х мощных нагрузок постоянного тока при помощи управляющих сигналов от контро..
220.46грн.
Набор нейлоновых стоек М3
Монтажные стойки разных размеров с шестигранным сечением и резьбой крепления М3Применяются для монта..
297.96грн.
Схемы включения транзистора
Любой усилитель, независимо от частоты, содержит от одного до нескольких каскадов усиления. Для того..