Сервопривод 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)