Raspberry Pi:Примеры/Управление сервоприводом с применением ServoBlaster: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
 
Нет описания правки
 
Строка 16: Строка 16:
Установим [[ServoBlaster]], введя поочередно в терминале команды:
Установим [[ServoBlaster]], введя поочередно в терминале команды:


<syntaxhighlight lang="bash" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="bash" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
git clone git://github.com/richardghirst/PiBit.git
git clone git://github.com/richardghirst/PiBit.git
cd PiBits/ServoBlaster/user
cd PiBits/ServoBlaster/user
Строка 31: Строка 31:
Программа сначала вызывает функцию '''map()''', которая масштабирует угол поворота [[сервопривод]]а в длительность импульса исходя из значений '''servo_min''' и '''servo_max'''. Далее в функции '''set_angle()''' генерируется команда:
Программа сначала вызывает функцию '''map()''', которая масштабирует угол поворота [[сервопривод]]а в длительность импульса исходя из значений '''servo_min''' и '''servo_max'''. Далее в функции '''set_angle()''' генерируется команда:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
command = "echo {}={}us > /dev/servoblaster".format(servo, pulse)
command = "echo {}={}us > /dev/servoblaster".format(servo, pulse)
</syntaxhighlight>
</syntaxhighlight>
Строка 37: Строка 37:
в которой после [[echo]], вместо '''{}={}''' будет указан номер [[сервопривод]]а и длительность импульса, который будет на него подан. Строковая часть команда будет передана на /dev/servoblaster. После выполнения команды:
в которой после [[echo]], вместо '''{}={}''' будет указан номер [[сервопривод]]а и длительность импульса, который будет на него подан. Строковая часть команда будет передана на /dev/servoblaster. После выполнения команды:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
os.system(command)
os.system(command)
</syntaxhighlight>
</syntaxhighlight>
Строка 48: Строка 48:
Если вам временно нужно "убить" [[ServoBlaster]], чтобы получить доступ к выводам GPIO можете выполнить команду:
Если вам временно нужно "убить" [[ServoBlaster]], чтобы получить доступ к выводам GPIO можете выполнить команду:


<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash">
sudo killall servod
sudo killall servod
</syntaxhighlight>
</syntaxhighlight>
Строка 54: Строка 54:
Если вы хотите отключить [[ServoBlaster]], то выполните следующую команду:
Если вы хотите отключить [[ServoBlaster]], то выполните следующую команду:


<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash">
sudo update-rc.d servoblaster disable
sudo update-rc.d servoblaster disable
</syntaxhighlight>
</syntaxhighlight>
Строка 60: Строка 60:
После чего потребуется перезагрузка:
После чего потребуется перезагрузка:


<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash">
sudo reboot
sudo reboot
</syntaxhighlight>
</syntaxhighlight>
Строка 66: Строка 66:
Если вы захотите вернуть [[ServoBlaster]], то выполните следующую команду:
Если вы захотите вернуть [[ServoBlaster]], то выполните следующую команду:


<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash">
sudo update-rc.d servoblaster enable
sudo update-rc.d servoblaster enable
</syntaxhighlight>
</syntaxhighlight>
Строка 72: Строка 72:
После чего потребуется перезагрузка:
После чего потребуется перезагрузка:


<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash">
sudo reboot
sudo reboot
</syntaxhighlight>
</syntaxhighlight>
Строка 124: Строка 124:
===Python 2.X===
===Python 2.X===


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
from Tkinter import *
from Tkinter import *
import os
import os
Строка 169: Строка 169:
===Python 3.X===
===Python 3.X===


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
from tkinter import *
from tkinter import *
import os
import os

Текущая версия от 18:24, 14 мая 2023

Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Управление сервоприводом с применением ServoBlaster

Данный пример демонстрирует как задать угол поворота сервопривода.

Будьте осторожны! Если у вас старая модель Raspberry Pi, желательно запитать сервопривод от отдельного источника питания. В противном случае вы можете повредить контакты GPIO. К новым моделям Raspberry Pi можно подключать маломощные сервоприводы напрямую т.к. в них применяется усовершенствованный регулятор напряжения.


