Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。
Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。
在 Arduino 系统中,PID 算法主要用于对各种物理量(如温度、速度、位置等)进行精确控制。例如,通过连接温度传感器到 Arduino,利用 PID 算法可以精准控制加热或制冷设备,使温度稳定在设定值;在电机控制中,PID 可以根据目标速度和实际速度的偏差来调整电机的驱动信号,实现稳定的转速控制。
主要特点
1、实时反馈控制:PID控制器能够实时处理系统误差,通过比例、积分和微分三部分的调节,快速响应外部扰动,保持系统的稳定性。
2、简单易用:PID控制算法相对简单,易于实现和调试,适合大多数嵌入式系统和实时控制应用。
3、适应性强:PID控制器可以根据系统的动态特性进行调整,适应不同的负载和工作条件,保持良好的控制效果。
4、高精度控制:PID控制能够快速且准确地调整电机速度,确保电机在各种工况下都能稳定地达到设定速度,减少稳态误差。
5、良好的动态响应:通过调整比例、积分和微分参数,控制系统能够快速响应速度变化,适应负载变化和外部扰动,保持系统的稳定性。
应用场景
1、机器人运动控制:在机器人技术中,基于速度闭环的PID控制可以用于电机的速度调节,实现精确的运动控制,提高机器人的灵活性和稳定性。
2、自动化生产线:在自动化设备中,如传送带和机械手臂,PID控制能够确保各个设备的速度稳定,提高生产效率和产品质量。
3、电动工具:在电动工具(如电钻、切割机等)中,PID控制可以实现对电机转速的精确调节,满足不同工作条件的需要。
4、风扇和泵控制:在风扇和水泵等设备中,PID控制能够根据需求自动调节转速,提供适合的流量和风速,提高系统的能效。
5、电动车辆:在电动交通工具中,速度闭环PID控制可以用于电机的速度调节,提升驾驶的平顺性和安全性。
需要注意的事项
1、参数调试:PID控制器的效果高度依赖于参数设置,开发者需要进行细致的调试,以防止系统震荡或响应不及时。
2、传感器校准:使用PID控制时,需要定期校准传感器,以确保数据准确性,特别是在不同的环境条件下使用时。
3、数据融合:在控制中,可以考虑使用数据融合算法(如互补滤波或卡尔曼滤波)来提高姿态估计的稳定性和准确性。
4、电源管理:确保电源供应稳定且符合电机的工作要求,以避免电压波动对电机驱动性能造成影响。
5、热管理:设计合适的散热方案,以防止电机和驱动器过热,影响系统性能和寿命。
一、主要特点
(一)自平衡控制机制
基于 PID 的平衡控制
采用 PID(比例 - 积分 - 微分)控制器来实现小车的自平衡。PID 控制器通过传感器获取小车的倾斜角度信息,比例项(P)根据当前倾斜角度误差快速调整电机的驱动力,使小车能够快速响应倾斜状态进行平衡恢复。积分项(I)用于消除稳态误差,确保小车长时间稳定在平衡位置。微分项(D)则预测倾斜角度误差的变化趋势,提前进行调整,增强系统的稳定性和响应速度。例如,当小车受到外力干扰而向左倾斜时,PID 控制器会迅速计算出电机需要施加的向右的驱动力,使小车恢复平衡。
实时姿态感知与调整
小车配备有高精度的传感器(如陀螺仪和加速度计),能够实时感知自身的姿态(倾斜角度和角速度)。基于这些实时数据,控制系统可以不间断地调整电机的输出,以保持小车在各种情况下的平衡。这种实时调整能力使得小车可以适应不同的地面状况(如不平坦的路面)和外部干扰(如被碰撞)。
(二)速度控制功能
精确速度调节
除了自平衡功能外,带有速度控制的自平衡小车可以精确地调节行驶速度。通过改变电机的转速,可以实现小车的加速、减速和匀速运动。速度控制可以采用多种方式,如通过 PWM(脉冲宽度调制)信号控制电机的输入功率,或者使用专门的速度控制器与 PID 控制系统相结合。例如,用户可以设定一个目标速度,小车会根据 PID 控制算法调整电机转速,使实际速度尽可能接近目标速度。
速度与平衡的协同控制
系统能够实现速度和平衡的协同控制。在行驶过程中,速度的变化可能会影响小车的平衡,而平衡状态也会对速度控制产生反馈。例如,当小车加速时,由于惯性作用可能会导致车身前倾,控制系统会根据传感器反馈的姿态信息,同时调整速度和平衡控制参数,确保小车在加速过程中依然能够保持稳定。
(三)系统性能特点
稳定性和适应性
整个系统具有较高的稳定性,能够在一定范围内抵抗外部干扰并保持平衡和速度的稳定。同时,它还具有良好的适应性,可以根据不同的工作环境(如不同的摩擦力、坡度等)和负载情况(如车上放置不同重量的物品)自动调整控制策略。例如,在小车上加载重物后,系统能够自动感知并调整 PID 参数,以适应新的重心位置和质量分布,保持平衡和稳定的速度。
动态性能优化
通过优化 PID 参数和控制算法,可以使小车在动态过程(如启动、停止、转弯等)中表现出良好的性能。例如,在小车转弯时,控制系统可以合理分配两个驱动轮的速度,同时调整平衡控制参数,使小车能够平稳、快速地完成转弯动作,并且在转弯后迅速恢复到稳定的直线行驶状态。
二、应用场景
(一)教育与科研领域
教学实验平台
作为自动控制原理课程的教学实验平台,学生可以通过观察和调整 PID 参数,直观地理解自平衡和速度控制的原理。例如,在大学的自动化专业实验课程中,学生可以利用自平衡小车进行实验,研究不同 PID 参数对小车平衡和速度控制性能的影响,从而加深对控制系统的理解。
机器人研究原型
可作为机器人平衡控制研究的原型。研究人员可以在自平衡小车上测试新的控制算法和传感器技术,为开发更复杂的双足或多足机器人的平衡系统提供参考。例如,在研究双足机器人的动态平衡时,可以先在自平衡小车上模拟相似的平衡问题和解决方案,为双足机器人的研发提供经验。
(二)智能交通与物流
小型物流运输车辆
在物流仓库等室内环境下,自平衡小车可以作为小型的运输工具。它能够在搬运较轻的货物时保持平衡并灵活地穿梭于货架之间,通过速度控制实现高效的货物运输。例如,在自动化仓库中,自平衡小车可以根据仓库管理系统的指令,以合适的速度将货物从一个货架搬运到另一个货架。
智能交通设备辅助
在智能交通系统中,自平衡小车可以作为一种辅助设备。例如,用于在复杂的交通场景中(如狭窄的街道、人行横道等)进行交通数据采集或安全巡逻。它的小巧灵活和自平衡特性使其能够在各种路况下稳定运行,并且可以根据任务需求控制速度,为交通管理提供支持。
(三)娱乐与消费电子领域
玩具与遥控设备
作为一种高科技玩具,自平衡小车可以给消费者带来乐趣。用户可以通过遥控器控制小车的速度和行驶方向,体验其自平衡和在不同速度下的行驶功能。例如,在玩具市场上,带有酷炫外观和多种控制模式的自平衡小车可以吸引儿童和科技爱好者。
个人交通工具(概念)
在未来交通概念中,自平衡小车有可能发展成为一种个人交通工具。它的自平衡特性可以为用户提供稳定的骑行体验,并且通过速度控制能够满足不同的出行需求。不过,这还需要在安全、法规等方面进行进一步的研究和完善。
三、需要注意的事项
(一)PID 参数调整
参数调试难度
PID 参数的调试是一个复杂的过程。不同的小车结构、电机性能、传感器精度等因素都会影响 PID 参数的选择。对于初学者来说,可能需要花费大量的时间和精力来找到合适的参数组合。例如,在一个新搭建的自平衡小车上,确定比例系数、积分时间和微分时间的合适值可能需要进行多次试验。
参数自适应范围限制
虽然系统具有一定的动态调节能力,但 PID 参数的自适应范围是有限的。在极端工况下,如非常陡峭的斜坡、过重的负载等情况下,可能需要手动干预或者重新设计控制策略。例如,当小车上放置了超过设计承载能力的重物时,仅仅依靠 PID 参数的自适应调整可能无法保证小车的平衡。
(二)传感器精度与可靠性
传感器误差影响
用于感知小车姿态和速度的传感器(如陀螺仪、加速度计等)的精度直接影响系统的控制效果。如果传感器存在误差,可能会导致小车的平衡控制出现偏差。例如,陀螺仪的零点漂移会使小车误认为自己处于倾斜状态,从而产生不必要的调整动作。
传感器故障应对
要考虑传感器故障的情况。一旦传感器出现故障,可能会使小车失去平衡控制能力。因此,需要设计传感器故障检测和容错机制。例如,可以采用冗余传感器或者通过软件算法对传感器数据进行合理性检查,当发现传感器故障时,能够采取安全措施,如停止小车运动。
(三)安全与稳定性
运行速度与稳定性权衡
在追求小车快速运动的同时,要注意平衡和稳定性。过高的速度可能会导致小车在遇到干扰时无法及时恢复平衡,增加倾倒的风险。例如,在设计自平衡小车的运动模式时,要根据小车的结构和控制性能,合理设定最高速度限制。
安全防护措施
要为自平衡小车配备必要的安全防护措施。由于小车在运动过程中可能会因为各种原因倾倒,为了避免对周围环境和人员造成伤害,可以安装防护栏、缓冲装置等。例如,在玩具自平衡小车上,设置柔软的外壳作为缓冲,防止碰撞时造成损坏。
1、基本自平衡小车
#include <Wire.h>
#include <MPU6050.h>
#include <PID_v1.h>
// 定义传感器和电机引脚
MPU6050 mpu;
const int motorPinLeft = 9;
const int motorPinRight = 10;
// PID 控制参数
double setpoint, input, output;
double Kp = 1, Ki = 0, Kd = 0.5;
// 创建 PID 控制器对象
PID balancePID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
setpoint = 0; // 目标倾斜角度
balancePID.SetMode(AUTOMATIC);
}
void loop() {
// 读取传感器数据
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// 计算倾斜角度(简单的计算)
input = atan2(ay, az) * 180 / PI; // 计算倾斜角度
// 计算 PID 输出
balancePID.Compute();
// 控制电机
analogWrite(motorPinLeft, 150 + output); // 左电机
analogWrite(motorPinRight, 150 - output); // 右电机
Serial.print("Tilt: ");
Serial.print(input);
Serial.print(" Output: ");
Serial.println(output);
delay(100);
}
2、带有速度控制的自平衡小车
#include <Wire.h>
#include <MPU6050.h>
#include <PID_v1.h>
// 定义传感器和电机引脚
MPU6050 mpu;
const int motorPinLeft = 9;
const int motorPinRight = 10;
// PID 控制参数
double setpoint, input, output;
double Kp = 1, Ki = 0, Kd = 0.5;
// 创建 PID 控制器对象
PID balancePID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
setpoint = 0; // 目标倾斜角度
balancePID.SetMode(AUTOMATIC);
}
void loop() {
// 读取传感器数据
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// 计算倾斜角度
input = atan2(ay, az) * 180 / PI;
// 计算 PID 输出
balancePID.Compute();
// 控制电机
int baseSpeed = 150; // 基本速度
int speedAdjustment = output; // 根据 PID 输出调整速度
analogWrite(motorPinLeft, baseSpeed + speedAdjustment); // 左电机
analogWrite(motorPinRight, baseSpeed - speedAdjustment); // 右电机
Serial.print("Tilt: ");
Serial.print(input);
Serial.print(" Output: ");
Serial.println(output);
delay(100);
}
3、动态速度调整的自平衡小车
#include <Wire.h>
#include <MPU6050.h>
#include <PID_v1.h>
// 定义传感器和电机引脚
MPU6050 mpu;
const int motorPinLeft = 9;
const int motorPinRight = 10;
// PID 控制参数
double setpoint, input, output;
double Kp = 1, Ki = 0, Kd = 0.5;
// 创建 PID 控制器对象
PID balancePID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
void setup() {
Serial.begin(9600);
Wire.begin();
mpu.initialize();
setpoint = 0; // 目标倾斜角度
balancePID.SetMode(AUTOMATIC);
}
void loop() {
// 读取传感器数据
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// 计算倾斜角度
input = atan2(ay, az) * 180 / PI;
// 动态调整目标倾斜角度(模拟速度控制)
if (Serial.available() > 0) {
char command = Serial.read();
if (command == 'f') { // 向前
setpoint += 5; // 增加目标倾斜
} else if (command == 'b') { // 向后
setpoint -= 5; // 减少目标倾斜
}
Serial.print("New Setpoint: ");
Serial.println(setpoint);
}
// 计算 PID 输出
balancePID.Compute();
// 控制电机
int baseSpeed = 150; // 基本速度
int speedAdjustment = output; // 根据 PID 输出调整速度
analogWrite(motorPinLeft, baseSpeed + speedAdjustment); // 左电机
analogWrite(motorPinRight, baseSpeed - speedAdjustment); // 右电机
Serial.print("Tilt: ");
Serial.print(input);
Serial.print(" Output: ");
Serial.println(output);
delay(100);
}
要点解读
传感器数据读取:
使用 MPU6050 传感器读取加速度和陀螺仪数据,以计算小车的倾斜角度。通过 atan2() 函数将加速度数据转换为角度。
PID 控制实现:
每个示例中都有一个 PID 控制器,目标倾斜角度 (setpoint) 是小车保持垂直的理想状态,而当前倾斜角度 (input) 是通过传感器读取的。PID 控制器通过计算误差来生成控制输出 (output),以调整电机的转速。
电机控制逻辑:
使用 analogWrite() 函数控制电机的功率输出。通过 PID 输出调整电机速度,以实现自平衡。基础速度设置为 150,PID 输出用于动态调整电机的功率。
动态速度调整:
在第三个示例中,用户可以通过串口输入来动态调整目标倾斜角度。例如,输入 ‘f’ 向前移动,输入 ‘b’ 向后移动。这种设置允许小车在保持平衡的同时,灵活地进行前进和后退。
实时监控与调试:
使用 Serial.print 输出当前的倾斜角度和 PID 输出,便于调试和监控小车的运行状态。实时监控有助于开发者理解系统的动态行为并进行必要的参数调整。
4、基础自平衡小车控制
#include <PID_v1.h>
// 电机引脚
const int motorLeftForward = 3;
const int motorLeftBackward = 5;
const int motorRightForward = 6;
const int motorRightBackward = 9;
// PID 参数
double setpoint = 0; // 目标角度(水平为0)
double input, output;
double Kp = 1.0, Ki = 0.5, Kd = 0.1;
// 创建 PID 对象
PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
void setup() {
Serial.begin(9600);
pinMode(motorLeftForward, OUTPUT);
pinMode(motorLeftBackward, OUTPUT);
pinMode(motorRightForward, OUTPUT);
pinMode(motorRightBackward, OUTPUT);
myPID.SetMode(AUTOMATIC);
}
void loop() {
// 假设用传感器获取车体倾斜角度
input = getTiltAngle(); // 自定义函数,返回当前倾斜角度
// 计算 PID 输出
myPID.Compute();
// 控制电机
if (output > 0) {
analogWrite(motorLeftForward, output);
analogWrite(motorRightForward, output);
analogWrite(motorLeftBackward, 0);
analogWrite(motorRightBackward, 0);
} else {
analogWrite(motorLeftBackward, -output);
analogWrite(motorRightBackward, -output);
analogWrite(motorLeftForward, 0);
analogWrite(motorRightForward, 0);
}
// 输出调试信息
Serial.print("Tilt Angle: ");
Serial.print(input);
Serial.print(" PID Output: ");
Serial.println(output);
delay(20);
}
double getTiltAngle() {
// 这里需要根据具体的传感器实现获取倾斜角度的逻辑
return 0; // 示例返回值
}
要点解读
基础结构:设置电机控制引脚,初始化 PID 控制器。
倾斜角度输入:通过自定义函数 getTiltAngle() 获取小车的当前倾斜角度。
PID 控制:根据倾斜角度计算 PID 输出,调整电机的速度和方向。
电机控制:根据 PID 输出控制电机前进或后退,确保小车自平衡。
调试输出:通过串口输出当前倾斜角度和 PID 输出,便于调试和优化。
5、速度与倾斜角度双重控制
#include <PID_v1.h>
// 电机引脚
const int motorLeftForward = 3;
const int motorLeftBackward = 5;
const int motorRightForward = 6;
const int motorRightBackward = 9;
// PID 参数
double angleSetpoint = 0; // 目标角度
double speedSetpoint = 150; // 目标速度
double angleInput, angleOutput;
double speedInput, speedOutput;
double Kp_angle = 1.0, Ki_angle = 0.5, Kd_angle = 0.1;
double Kp_speed = 1.0, Ki_speed = 0.5, Kd_speed = 0.1;
// 创建 PID 对象
PID anglePID(&angleInput, &angleOutput, &angleSetpoint, Kp_angle, Ki_angle, Kd_angle, DIRECT);
PID speedPID(&speedInput, &speedOutput, &speedSetpoint, Kp_speed, Ki_speed, Kd_speed, DIRECT);
void setup() {
Serial.begin(9600);
pinMode(motorLeftForward, OUTPUT);
pinMode(motorLeftBackward, OUTPUT);
pinMode(motorRightForward, OUTPUT);
pinMode(motorRightBackward, OUTPUT);
anglePID.SetMode(AUTOMATIC);
speedPID.SetMode(AUTOMATIC);
}
void loop() {
// 获取倾斜角度和当前速度
angleInput = getTiltAngle(); // 获取倾斜角度
speedInput = getCurrentSpeed(); // 获取当前速度
// 计算 PID 输出
anglePID.Compute();
speedPID.Compute();
// 控制电机
int motorPower = speedOutput + angleOutput; // 根据速度和角度输出计算电机功率
motorPower = constrain(motorPower, 0, 255); // 限制电机功率范围
if (motorPower > 0) {
analogWrite(motorLeftForward, motorPower);
analogWrite(motorRightForward, motorPower);
analogWrite(motorLeftBackward, 0);
analogWrite(motorRightBackward, 0);
} else {
analogWrite(motorLeftBackward, -motorPower);
analogWrite(motorRightBackward, -motorPower);
analogWrite(motorLeftForward, 0);
analogWrite(motorRightForward, 0);
}
// 输出调试信息
Serial.print("Tilt Angle: ");
Serial.print(angleInput);
Serial.print(" Speed: ");
Serial.print(speedInput);
Serial.print(" Angle PID Output: ");
Serial.print(angleOutput);
Serial.print(" Speed PID Output: ");
Serial.println(speedOutput);
delay(20);
}
double getTiltAngle() {
// 这里需要根据具体的传感器实现获取倾斜角度的逻辑
return 0; // 示例返回值
}
double getCurrentSpeed() {
// 这里需要根据具体的传感器实现获取当前速度的逻辑
return 0; // 示例返回值
}
要点解读
双重控制:同时使用 PID 控制倾斜角度和速度,确保小车在行驶时保持平衡。
PID 控制:分别为倾斜角度和速度创建 PID 控制器,根据输入调整电机输出。
电机功率计算:将速度和角度的 PID 输出结合,计算电机功率。
电机控制:根据计算的功率控制电机的前进或后退,确保小车平稳行驶。
调试输出:通过串口输出当前倾斜角度、速度和 PID 输出,便于调试。
6、遥控器控制小车速度
#include <PID_v1.h>
// 电机引脚
const int motorLeftForward = 3;
const int motorLeftBackward = 5;
const int motorRightForward = 6;
const int motorRightBackward = 9;
// PID 参数
double angleSetpoint = 0; // 目标角度
double speedSetpoint = 0; // 目标速度
double angleInput, angleOutput;
double speedInput, speedOutput;
double Kp_angle = 1.0, Ki_angle = 0.5, Kd_angle = 0.1;
double Kp_speed = 1.0, Ki_speed = 0.5, Kd_speed = 0.1;
// 创建 PID 对象
PID anglePID(&angleInput, &angleOutput, &angleSetpoint, Kp_angle, Ki_angle, Kd_angle, DIRECT);
PID speedPID(&speedInput, &speedOutput, &speedSetpoint, Kp_speed, Ki_speed, Kd_speed, DIRECT);
void setup() {
Serial.begin(9600);
pinMode(motorLeftForward, OUTPUT);
pinMode(motorLeftBackward, OUTPUT);
pinMode(motorRightForward, OUTPUT);
pinMode(motorRightBackward, OUTPUT);
anglePID.SetMode(AUTOMATIC);
speedPID.SetMode(AUTOMATIC);
}
void loop() {
// 获取倾斜角度和当前速度
angleInput = getTiltAngle(); // 获取倾斜角度
speedInput = getCurrentSpeed(); // 获取当前速度
// 读取遥控器输入
if (Serial.available() > 0) {
speedSetpoint = Serial.read(); // 从串口读取目标速度值
}
// 计算 PID 输出
anglePID.Compute();
speedPID.Compute();
// 控制电机
int motorPower = speedOutput + angleOutput; // 根据速度和角度输出计算电机功率
motorPower = constrain(motorPower, 0, 255); // 限制电机功率范围
if (motorPower > 0) {
analogWrite(motorLeftForward, motorPower);
analogWrite(motorRightForward, motorPower);
analogWrite(motorLeftBackward, 0);
analogWrite(motorRightBackward, 0);
} else {
analogWrite(motorLeftBackward, -motorPower);
analogWrite(motorRightBackward, -motorPower);
analogWrite(motorLeftForward, 0);
analogWrite(motorRightForward, 0);
}
// 输出调试信息
Serial.print("Tilt Angle: ");
Serial.print(angleInput);
Serial.print(" Speed: ");
Serial.print(speedInput);
Serial.print(" Angle PID Output: ");
Serial.print(angleOutput);
Serial.print(" Speed PID Output: ");
Serial.println(speedOutput);
delay(20);
}
double getTiltAngle() {
// 这里需要根据具体的传感器实现获取倾斜角度的逻辑
return 0; // 示例返回值
}
double getCurrentSpeed() {
// 这里需要根据具体的传感器实现获取当前速度的逻辑
return 0; // 示例返回值
}
要点解读
遥控器控制:通过串口输入动态调整目标速度,增强用户交互。
双 PID 控制:同时控制倾斜角度和速度,确保小车自平衡并能够根据用户输入调整速度。
电机功率计算:结合速度和角度的 PID 输出,计算电机控制信号。
电机控制:根据计算的功率控制电机前进或后退,确保小车在各个速度下保持平衡。
调试输出:通过串口输出调试信息,便于开发者监控系统状态并进行调整。
注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。