【花雕学编程】Arduino PID 之多按钮控制不同速度设置

在这里插入图片描述

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 控制器通过对反馈信号(如电机转速传感器反馈的实际转速)与目标速度的误差进行计算,然后调整控制信号(如电机驱动信号的脉宽调制占空比),以实现精确的速度控制。例如,在要求精确速度的传送带系统中,能够准确地将传送带速度控制在设定值。
动态响应与稳定性
当速度设置发生变化时,PID 控制器能够快速地做出动态响应,使系统平稳地过渡到新的速度。它通过合理地调整比例、积分和微分参数,在加快系统响应速度的同时,保持系统的稳定性。例如,在一个机器人的关节电机控制中,当改变关节运动速度时,PID 控制器能确保关节平稳地加速或减速。
(三)与 Arduino 的集成优势
硬件接口简单
Arduino 提供了丰富的数字和模拟引脚,可以方便地连接按钮和各种速度传感器(如编码器用于电机转速反馈)。这种简单的硬件接口使得系统的搭建相对容易,降低了开发难度。例如,按钮可以直接连接到 Arduino 的数字输入引脚,转速传感器的信号可以接入模拟输入引脚。
编程方便
在 Arduino 编程环境中,可以方便地实现多按钮控制逻辑和 PID 控制算法。开发人员可以利用 Arduino 的库函数和简单的编程语言来编写代码,实现速度设置和控制功能。例如,通过简单的条件语句就可以处理按钮按下事件,调用 PID 控制函数来调整速度。

二、应用场景
(一)工业自动化
生产线设备控制
在自动化生产线中,用于控制各种设备的运行速度。例如,通过按钮控制传送带的不同速度,以适应不同产品的生产流程。在产品包装环节,低速用于精确放置产品,中速用于产品运输,高速用于紧急情况或快速补货等情况。PID 控制确保设备能够准确地按照设定的速度运行,提高生产效率和产品质量。
机械加工设备速度调整
在机床(如铣床、车床等)中,多个按钮可以用来设置刀具的不同切削速度。工人可以根据加工材料的硬度、刀具的类型等因素,通过按钮快速调整切削速度。PID 控制则保证刀具在加工过程中能够稳定地保持设定的切削速度,提高加工精度和刀具寿命。
(二)智能交通工具
电动车辆速度模式选择
在电动汽车或电动摩托车中,多个按钮可以用于选择不同的速度模式,如经济模式(低速长续航)、标准模式(中速正常行驶)、运动模式(高速性能)。用户可以根据路况和驾驶需求选择合适的模式。PID 控制根据所选模式调节电机的输出功率,实现稳定的速度控制,同时优化车辆的能耗和性能。
电动轮椅速度调节
对于电动轮椅,通过按钮控制不同的速度设置可以方便用户在不同的环境中使用。例如,在室内或人群密集的地方使用低速,在室外宽敞的道路上可以切换到中速或高速。PID 控制确保轮椅能够平稳地加速、减速和保持设定的速度,提高用户的使用安全性和舒适性。
(三)智能家居与消费电子产品
智能风扇速度控制
在智能风扇中,多个按钮可以设置不同的风速档位,如微风、中风、强风。用户可以根据自己的感受和环境温度选择合适的风速。PID 控制通过调节电机的转速,使风扇能够精确地输出设定的风速,提供舒适的使用体验。
电动玩具速度设置
对于电动玩具(如电动小汽车、电动飞机等),多按钮控制不同速度设置可以增加玩具的趣味性。孩子们可以通过按下不同的按钮,让玩具以不同的速度行驶或飞行。PID 控制保证玩具在不同速度下都能稳定运行,提高玩具的可玩性。

