Сервопривод Circuitpython действует странно

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

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

Ниже приведен код, который мы используем. Базовая установка состоит в том, что сервопривод соединен с рычагом к этому держателю, который должен двигаться в направлении принятия определенного угла. изображение показывает приблизительный вид того, как они связаны, на самом деле это точка привязки, которая связана в приведенном выше альбоме imgur. Так что нет проблемы с тем, как они связаны.

Есть ли какая-то конкретная часть кода, которая, кажется, заставляет сервопривод работать не так, как должен?

Спасибо!

########## Import Libraries ############

import pid
import time
import board
import pulseio
import busio
from adafruit_motor import servo
import adafruit_hcsr04
import adafruit_bno055

########## Port Setup ############

AFT = servo.Servo(pulseio.PWMOut(board.D10, duty_cycle=2 ** 15, frequency=50))
# Initialize Aft foil servo
SB = servo.Servo(pulseio.PWMOut(board.D11, duty_cycle=2 ** 15, frequency=50))
# Initialize Forward Starbaord foil servo
PORT = servo.Servo(pulseio.PWMOut(board.D12, duty_cycle=2 ** 15, frequency=50))
# Initialize Forward Port foil servo

HEIGHT = adafruit_hcsr04.HCSR04(board.D5, board.D7)
# Initialize ultrasonic height sensor

i2c = busio.I2C(board.SCL, board.SDA)
# Initialize I2C protocol
BNO = adafruit_bno055.BNO055(i2c)
# Initialize BNO055 9DOF sensor

########## PID Values ############
P = 1
I = 1
D = .1
Target = 0
giveup = 45

########## PID setup ############
pid = pid.PID(P, I, D)
pid.SetPoint = Target
pid.setSampleTime(.5) # sample time set for half seconds

########## Run Pid ############
def RunPid(target):
    PITCH = BNO.euler[2]
    pid.SetPoint = target
    pid.update(PITCH)
    control = pid.output
    return control, PITCH

########## PITCH Control ############
def PitchControl(Target):
    PID_control = int(RunPid(Target)[0])
    angle = RunPid(Target)[1]
    Servo = 90 + PID_control
    AFT.angle = Servo
    time.sleep(.05)

    return PID_control, angle, Servo



while True:
    for angle in range(0, 180, 5):  # 0 - 180 degrees, 5 degrees at a time.
        AFT.angle = angle
        time.sleep(0.05)
    for angle in range(180, 0, -5): # 180 - 0 degrees, 5 degrees at a time.
        AFT.angle = angle
        time.sleep(0.05)
#     time.sleep(1)

0 ответов

Другие вопросы по тегам