RoboxКомплект из сервопривода и датчика расстояния
V.4Лабораторный стенд Promobot
RRStudioПростое написание алгоритмов
TestDevicesТестирование оборудования и проверка связи
Настройка WSL2Windows Subsystem for Linux
TelegramНаписать в чат технической поддержки
# Импортирование необходимых библиотек
# Библиотека для построения графиков
import matplotlib.pyplot as plt
# Библиотека для работы с сервоприводом
import Servo
# Библиотека для работы с таймерами и задержками
import time
# Библиотека для работы с интерфейсной платой
import bus_handler
# Библиотека для асинхронного запуска задач.
# Timer позволяет выполнить отложенный вызов функции
# через определенный промежуток времени
from threading import Timer
# Порт шины данных.
# По умолчанию для ubuntu - /dev/RS_485
port = '/dev/RS_485'
# Адрес сервопривода. По умолчанию 10
servo_id = 10
# Инициализация шины передачи данных
master = bus_handler.Bus(port = port, baudrate = 460800, debug = False, timeout = 1.0)
# Инициализация сервопривода
servo = Servo.Servo(servo_id, master.bus)
# Желаемая позиция сервопривода
set_point = 4000
# Интервал в секундах между чтением данных с сервопривода
t_step = 0.01
# Общее время в секундах построения графика
plot_time = 2.0
# Время в секундах от начала построения графика для перемещения сервопривода в желаемую позицию
move_start_time = 0.3
# Переменные для графика
x = []
y_position = []
y_setpoint = []
# Инициализация графика
fig = plt.figure()
data = fig.add_subplot(111)
data.set_xlabel('Time')
data.set_ylabel('Servo_value')
data.set_title('Servo step response')
data.autoscale(enable=True, axis='both', tight=None)
# Включим сервопривод, выставим вал в начальное положение
servo.set_torque(1)
servo.set_point(0)
# Дождемся выставления вала в ноль с некоторой погрешностью +- 15 тиков
while not (-15 <= servo.get_data()["Position"] <= 15):
time.sleep(0.01)
# Запуск таймера
start = time.time()
# Список точек, точка состоит из 2-х чисел - время и желаемое положение
points = [
(0.3, 4000),
(0.75, 4500),
(1, 3500),
(1.15, 4000),
(1.30, 3500),
(1.5, 4000),
]
# Запустим выставление положений через заданный промежуток времени
# t сокращение от слова time, p сокращение от слова position
for t, p in points:
Timer(t, servo.set_point, (p,), kwargs=None).start()
while (time.time() - start) < plot_time:
# Чтение данных с сервопривода
vals = servo.get_data()
# Запишем время итерации на график
x.append(time.time() - start)
# Отображение двух значений от сервопривода: текущей позиции вала двигателя и желаемой позиции
y_position.append(vals["Position"])
y_setpoint.append(vals["Setpoint"])
time.sleep(t_step)
# Выключим сервопривод
servo.set_torque(0)
# Вывод графика на экран
data.plot(x, y_position,color="blue",label="Position")
data.plot(x, y_setpoint,color="red",label="Setpoint")
data.legend()
plt.show()