三、需要注意的事项
(一)按钮设计与操作
按钮布局与标识
按钮的布局要合理,方便用户操作,并且要有清晰的标识,让用户能够直观地了解每个按钮的功能。例如,在一个设备的控制面板上,速度增加和速度减少的按钮应该相邻,并且有明确的 “+” 和 “-” 标识。
按钮防抖与重复触发
要考虑按钮的防抖问题,避免因按钮抖动而导致多次误触发。可以通过软件防抖(如设置按钮按下后的延迟确认时间)或硬件防抖(如添加防抖电路)来解决。同时,要注意防止按钮的重复触发,例如,在按钮按下后,应该设置一个适当的锁定时间,避免用户快速连续按下按钮导致速度设置混乱。
(二)PID 参数调整
参数适配不同速度
PID 参数(比例系数、积分时间常数、微分时间常数)可能需要根据不同的速度设置进行调整。例如,在高速运行时,为了保持系统的稳定性,可能需要增大比例系数和微分系数;在低速运行时,积分系数可能需要适当调整以避免稳态误差。需要通过实验和测试来确定适合不同速度的 PID 参数。
参数动态变化与稳定性
当速度设置发生变化时,PID 参数的动态变化可能会影响系统的稳定性。要注意在参数切换过程中,避免系统出现振荡或失控的情况。可以采用渐变的方式调整 PID 参数,或者在参数切换时增加一些过渡逻辑,以确保系统能够平稳地过渡到新的速度和参数设置。
(三)速度反馈与传感器
速度传感器精度
速度反馈的准确性取决于速度传感器的精度。要选择合适精度的传感器来满足系统对速度控制的要求。例如,在高精度的工业设备中,需要使用高精度的编码器来获取准确的电机转速反馈,否则可能会导致速度控制误差较大。
传感器安装与干扰
速度传感器的安装位置和方式会影响反馈信号的质量。要确保传感器安装正确,并且能够稳定地获取速度信号。同时,要注意避免外界干扰(如电磁干扰、机械振动等)对传感器信号的影响。可以采用屏蔽线、减震装置等措施来减少干扰。

在这里插入图片描述

1、基本的多按钮速度设置

#include <Servo.h>

Servo myServo;
const int button1Pin = 2; // 按钮1
const int button2Pin = 3; // 按钮2
const int button3Pin = 4; // 按钮3
int speedSetting = 0; // 初始速度设置

void setup() {
    myServo.attach(9);
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(button3Pin, INPUT_PULLUP);
}

void loop() {
    // 检测按钮状态
    if (digitalRead(button1Pin) == LOW) {
        speedSetting = 50; // 设置速度为50
        delay(200); // 防抖延迟
    }
    if (digitalRead(button2Pin) == LOW) {
        speedSetting = 100; // 设置速度为100
        delay(200);
    }
    if (digitalRead(button3Pin) == LOW) {
        speedSetting = 150; // 设置速度为150
        delay(200);
    }

    // 更新舵机位置
    myServo.write(speedSetting);
    delay(100); // 控制更新频率
}

2、带状态指示的多按钮速度设置

#include <Servo.h>

Servo myServo;
const int button1Pin = 2;
const int button2Pin = 3;
const int button3Pin = 4;
const int ledPin = 13; // 状态指示灯
int speedSetting = 0;

