执行器

汽车需要一种前进和后退以及左右转向的方式。我们通常称在机器人中产生物理运动的设备为"执行器"。常见的执行器包括直流电机、舵机、连续旋转舵机和步进电机。这些执行器可以以许多不同的方式组合,以推动和转向机器人。Donkeycar支持两种常见的配置,可以使用各种执行器来实现:

  • 类似汽车的车辆通过将前轮向左或向右倾斜来转向,并通过将驱动轮向前或向后转动来移动。常见的遥控车属于这一类别。
  • 差速驱动车辆具有两个独立控制的驱动轮,用于提供运动和转向。例如,差速驱动车辆可以通过以相同速度将两个驱动轮向前转动来直行。为了转弯,一个电机可以比另一个电机转得快,车辆将朝着速度较慢的电机方向转弯。差速驱动车辆在本页面的末尾附近的一个部分中进行了讨论。

执行器接收来自Donkeycar的控制信号以控制它们的动作。有几种选项可以生成这些控制信号。

  • PCA9685舵机控制板
  • RPi/Jetson 40引脚GPIO头
  • Arduino

接下来,我们将描述支持的执行器设置及其控制信号的软件配置。

标准遥控车及其电调和转向舵机

标准遥控车配备了一个转向舵机用于操控前轮,并且有一个电调(电子调速器)来控制驱动车轮的直流电机的速度。转向舵机和电调都接收脉宽调制(PWM)控制信号。PWM信号是一个具有特定持续时间和频率的方波脉冲。对于转向舵机而言,PWM信号确定了舵机臂的位置,通常在0度(最右)和180度(最左)之间。对于电调而言,PWM信号确定了驱动电机的方向和速度,从完全反向,经过停止,到完全前进。

  • 标准遥控舵机的脉冲范围从1毫秒(电调的全反向,舵机的全左转)到2毫秒(电调的全前进,舵机的全右转),其中1.5毫秒是中立位置(电调停止,舵机直行)。
  • 这些脉冲通常以50赫兹的频率发送(每20毫秒一个周期)。一个周期包括一个信号高电平的时间段,然后是一个信号低电平的时间段。这意味着,在标准的50赫兹频率下,1毫秒的脉冲(1毫秒高电平加上19毫秒低电平)表示一个5%的占空比,而2毫秒的脉冲表示一个10%的占空比。
  • 最重要的部分是脉冲的长度,它必须在1到2毫秒的范围内。

典型舵机的PWM定时图(维基百科)

  • 这意味着如果使用不同的频率,则必须调整占空比以获得1毫秒到2毫秒的脉冲。
  • 例如,如果使用60赫兹频率,则1毫秒的脉冲需要一个占空比为0.05 * 60 / 50 = 0.06(6%)的占空比。
  • 我们将PCA9685的默认频率设置为60赫兹,因此配置中的脉冲通常基于60赫兹频率和12位值。我们使用12位值是因为PCA9685具有12位分辨率。因此,1毫秒的脉冲为0.06 * 4096约等于246,0.09占空比的中立脉冲为0.09 * 4096约等于367,0.12占空比的全前进脉冲为0.12 * 4096约等于492。
  • 这些是对API调用参数和校准时生成的值有用的概括。最终的占空比/脉冲长度的选择取决于您的硬件和策略(您可能不希望速度过快,因此可能选择较低的最大油门PWM)。

使用PCA9685舵机控制器生成PWM脉冲

  • PCA9685 I2C舵机驱动板的硬件连接在整体设置说明中有详细描述 这里
  • PCA9685舵机控制器通过40引脚总线上的I2C引脚与Raspberry Pi或Jetson Nano连接,然后将来自电调和转向舵机的3针电缆连接到PCA9685,通常分别连接到通道0和通道1。请参阅第4步:连接舵机扩展板。将PCA9685连接到Jetson Nano的方法相同。

