Частота ШИМ и рабочий цикл на Raspberry Pi для ESC с использованием PCA9685 - PullRequest
0 голосов
/ 02 октября 2019

Я использую 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()

Я действительно застрял, и у меня есть только неделя, чтобы заставить эту демонстрацию работать, кто-нибудь может мне помочь справиться с этим?

...