void setup() {
    myServo.attach(9);
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(button3Pin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
}

void loop() {
    // 检测按钮状态
    if (digitalRead(button1Pin) == LOW) {
        speedSetting = 50;
        digitalWrite(ledPin, HIGH); // 点亮指示灯
        delay(200);
    }
    if (digitalRead(button2Pin) == LOW) {
        speedSetting = 100;
        digitalWrite(ledPin, HIGH);
        delay(200);
    }
    if (digitalRead(button3Pin) == LOW) {
        speedSetting = 150;
        digitalWrite(ledPin, HIGH);
        delay(200);
    } else {
        digitalWrite(ledPin, LOW); // 熄灭指示灯
    }

    // 更新舵机位置
    myServo.write(speedSetting);
    delay(100);
}

3、带 PID 控制的多按钮速度设置

#include <Servo.h>

Servo myServo;
const int button1Pin = 2;
const int button2Pin = 3;
const int button3Pin = 4;
int speedSetting = 0; // 初始速度设置
float kp = 1.0, ki = 0.0, kd = 0.0; // PID 参数
int previousError = 0, integral = 0;

void setup() {
    myServo.attach(9);
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(button3Pin, INPUT_PULLUP);
}

void loop() {
    // 检测按钮状态以设置速度
    if (digitalRead(button1Pin) == LOW) {
        speedSetting = 50;
        delay(200);
    }
    if (digitalRead(button2Pin) == LOW) {
        speedSetting = 100;
        delay(200);
    }
    if (digitalRead(button3Pin) == LOW) {
        speedSetting = 150;
        delay(200);
    }

    // PID 控制
    int currentPosition = myServo.read();
    int error = speedSetting - currentPosition;
    integral += error;
    int derivative = error - previousError;
    int pidOutput = kp * error + ki * integral + kd * derivative;

    // 更新舵机位置
    myServo.write(currentPosition + pidOutput);
    previousError = error;

    delay(100);
}

要点解读
多按钮输入: 所有案例中使用多个按钮来设置不同的速度。每个按钮的状态通过 digitalRead() 读取,并在按下时更新速度设置。这种方式使得用户能够方便地选择所需的速度。
状态指示灯: 在案例 2 中引入了一个 LED 指示灯,当按钮被按下时点亮,以指示当前选择的速度设置。这种视觉反馈可以帮助用户更好地了解系统状态。
PID 控制: 案例 3 中引入了 PID 控制算法,以根据当前舵机的位置和目标速度之间的误差动态调整舵机的输出。这种控制方式可以提高系统的响应性和精度,使舵机能够更平滑地达到目标速度。
速度设置: 各个案例中速度被设置为不同的值(50、100、150),可以根据实际需要进行调整。这些值可以映射到舵机的不同角度或速度设置。
防抖处理: 所有案例中对按钮按下操作设置了防抖延迟(200 毫秒),以防止因按钮抖动导致的多次触发。这是确保按钮输入稳定的常见技术。
舵机控制: 使用 myServo.write() 方法更新舵机的位置。案例 3 中的 PID 输出决定了舵机的位置调整量,从而使舵机能够以设定的速度移动。

在这里插入图片描述

4、基础多按钮速度控制

#include <PID_v1.h>

double Setpoint, Input, Output;
double Kp = 2.0, Ki = 5.0, Kd = 1.0;

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

const int motorPin = 9; // 电机引脚
const int button1Pin = 2; // 按钮1引脚
const int button2Pin = 3; // 按钮2引脚
const int button3Pin = 4; // 按钮3引脚

void setup() {
    Serial.begin(9600);
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(button3Pin, INPUT_PULLUP);
    
    Setpoint = 0; // 初始速度
    myPID.SetMode(AUTOMATIC);
}

void loop() {
    Input = analogRead(A0); // 读取传感器数据作为输入
    myPID.Compute(); // 计算PID输出

    // 根据按钮设置不同的速度
    if (digitalRead(button1Pin) == LOW) {
        Setpoint = 50; // 设置速度为50
    } else if (digitalRead(button2Pin) == LOW) {
        Setpoint = 100; // 设置速度为100
    } else if (digitalRead(button3Pin) == LOW) {
        Setpoint = 150; // 设置速度为150
    }

    // 控制电机速度
    setMotorSpeed(Output);
    
    Serial.print("Input: "); Serial.print(Input);
    Serial.print(" Setpoint: "); Serial.print(Setpoint);
    Serial.print(" Output: "); Serial.println(Output);
    delay(100);
}

void setMotorSpeed(double speed) {
    // 控制电机的实际代码
    analogWrite(motorPin, speed);
}

要点解读
基础多按钮控制:通过三个按钮设置不同的速度,简单实现用户控制。
PID控制:根据输入值与设定点之间的差距计算PID输出,调整电机速度。
速度设置:每个按钮对应不同的速度设置,实时根据按钮状态更改速度。
电机控制:setMotorSpeed函数用于通过PWM控制电机速度。
适合初学者:简单易懂的多按钮控制示例,适合学习基础的Arduino编程与PID控制。

5、带状态指示的多按钮控制

#include <PID_v1.h>

double Setpoint, Input, Output;
double Kp = 2.0, Ki = 5.0, Kd = 1.0;

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

const int motorPin = 9; // 电机引脚
const int button1Pin = 2; // 按钮1引脚
const int button2Pin = 3; // 按钮2引脚
const int button3Pin = 4; // 按钮3引脚
const int ledPin = 13; // LED引脚

void setup() {
    Serial.begin(9600);
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(button3Pin, INPUT_PULLUP);
    pinMode(ledPin, OUTPUT);
    
    Setpoint = 0; // 初始速度
    myPID.SetMode(AUTOMATIC);
}

void loop() {
    Input = analogRead(A0); // 读取传感器数据作为输入
    myPID.Compute(); // 计算PID输出

    // 根据按钮设置不同的速度
    if (digitalRead(button1Pin) == LOW) {
        Setpoint = 50; // 设置速度为50
        digitalWrite(ledPin, HIGH); // 点亮LED指示
    } else if (digitalRead(button2Pin) == LOW) {
        Setpoint = 100; // 设置速度为100
        digitalWrite(ledPin, HIGH); // 点亮LED指示
    } else if (digitalRead(button3Pin) == LOW) {
        Setpoint = 150; // 设置速度为150
        digitalWrite(ledPin, HIGH); // 点亮LED指示
    } else {
        digitalWrite(ledPin, LOW); // 熄灭LED指示
    }

    // 控制电机速度
    setMotorSpeed(Output);
    
    Serial.print("Input: "); Serial.print(Input);
    Serial.print(" Setpoint: "); Serial.print(Setpoint);
    Serial.print(" Output: "); Serial.println(Output);
    delay(100);
}

void setMotorSpeed(double speed) {
    // 控制电机的实际代码
    analogWrite(motorPin, speed);
}

要点解读
带状态指示的按钮控制:增加LED指示灯,根据按钮状态点亮或熄灭,提高用户交互体验。
PID控制结合状态指示:通过PID控制实现电机速度调节,并用LED指示当前状态。
实时速度设置:每个按钮对应不同的速度设定,用户可通过按钮快速切换速度。
电机控制实现:setMotorSpeed函数用于通过PWM控制电机速度,适应不同的设定速度。
适合中级开发者:在基础案例的基础上增加了状态指示,适合有一定经验的开发者。

6、多按钮控制与速度调节

#include <PID_v1.h>

double Setpoint, Input, Output;
double Kp = 2.0, Ki = 5.0, Kd = 1.0;

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);

