Я использую Raspberry Pi и Adafruit 16Ch PCA9685 PWM Hat, мне было поручено установить небольшую демонстрационную часть оборудования для нашего счетчика, я заплатил разработчику Python, которого больше нет, чтобы написать мненекоторый код, который никогда не работал.
По сути, у нас есть ESC и три сервопривода. Код имел несколько функций, но по своей сути он должен быть в состоянии включить ESC (слышать звуковой сигнал, ждать импульса), перемещать сервоприводы в определенные позиции в зависимости от вызываемого сценария.
Проблема в том, что с написанным кодом он не ставит ESC на охрану, он ничего не делает, но выполнение последнего кода приводит к постановке и запуску esc / motor и перемещению всех сервоприводов
Установить код по умолчанию
"""
@file: gendefs.py
Defines all GPIO and Servo values, ESC speeds plus any additional generics.
"""
from enum import Enum
""" Connect servos to these channels on the PCA9685. """
class ServID(Enum):
SERV_0 = 0
SERV_1 = 1
SERV_2 = 2
""" Set this to desired servo closed and open angles. """
class ServState(Enum):
CLOSED = 0
POS_1 = 60
POS_2 = 120
""" Connect the ESC to this GPIO pin. """
ESC = 4
""" ESC default speeds (pulse width). """
class ESC_PW(Enum):
STOP = 0
MIN = 700 # Change this to your ESC's min value
IDLE = 1000 # Change this to your preferred speed
MAX = 2000 # Change this to your ESC's max value
""" Call this to set all servos to their closed position. """
def close_servos(kit):
for serv in ServID:
kit.servo[serv.value].angle = ServState.CLOSED.value
""" Set specific servo to an open position. Close all other servos. """
def set_servo(kit, serv_id, serv_pos):
if serv_id not in ServID:
raise RuntimeError("Servo ID must be member of ServID class!")
if serv_pos not in ServState:
raise RuntimeError("Servo position must be member of ServState class!")
# All servos except the selected one will close.
to_close = list(ServID)
to_close.remove(serv_id)
for serv in to_close:
kit.servo[serv.value].angle = ServState.CLOSED.value
# Move selected servo to open position.
kit.servo[serv_id.value].angle = serv_pos.value
Код ESC рычага
#!/usr/bin/env python
"""
@file: arm.py
Just arms the ESC, nothing else.
"""
import time
import adafruit_servokit
import pigpio
from gendefs import ESC, ESC_PW, close_servos
if __name__ == "__main__":
pi = pigpio.pi()
kit = adafruit_servokit.ServoKit(channels=16)
# All servos are set to closed position.
close_servos(kit)
# Arming procedure for the ESC.
pi.set_servo_pulsewidth(ESC, ESC_PW.STOP.value)
time.sleep(1)
pi.set_servo_pulsewidth(ESC, ESC_PW.MAX.value)
time.sleep(1)
pi.set_servo_pulsewidth(ESC, ESC_PW.MIN.value)
time.sleep(1)
Запуск ESC при коде холостого хода
#!/usr/bin/env python
"""
@file: idle.py
Sets the ESC to its normal velocity. To tweak the pulse width, edit
'gendefs.py'.
"""
import adafruit_servokit
import pigpio
from gendefs import ESC, ESC_PW, close_servos
if __name__ == "__main__":
pi = pigpio.pi()
kit = adafruit_servokit.ServoKit(channels=16)
# Servos are set to closed position.
close_servos(kit)
# Sets ESC to idle speed.
pi.set_servo_pulsewidth(ESC, ESC_PW.IDLE.value)
Код естественного положения
#!/usr/bin/env python
"""
@file: natural.py
Sets all servos to closed position. ESC is kept unarmed. Assumes GPIO library
is already launched. Assumes frequency for the PCA9685 is already set.
"""
import adafruit_servokit
import pigpio
from gendefs import ESC, ESC_PW, close_servos
if __name__ == "__main__":
pi = pigpio.pi()
kit = adafruit_servokit.ServoKit(channels=16)
# Servos are set to closed position.
close_servos(kit)
# ESC remains unarmed
pi.set_servo_pulsewidth(ESC, ESC_PW.STOP.value)
Примеркод позиционного движения (переместите все сервоприводы в нейтральное положение, переместите сервопривод x в это положение, запустите двигатель)
#!/usr/bin/env python
"""
@file: serv0_pos1.py
Sets servo 0 to first open position, all other servos to closed position.
Assumes ESC is already in IDLE state.
"""
import adafruit_servokit
from gendefs import ServID, ServState, set_servo
if __name__ == "__main__":
kit = adafruit_servokit.ServoKit(channels=16)
# All servos are set to closed position.
set_servo(kit, ServID.SERV_0, ServState.POS_1)
Если я введу приведенный ниже код, он переместит все сервоприводы, активирует ESC и раскрутит двигатель
#!/usr/bin/env python
import time
import PCA9685
import pigpio
pi = pigpio.pi()
if not pi.connected:
exit(0)
pwm = PCA9685.PWM(pi) # defaults to bus 1, address 0x40
pwm.set_frequency(50) # suitable for servos
for dc in range(5, 11):
pwm.set_duty_cycle(-1, dc) # -1 for all channels
time.sleep(1)
for pw in range(1000, 2050, 50):
pwm.set_pulse_width(-1, pw) # -1 for all channels
time.sleep(1)
pwm.cancel()
pi.stop()
Я действительно застрял, и у меня есть только неделя, чтобы заставить эту демонстрацию работать, кто-нибудь может мне помочь справиться с этим?