При использовании функции PWM() модуля RPi.GPIO для управления сервоприводом можно столкнуться с нестабильным ШИМ-сигналом на выводах GPIO, что может выражаться дрожанием механизма сервопривода.

Эту проблему можно решить, установив ServoBlaster, разработанную Ричардом Херстом. В отличие от RPi.GPIO, в ServoBlaster за точность подачи импульсов управляющего сигнала отвечает аппаратный генератор тактовых сигналов процессора.

Установим ServoBlaster, введя поочередно в терминале команды:

git clone git://github.com/richardghirst/PiBit.git
cd PiBits/ServoBlaster/user
sudo make
sudo make install

Запустите программу из раздела код и вы увидите графический интерфейс со слайдером:

Изменяйте положение ползунка и понаблюдайте за положением рычага сервопривода, перемещение рычага сервопривода должны быть плавными.

Программа сначала вызывает функцию map(), которая масштабирует угол поворота сервопривода в длительность импульса исходя из значений servo_min и servo_max. Далее в функции set_angle() генерируется команда:

command = "echo {}={}us > /dev/servoblaster".format(servo, pulse)

в которой после echo, вместо {}={} будет указан номер сервопривода и длительность импульса, который будет на него подан. Строковая часть команда будет передана на /dev/servoblaster. После выполнения команды:

os.system(command)

сервопривод повернется на угол, соответствующий значению, которое определяется длительностью импульса.

При запущенной службе servo.d(ServoBlaster), выводы GPIO, к которым подключен сервопривод и аудио разъём будут недоступны другим процессам.

Если вам временно нужно "убить" ServoBlaster, чтобы получить доступ к выводам GPIO можете выполнить команду:

sudo killall servod

Если вы хотите отключить ServoBlaster, то выполните следующую команду:

sudo update-rc.d servoblaster disable

После чего потребуется перезагрузка:

sudo reboot

Если вы захотите вернуть ServoBlaster, то выполните следующую команду:

sudo update-rc.d servoblaster enable

После чего потребуется перезагрузка:

sudo reboot


В данном примере мы использовали только один канал управления сервоприводом, но драйвер ServoBlaster позволяет задействовать все выводы GPIO. По умолчанию ServoBlaster поддерживает 8 каналов управления:

Канал сервопривода Номер BCM
0 4
1 17
2 18
3 27
4 22
5 23
6 24
7 25

Необходимое оборудование

Схема

Будьте осторожны при обращении с портами GPIO вашего Raspberry Pi. Помните входы и выходы GPIO расссчитаны на напряжение +3,3В


Резистор в схеме необязателен и установлен для защиты контакта от скачков управляющих сигналов.


Все манипуляции по подключению производите только при отключенном питании платы Raspberry Pi


Код

Python 2.X

from Tkinter import *
import os
import time

servo_min = 500  # uS
servo_max = 2500  # uS

servo = 2 # GPIO 18
  
def map(value, from_low, from_high, to_low, to_high): 
  from_range = from_high - from_low
  to_range = to_high - to_low
  scale_factor = float(from_range) / float(to_range)
  return to_low + (value / scale_factor)
  
  
def set_angle(angle):
  pulse = int(map(angle, 0, 180, servo_min, servo_max))
  command = "echo {}={}us > /dev/servoblaster".format(servo, pulse)
  os.system(command)
  
    
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):
        set_angle(float(angle))

root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()

Python 3.X

from tkinter import *
import os
import time

servo_min = 500  # uS
servo_max = 2500  # uS

servo = 2 # GPIO 18
  
def map(value, from_low, from_high, to_low, to_high): 
  from_range = from_high - from_low
  to_range = to_high - to_low
  scale_factor = float(from_range) / float(to_range)
  return to_low + (value / scale_factor)
  
  
def set_angle(angle):
  pulse = int(map(angle, 0, 180, servo_min, servo_max))
  command = "echo {}={}us > /dev/servoblaster".format(servo, pulse)
  os.system(command)
  
    
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):
        set_angle(float(angle))

root = Tk()
root.wm_title('Servo Control')
app = App(root)
root.geometry("200x50+0+0")
root.mainloop()

См.также

Внешние ссылки