执行器
汽车需要一种前进和后退以及左右转向的方式。我们通常称在机器人中产生物理运动的设备为"执行器"。常见的执行器包括直流电机、舵机、连续旋转舵机和步进电机。这些执行器可以以许多不同的方式组合,以推动和转向机器人。Donkeycar支持两种常见的配置,可以使用各种执行器来实现:
- 类似汽车的车辆通过将前轮向左或向右倾斜来转向,并通过将驱动轮向前或向后转动来移动。常见的遥控车属于这一类别。
- 差速驱动车辆具有两个独立控制的驱动轮,用于提供运动和转向。例如,差速驱动车辆可以通过以相同速度将两个驱动轮向前转动来直行。为了转弯,一个电机可以比另一个电机转得快,车辆将朝着速度较慢的电机方向转弯。差速驱动车辆在本页面的末尾附近的一个部分中进行了讨论。
执行器接收来自Donkeycar的控制信号以控制它们的动作。有几种选项可以生成这些控制信号。
- PCA9685舵机控制板
- RPi/Jetson 40引脚GPIO头
- 有关如何从Jetson Nano 40引脚GPIO头生成PWM输出的详细信息,请参见从Jetson Nano生成PWM。
- Arduino
接下来,我们将描述支持的执行器设置及其控制信号的软件配置。
标准遥控车及其电调和转向舵机
标准遥控车配备了一个转向舵机用于操控前轮,并且有一个电调(电子调速器)来控制驱动车轮的直流电机的速度。转向舵机和电调都接收脉宽调制(PWM)控制信号。PWM信号是一个具有特定持续时间和频率的方波脉冲。对于转向舵机而言,PWM信号确定了舵机臂的位置,通常在0度(最右)和180度(最左)之间。对于电调而言,PWM信号确定了驱动电机的方向和速度,从完全反向,经过停止,到完全前进。
- 标准遥控舵机的脉冲范围从1毫秒(电调的全反向,舵机的全左转)到2毫秒(电调的全前进,舵机的全右转),其中1.5毫秒是中立位置(电调停止,舵机直行)。
- 这些脉冲通常以50赫兹的频率发送(每20毫秒一个周期)。一个周期包括一个信号高电平的时间段,然后是一个信号低电平的时间段。这意味着,在标准的50赫兹频率下,1毫秒的脉冲(1毫秒高电平加上19毫秒低电平)表示一个5%的占空比,而2毫秒的脉冲表示一个10%的占空比。
- 最重要的部分是脉冲的长度,它必须在1到2毫秒的范围内。
- 这意味着如果使用不同的频率,则必须调整占空比以获得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.py
的PWM_STEERING_THROTTLE
部分中,为PWM_STEERING_PIN
和PWM_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_PIN
和PWM_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)也应该很简单。
请参考下面的块图以了解各部分的连接方式。
Arduino 板应运行标准 firmata sketch(在下载 Arduino 工具时默认提供的 sketch)。将标准 firmata sketch(位于_Examples > Firmata > StandardFirmata_)加载到 Arduino 上。 此外,需要通过 pip3 install pymata_aio 在车载计算机上安装 pymata_aio_ Python 包。
如上所示,LattePanda 将 x86 CPU 和连接的 Arduino 结合到一个单板上。
以下图示展示了如何将 Arduino 引脚连接到舵机和电调。
请注意,舵机的电源由电调的电池消除电路(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
请参考 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
请参考 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。