Працюємо з 09:00 до 19:00 без вихідних
Київ біля ТЦ Квадрат бул.Перова

Отже ставимо перед собою задачу: керувати серво-мотором від 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 мс. Ширина цього імпульса буде перетворена в кут повороту серво.

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Звуковий сигналізатор 16 Ом

Звуковий сигналізатор 16 Ом

Пасивный звуковий сигналізатор для підключення до дискретного виходу контролераМініатюрний розмірОпі..

5.24грн.

KiCad безкоштовна програма малювання схем та розробки друкованих плат

KiCad безкоштовна програма малювання схем та розробки друкованих плат

Сьогодні поговоримо про мега-корисну та доступну програму KiCad. Попрацювавши в ній кожен захоче від..

AT24C02 EEPROM I2C

AT24C02 EEPROM I2C

Мікросхема постійної пам'яті EEPROMНапруга живлення 2,7 ... 5,5 ВОб'єм 256 БайтКоммунікація I2C..

2.96грн.

Мініатюрний NodeMcu ESP8266 від WeMos D1 mini

Мініатюрний NodeMcu ESP8266 від WeMos D1 mini

Дуже маленька і дешева плата контролера з WiFi зв'язком на борту. Має не багато вільних входів-виход..

116.60грн.

Цифровий датчик температури та вологості DHT11 з підтягуючим резистором

Цифровий датчик температури та вологості DHT11 з підтягуючим резистором

Вимірювання відносної вологості в межах 20 ... 90 %Точність вимірювання вологості ± 5,0 %RHВимірюван..

45.30грн.