配置

  • myconfig.py中使用 DRIVE_TRAIN_TYPE = "PWM_STEERING_THROTTLE"
  • myconfig.pyPWM_STEERING_THROTTLE部分中,为PWM_STEERING_PINPWM_THROTTLE_PIN设置使用PCA9685引脚指定器。例如:
    DRIVE_TRAIN_TYPE = "PWM_STEERING_THROTTLE"

    #
    # PWM_STEERING_THROTTLE
    #
    # 用于带有转向舵机和电调的RC车辆的驱动系统。
    # 使用一个PwmPin用于转向(舵机),使用第二个PwmPin用于油门(电调)
    # 基本PWM频率假定为60赫兹;使用PWM_xxxx_SCALE来调整非标准PWM频率的脉冲宽度
    #
    PWM_STEERING_THROTTLE = {
        "PWM_STEERING_PIN": "PCA9685.1:40.0",   # PCA9685,I2C总线1,地址0x40,通道0
        "PWM_STEERING_SCALE": 1.0,              # 用于补偿与60赫兹不同的PWM频率;不用于调整转向范围
        "PWM_STEERING_INVERTED": False,         # 如果硬件需要反转的PWM脉冲,则为True
        "PWM_THROTTLE_PIN": "PCA9685.1:40.1",   # PCA9685,I2C总线1,地址0x40,通道1
        "PWM_THROTTLE_SCALE": 1.0,              # 用于补偿与60赫兹不同的PWM频率;不用于增加/限制速度
        "PWM_THROTTLE_INVERTED": False,         # 如果硬件需要反转的PWM脉冲,则为True
        "STEERING_LEFT_PWM": 460,               # 全左转的PWM值
        "STEERING_RIGHT_PWM": 290,              # 全右转的PWM值
        "THROTTLE_FORWARD_PWM": 500,            # 最大前进油门的PWM值
        "THROTTLE_STOPPED_PWM": 370,            # 停止运动时的PWM值
        "THROTTLE_REVERSE_PWM": 220,            # 最大后退油门的PWM值
    }

注意:PWM值(STEERING_LEFT_PWM等)因车辆而异,并通过运行校准过程得出。请参阅校准您的车辆

有关引脚提供程序和引脚指定器的详细讨论,请参阅pins

从40引脚GPIO头部生成PWM脉冲

  • 在这里,PWM信号是从40引脚GPIO头部生成的。 3针电调和舵机连接器上的数据引脚连接到GPIO上的PWM引脚。 3针连接器上的地引脚连接到公共地。 3针连接器上的5V引脚连接到GPIO上的5V引脚:来自电调的3针连接器通常提供5V,可以用来给舵机供电。