const int motorPin = 9; // 电机引脚
const int button1Pin = 2; // 按钮1引脚(速度50)
const int button2Pin = 3; // 按钮2引脚(速度100)
const int button3Pin = 4; // 按钮3引脚(速度150)
const int button4Pin = 5; // 按钮4引脚(加速)
const int button5Pin = 6; // 按钮5引脚(减速)

void setup() {
    Serial.begin(9600);
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(button3Pin, INPUT_PULLUP);
    pinMode(button4Pin, INPUT_PULLUP);
    pinMode(button5Pin, INPUT_PULLUP);
    
    Setpoint = 0; // 初始速度
    myPID.SetMode(AUTOMATIC);
}

void loop() {
    Input = analogRead(A0); // 读取传感器数据作为输入
    myPID.Compute(); // 计算PID输出

    // 根据按钮设置不同的速度
    if (digitalRead(button1Pin) == LOW) {
        Setpoint = 50; // 设置速度为50
    } else if (digitalRead(button2Pin) == LOW) {
        Setpoint = 100; // 设置速度为100
    } else if (digitalRead(button3Pin) == LOW) {
        Setpoint = 150; // 设置速度为150
    }

    // 加速和减速控制
    if (digitalRead(button4Pin) == LOW) {
        Setpoint += 10; // 加速
    } else if (digitalRead(button5Pin) == LOW) {
        Setpoint -= 10; // 减速
    }

    // 控制电机速度
    setMotorSpeed(Output);
    
    Serial.print("Input: "); Serial.print(Input);
    Serial.print(" Setpoint: "); Serial.print(Setpoint);
    Serial.print(" Output: "); Serial.println(Output);
    delay(100);
}

void setMotorSpeed(double speed) {
    // 控制电机的实际代码
    analogWrite(motorPin, speed);
}

要点解读
多按钮控制与速度调节:除了设置固定速度的按钮外,增加了加速和减速按钮,实现动态调节速度。
PID控制:结合输入与设定点,通过PID控制输出电机速度,保证运动平稳。
灵活的速度设置:用户可以通过多种按钮操作快速调整电机速度,适应不同的需求。
电机控制实现:setMotorSpeed函数用于通过PWM控制电机速度,适应不同的设定速度。
适合高级开发者:适合对多按钮控制有深入理解的开发者,通过添加加速和减速功能提升交互性。

注意,以上案例只是为了拓展思路,仅供参考。它们可能有错误、不适用或者无法编译。您的硬件平台、使用场景和Arduino版本可能影响使用方法的选择。实际编程时,您要根据自己的硬件配置、使用场景和具体需求进行调整,并多次实际测试。您还要正确连接硬件,了解所用传感器和设备的规范和特性。涉及硬件操作的代码,您要在使用前确认引脚和电平等参数的正确性和安全性。

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值