配置

  • myconfig.py中使用 DRIVE_TRAIN_TYPE = "PWM_STEERING_THROTTLE"
  • # PWM_STEERING_THROTTLE部分中,为GPIO设置引脚指定器。请注意,每个引脚都有BOARD模式和BCM(Broadcom)模式标识符。您可以使用任一模式,但所有引脚必须使用相同的模式。
  • Raspberry Pi 4b有4个PWM硬件输出;其中3个映射到40引脚头部的引脚(参见https://linuxhint.com/gpio-pinout-raspberry-pi/);请注意,引脚可以通过其板号或内部GPIO号进行寻址(参见https://donkeycar.cn/parts/pins/)。在硬件PWM引脚的情况下,板上的引脚12("RPI_GPIO.BOARD.12")与GPIO18("RPI_GPIO.BCM.18")相同,板上的引脚33("RPI_GPIO.BOARD.33")与GPIO13("RPI_GPIO.BCM.13")相同,板上的引脚32("RPI_GPIO.BOARD.32")与GPIO12("RPI_GPIO.BCM.12")相同。因此,您应该设置您的myconfig.py,使DRIVE_TRAIN_TYPE = "PWM_STEERING_THROTTLE",并且PWM_STEERING_PINPWM_THROTTLE_PIN设置为使用一个硬件PWM引脚进行输出。例如:
DRIVE_TRAIN_TYPE = "PWM_STEERING_THROTTLE"

#
# PWM_STEERING_THROTTLE
#
# 用于带有舵机和电调的遥控汽车的驱动系统。
# 使用一个 PwmPin 用于舵机控制,使用第二个 PwmPin 用于电调控制。
# 基本 PWM 频率假设为 60hz;使用 PWM_xxxx_SCALE 来调整非标准 PWM 频率下的脉冲宽度。
#
PWM_STEERING_THROTTLE = {
    "PWM_STEERING_PIN": "RPI_GPIO.BOARD.33",  # GPIO board 模式下的引脚 33 == BCM 模式下的引脚 13
    "PWM_STEERING_SCALE": 1.0,                 # 用于补偿与 60hz 不同的 PWM 频率;不用于调整舵机范围
    "PWM_STEERING_INVERTED": False,            # 如果硬件要求反向的 PWM 脉冲,则为 True
    "PWM_THROTTLE_PIN": "RPI_GPIO.BOARD.12",   # GPIO board 模式下的引脚 12 == BCM 模式下的引脚 18
    "PWM_THROTTLE_SCALE": 1.0,                 # 用于补偿与 60hz 不同的 PWM 频率;不用于增加/限制速度
    "PWM_THROTTLE_INVERTED": False,            # 如果硬件要求反向的 PWM 脉冲,则为 True
    "STEERING_LEFT_PWM": 460,                  # 全向左转的 PWM 值
    "STEERING_RIGHT_PWM": 290,                 # 全向右转的 PWM 值
    "THROTTLE_FORWARD_PWM": 500,               # 最大前进油门的 PWM 值
    "THROTTLE_STOPPED_PWM": 370,               # 停止运动的 PWM 值
    "THROTTLE_REVERSE_PWM": 220,               # 最大后退油门的 PWM 值
}

注意:PWM 值(如 STEERING_LEFT_PWM)因汽车而异,需要通过运行校准过程来获得。请参阅校准您的汽车

有关引脚提供程序和引脚说明的详细讨论,请参阅pins

使用 Raspberry Pi GPIO 引脚进行直接控制。

请按照此处的说明进行操作。

使用 Robo HAT MM1 板进行控制。

请按照此处的说明进行操作。

Arduino

可以使用 Arduino 以以下方式生成 PWM 信号来控制舵机和电调。

目前,Arduino 模式仅在Latte Panda Delta (LP-D)板上进行了测试。 但是,使用 Raspberry Pi / Jetson Nano(而不是 PCA 9685)也应该很简单。

请参考下面的块图以了解各部分的连接方式。

block diagram

Arduino 板应运行标准 firmata sketch(在下载 Arduino 工具时默认提供的 sketch)。将标准 firmata sketch(位于_Examples > Firmata > StandardFirmata_)加载到 Arduino 上。 wiring diagram 此外,需要通过 pip3 install pymata_aio 在车载计算机上安装 pymata_aio_ Python 包。

如上所示,LattePanda 将 x86 CPU 和连接的 Arduino 结合到一个单板上。

以下图示展示了如何将 Arduino 引脚连接到舵机和电调。

wiring diagram 请注意,舵机的电源由电调的电池消除电路(BEC)提供,大多数电调都提供此功能。 这样做是为了避免从 Arduino 的 5V 引脚提供整个舵机的电源。 在大型遥控汽车中,舵机可能需要高达2安培的电流,这可能导致 Arduino 损坏。

校准

请注意,Arduino 的校准过程/数值与 PCA9685 稍有不同。 通常,90 是中点(即在50 Hz下为1.5毫秒的脉冲宽度),因此建议从90开始,逐渐调整 +/- 5,直到确定所需的舵机范围和油门范围。

(env1) jithu@jithu-lp:~/master/pred_mt/lp/001/donkey$ donkey calibrate --arduino --channel 6
using donkey v2.6.0t ...

pymata_aio Version 2.33 Copyright (c) 2015-2018 Alan Yorinks All rights reserved.

Using COM Port:/dev/ttyACM0

Initializing Arduino - Please wait...
Arduino Firmware ID: 2.5 StandardFirmata.ino
Auto-discovery complete. Found 30 Digital Pins and 12 Analog Pins


Enter a PWM setting to test(0-180)95
Enter a PWM setting to test(0-180)90
Enter a PWM setting to test(0-180)85
...

请注意,在校准命令中传递的 --arduino 开关。此外,请注意通过 --channel 参数传递要校准的 Arduino 引脚。

使用 Arduino 执行器部分

以下代码片段演示了如何在 drive() 循环中使用 Arduino 执行器:

    #Drive train setup
    arduino_controller = ArduinoFirmata(
                                    servo_pin=cfg.STEERING_ARDUINO_PIN,
                                    esc_pin=cfg.THROTTLE_ARDUINO_PIN)

    steering = ArdPWMSteering(controller=arduino_controller,
                        left_pulse=cfg.STEERING_ARDUINO_LEFT_PWM,
                        right_pulse=cfg.STEERING_ARDUINO_RIGHT_PWM)

    throttle = ArdPWMThrottle(controller=arduino_controller,
                        max_pulse=cfg.THROTTLE_ARDUINO_FORWARD_PWM,
                        zero_pulse=cfg.THROTTLE_ARDUINO_STOPPED_PWM,
                        min_pulse=cfg.THROTTLE_ARDUINO_REVERSE_PWM)

    V.add(steering, inputs=['user/angle'])
    V.add(throttle, inputs=['user/throttle'])

请参考 templates/arduino_drive.py 以获取更多详细信息。

HBridge 电机控制器和舵机

在这个配置中,驱动车轮的直流电机由一个L298N HBridge电机控制器或兼容控制。前轮转向通过接收PWM脉冲的舵机来实现。电机驱动器有两种接线方式:3引脚接线和2引脚接线。

3引脚HBridge和舵机

使用L298N控制一个单个直流齿轮电机,使用两个TTL输出引脚选择方向,使用一个PWM引脚控制电机的功率。 L298N Motor Driver Module L298N Motor Driver Module

请参考 https://www.electronicshub.org/raspberry-pi-l298n-interface-tutorial-control-dc-motor-l298n-raspberry-pi/ 了解如何将L298N HBridge模块以3引脚模式连接到Raspberry Pi GPIO的详细讨论。这也适用于其他模拟L298N的驱动芯片,例如TB6612FNG电机驱动器。

配置

  • 在 myconfig.py 中使用 DRIVETRAIN_TYPE = "SERVO_HBRIDGE_3PIN"
  • 使用40引脚GPIO引脚头生成信号的示例引脚配置:
HBRIDGE_3PIN_FWD = "RPI_GPIO.BOARD.18"   # TTL引脚,高电平启动电机正转
HBRIDGE_3PIN_BWD = "RPI_GPIO.BOARD.16"   # TTL引脚,高电平启动电机反转
HBRIDGE_3PIN_DUTY = "RPI_GPIO.BOARD.35"  # 提供给电机的占空比
PWM_STEERING_PIN = "RPI_GPIO.BOARD.33"   # 提供给舵机的PWM脉冲
STEERING_LEFT_PWM = 460         # 左转舵机的PWM值(使用 `donkey calibrate` 测量您的车辆的值)
STEERING_RIGHT_PWM = 290        # 右转舵机的PWM值(使用 `donkey calibrate` 测量您的车辆的值)

也可以使用PCA9685生成所有控制信号。有关引脚提供者和引脚配置的详细讨论,请参见 pins

2引脚HBridge和舵机

使用一个“迷你”L298N HBridge(或L9110S HBridge)控制单个直流齿轮电机,使用2个PWM引脚;一个PWM引脚用于启用和控制正转速度,另一个PWM引脚用于启用和控制反转速度。

L293D Motor Driver Module L293D Motor Driver Module

请参考 https://www.instructables.com/Tutorial-for-Dual-Channel-DC-Motor-Driver-Board-PW/ 了解如何将L298N迷你HBridge模块以2引脚模式连接的详细步骤。 请参考 https://electropeak.com/learn/interfacing-l9110s-dual-channel-h-bridge-motor-driver-module-with-arduino/ 了解如何将L9110S/HG7881电机驱动模块连接。

配置

  • 在 myconfig.py 中使用 DRIVETRAIN_TYPE = "SERVO_HBRIDGE_2PIN"
  • 使用40引脚GPIO引脚头生成信号的示例引脚配置:
HBRIDGE_2PIN_DUTY_FWD = "RPI_GPIO.BOARD.18"  # 提供正转占空比给电机
HBRIDGE_2PIN_DUTY_BWD = "RPI_GPIO.BOARD.16"  # 提供反转占空比给电机
PWM_STEERING_PIN = "RPI_GPIO.BOARD.33"       # 提供给舵机的PWM脉冲
STEERING_LEFT_PWM = 460         # 左转舵机的PWM值(使用 `donkey calibrate` 测量您的车辆的值)
STEERING_RIGHT_PWM = 290        # 右转舵机的PWM值(使用 `donkey calibrate` 测量您的车辆的值)

也可以使用PCA9685生成所有控制信号。有关引脚提供者和引脚配置的详细讨论,请参见 pins

用于转向和油门的HBridge

一些非常廉价的玩具车使用一个直流电机驱动后轮的前进和后退,另一个直流电机用于将前轮左右转向。可以使用单个L298N HBridge(或L9110S HBridge)来控制这两个电机。该驱动程序假设使用2引脚接线,其中每个电机使用两个PWM引脚,一个用于每个方向。

配置

  • 在 myconfig.py 中使用 DRIVETRAIN_TYPE = "DC_STEER_THROTTLE"
  • 使用40引脚GPIO引脚头生成信号的示例引脚配置:
HBRIDGE_PIN_LEFT = "RPI_GPIO.BOARD.18"   # 产生向左转向的占空比的PWM引脚
HBRIDGE_PIN_RIGHT = "RPI_GPIO.BOARD.16"  # 产生向右转向的占空比的PWM引脚
HBRIDGE_PIN_FWD = "RPI_GPIO.BOARD.15"    # 产生向前驱动的占空比的PWM引脚
HBRIDGE_PIN_BWD = "RPI_GPIO.BOARD.13"    # 产生向后驱动的占空比的PWM引脚

也可以使用PCA9685生成所有控制信号。有关引脚提供者和引脚配置的详细讨论,请参见 pins

用于转向和油门的VESC

VESC是ESC的先进版本,它为您提供了许多自定义选项来控制ESC的操作。它包括再生制动、温度控制等功能。

此配置已与VESC 6和Traxxas无刷电机进行了测试。 按照此F1Tenth教程更新VESC固件并进行校准:https://f1tenth.readthedocs.io/en/stable/getting_started/firmware/firmware_vesc.html 重要的是使用舵机输出bin文件,以便我们也可以使用VESC控制转向。

需要从源代码安装PyVESC以进行舵机控制(pip install git+https://github.com/LiamBindle/PyVESC.git@master) 配置

  • 在 myconfig.py 中使用 DRIVETRAIN_TYPE = "VESC"
  • 示例参数
VESC_MAX_SPEED_PERCENT =.2  # 最大速度占实际速度的百分比
VESC_SERIAL_PORT= "/dev/ttyACM0" # 用于通信的串行设备。可以用 ls /dev/tty* 检查
VESC_HAS_SENSOR= True # bldc电机是否使用霍尔效应传感器
VESC_START_HEARTBEAT= True # 是否自动启动保持命令活动的心跳线程。
VESC_BAUDRATE= 115200 # 串行通信的波特率。通常不需要更改此值。
VESC_TIMEOUT= 0.05 # 串行通信的超时时间
VESC_STEERING_SCALE= 0.5 # VESC接受的转向输入范围为0到1。游戏手柄通常为-1到1。这将其更改为-0.5到0.5
VESC_STEERING_OFFSET = 0.5 # VESC接受的转向输入范围为0到1。与上述更改配合,我们将游戏手柄移动到0到1之间

差速驱动车辆

可以使用廉价的智能车底盘构建与Donkeycar兼容的机器人,该底盘包括2个直流齿轮电机和一个L298N电机驱动器或兼容驱动电机。通过使一辆电机比另一辆电机转速快来实现转向,从而使车辆沿弧线行驶。电机驱动器可以通过两种方式进行接线;3引脚接线或2引脚接线。差速驱动的DonkeyCar驱动类型名称都以DC_TWO_WHEEL开头。

3引脚HBridge差速驱动

使用L298N控制2个直流齿轮电机,每个电机使用两个TTL输出引脚选择方向和一个PWM引脚控制电机的功率。由于每个电机使用3个引脚,因此在差速驱动配置中总共使用6个引脚。这种接线方案的优点是只需要2个PWM引脚,而Jetson Nano上的PWM引脚数量恰好是最大值。

请参考https://www.electronicshub.org/raspberry-pi-l298n-interface-tutorial-control-dc-motor-l298n-raspberry-pi/,了解如何将L298N HBridge模块以3引脚模式连接到Raspberry Pi GPIO的讨论。这也适用于一些模拟L298N的其他驱动芯片,如TB6612FNG电机驱动器。

配置

  • 在 myconfig.py 中使用 DRIVETRAIN_TYPE = "DC_TWO_WHEEL_L298N"
  • 使用40引脚GPIO引脚头生成信号的示例引脚配置:
DC_TWO_WHEEL_L298N = {
    "LEFT_FWD_PIN": "RPI_GPIO.BOARD.16",        # TTL输出引脚使左轮向前转动
    "LEFT_BWD_PIN": "RPI_GPIO.BOARD.18",        # TTL输出引脚使左轮后退
    "LEFT_EN_DUTY_PIN": "RPI_GPIO.BOARD.22",    # PWM引脚产生左电机速度的占空比

    "RIGHT_FWD_PIN": "RPI_GPIO.BOARD.15",       # TTL输出引脚使右轮向前转动
    "RIGHT_BWD_PIN": "RPI_GPIO.BOARD.13",       # TTL输出引脚使右轮后退
    "RIGHT_EN_DUTY_PIN": "RPI_GPIO.BOARD.11",   # PWM引脚产生右电机速度的占空比
}
  • 使用PCA9685生成信号的示例引脚配置:
DC_TWO_WHEEL_L298N = {
    "LEFT_FWD_PIN": "PCA9685.1:40.3",        # TTL输出引脚使左轮向前转动
    "LEFT_BWD_PIN": "PCA9685.1:40.2",        # TTL输出引脚使左轮后退
    "LEFT_EN_DUTY_PIN": "PCA9685.1:40.1",    # PWM引脚产生左电机速度的占空比

    "RIGHT_FWD_PIN": "PCA9685.1:40.6",       # TTL输出引脚使右轮向前转动
    "RIGHT_BWD_PIN": "PCA9685.1:40.5",       # TTL输出引脚使右轮后退
    "RIGHT_EN_DUTY_PIN": "PCA9685.1:40.4",   # PWM引脚产生右电机速度的占空比
}
  • 在配置中,HBRIDGE_L298N_PIN_xxxx_EN引脚确定电机的旋转速度。这些引脚必须支持PWM输出。请记住,Jetson Nano仅支持2个PWM输出引脚,而且只有在使用/opt/nvidia/jetson-io/jetson-io.py启用它们时才可用。有关详细信息,请参见从Jetson Nano生成PWM
  • HBRIDGE_L298N_PIN_xxxx_FWD和HBRIDGE_L298N_PIN_xxxx_BWD引脚是TTL输出引脚,用于确定电机的旋转方向。

有关引脚提供者和引脚配置的详细讨论,请参见 pins

2引脚HBridge差速驱动

使用"mini" L293D HBridge控制的2个直流电机,每个电机使用2个PWM引脚:一个PWM引脚用于启用和控制正向速度,另一个用于启用和控制反向电机速度。这种布线方法的优点是只需要总共4个引脚,但是所有这些引脚都必须能够输出PWM信号。

  • 请参考L293教程,了解如何将L293D mini-HBridge模块以2引脚模式进行布线。
  • 这个驱动器也可以与L9110S/HG7881电机驱动器一起使用。请参考L9110S接口,了解如何布线L9110S电机驱动器模块。
  • 该驱动器还可以与DRV8833一起使用。请参考DRV8833 HBridge,了解如何与Arduino进行接口连接。

配置

  • 在myconfig.py中使用DRIVETRAIN_TYPE = "DC_TWO_WHEEL"
  • 使用40引脚GPIO生成信号的示例引脚配置:
DC_TWO_WHEEL = {
    "LEFT_FWD_DUTY_PIN": "RPI_GPIO.BCM.16",  # BCM.16 == BOARD.36,pwm引脚用于左轮向前的占空比
    "LEFT_BWD_DUTY_PIN": "RPI_GPIO.BCM.20",  # BCM.20 == BOARD.38,pwm引脚用于左轮向后的占空比
    "RIGHT_FWD_DUTY_PIN": "RPI_GPIO.BCM.5",  # BCM.5 == BOARD.29,pwm引脚用于右轮向前的占空比
    "RIGHT_BWD_DUTY_PIN": "RPI_GPIO.BCM.6",  # BCM.6 == BOARD.31,pwm引脚用于右轮向后的占空比
}
  • 使用PCA9685生成信号的示例引脚配置:
DC_TWO_WHEEL = {
    "LEFT_FWD_DUTY_PIN": "PCA9685.1:40.0",  # pwm引脚用于左轮向前的占空比
    "LEFT_BWD_DUTY_PIN": "PCA9685.1:40.1",  # pwm引脚用于左轮向后的占空比
    "RIGHT_FWD_DUTY_PIN": "PCA9685.1:40.5",  # pwm引脚用于右轮向前的占空比
    "RIGHT_BWD_DUTY_PIN": "PCA9685.1:40.6",  # pwm引脚用于右轮向后的占空比
}

有关引脚提供者和引脚指定符的详细讨论,请参考pins