pid循迹小车的实现,arduino
帮我写一个Arduino循迹小车的程序,小车前面有并列8个红外发射接收传感器,每个红外发射接收传感器为1cm宽,地面循迹的线是大约2cm宽黑色的线,地面其他位置是白色的,要求循迹小车运行的速度快,使用pid算法控制速度实现精准的转向
首先,我们需要定义红外线传感器的引脚和变量:
const int numSensors = 8; // 传感器的数量
const int sensors[numSensors] = {A0, A1, A2, A3, A4, A5, A6, A7}; // 传感器的引脚
int sensorValues[numSensors]; // 保存传感器的值
接下来,定义PID算法中需要使用的变量:
float Kp = 0.2; // 比例系数
float Kd = 0.1; // 微分系数
float Ki = 0.05; // 积分系数
float lastError = 0; // 上一次的误差
float totalError = 0; // 总误差
在setup()函数中初始化引脚:
void setup() {
for (int i = 0; i < numSensors; i++) {
pinMode(sensors[i], INPUT);
}
}
在loop()函数中,读取传感器的值并计算PID输出:
void loop() {
// 读取传感器的值
for (int i = 0; i < numSensors; i++) {
sensorValues[i] = digitalRead(sensors[i]);
}
// 计算误差
float error = 0;
float sum = 0;
for (int i = 0; i < numSensors; i++) {
error += (i - 3.5) * sensorValues[i]; // i - 3.5 是为了让误差在[-3.5, 3.5]之间
sum += sensorValues[i];
}
if (sum == 0) { // 避免除0错误
return;
}
error /= sum;
// 计算PID输出
float pidOutput = Kp * error + Kd * (error - lastError) + Ki * totalError;
lastError = error;
totalError += error;
// 控制小车运动
int leftSpeed = 200 + pidOutput; // 左轮的速度
int rightSpeed = 200 - pidOutput; // 右轮的速度
if (leftSpeed > 255) { // 速度限制在[0, 255]之间
leftSpeed = 255;
} else if (leftSpeed < 0) {
leftSpeed = 0;
}
if (rightSpeed > 255) {
rightSpeed = 255;
} else if (rightSpeed < 0) {
rightSpeed = 0;
}
analogWrite(3, leftSpeed); // 控制左轮速度的引脚
analogWrite(5, rightSpeed); // 控制右轮速度的引脚
}
其中,error表示当前的偏差,pidOutput表示PID算法计算出的控制量,leftSpeed和rightSpeed表示左右轮的速度
pid循迹小车的实现,arduino的更多相关文章
- Micropython教程之TPYBoard制作蓝牙+红外循迹小车
1.实验目的 学习在PC机系统中扩展简单I/O接口的方法. 进一步学习编制数据输出程序的设计方法. 学习蓝牙模块的接线方法及其工作原理. 学习L298N电机驱动板模块的接线方法. 学习蓝牙控制小车的工 ...
- arduino智能循迹小车代码(三个循迹模块)
#include <Servo.h>int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = ...
- arduino循迹小车
int MotorRight1=14; int MotorRight2=15; int MotorLeft1=16; int MotorLeft2=17; int MotorRPWM=3; int M ...
- 智能循迹避障小车&抢答器
智能循迹避障小车 →视频链接← 抢答器
- MicroPython教程之TPYBoard开发板DIY红外寻迹小车
智能小车现在差不多是电子竞赛或者DIY中的主流了,寻迹,壁障,遥控什么的,相信大家也都见得很多了,这次就大家探讨一下寻迹小车的制作方法,不同于以往的是这次的程序不用C语言写,而是要使用python语言 ...
- 基于STM32单片机的简单红外循迹的实现
初步接触STM32,采用两路红外传感器实现小车循迹,稍显简略,如有不好的地方,欢迎大家指点改正
- 我的大学,我的SPR机器人队
时间过的真快,我这个在协会呆了好多年的老油条今年都毕业了,在石油大学大学七年几乎三分之二的时间就是在协会度过的.实话说在北京这是我最亲切的地方,这里有我喜欢的各种设备,有亲爱的老师和一起奋斗的队友,在 ...
- TPYBoard V102:能跑Python的stm32开发板
近来micropython语言做硬件编程很火,随之而来的就开始带动着支持micropython语言编程的开发板也开始火的发烫,今天小编就来和大家介绍一款很经典的micropython开发板-TPYBo ...
- [MicroPython]TPYBoardv102超全DIY案例一览
TPYBoardv102是一款比较成熟和经典的MicroPython开发板,不仅适用于学习实验还能应用于大型的工业级开发,是MicroPython入门和研发的不二之选.下面我们就扒开v102的“层层外 ...
- stm32定时器学习二——PWM设置
/* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...
随机推荐
- 仅需10秒!ChatGPT轻松画出UML用例图,我却苦战10分钟。
当我们写技术文档时,一张系统用例图,平时要花费10分钟才完成,而ChatGPT绘图过程只用了10秒钟,基本可以达到同样的水平,通过ChatGPT可以显著提高画流程图的效率. 什么是用例图 用例图是统一 ...
- 从零开始写 Docker(五)---基于 overlayfs 实现写操作隔离
本文为从零开始写 Docker 系列第五篇,在 pivotRoot 基础上通过 overlayfs 实现写操作隔离,达到容器中写操作和宿主机互不影响. 完整代码见:https://github.com ...
- npm install 的执行顺序,和 安装包的源死磕
npm install 源的地址加载执行顺序 从近到远 lock文件 这里直接就记录了 包的下载地址 .npmrc 里面的内容 registry=http://registry.npm.xxxx.co ...
- RGB、HSV、HSL和CMYK颜色空间
目录 简介 RGB(红绿蓝)颜色空间 HSV(色调.饱和度.亮度)颜色空间 HSL(色调.饱和度.亮度)颜色空间 CMYK(青.品红.黄.黑)颜色空间 简介 这四种颜色空间在不同的应用领域有不同的用途 ...
- Python Numpy 中的打印设置函数set_printoptions
一 概述 np.set_printoptions()用于控制Python中小数的显示精度. 二 解析 np.set_printoptions(precision=None, threshold=Non ...
- gcc编译stm32 f103出现错误init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'
解决方法: 方法一:去掉makefile中的编译选项:-nostartfiles 方法二:方法一不凑效的情况下,添加编译选型:--specs=nano.specs
- 【Linux】Git 安装最新版
# 移除旧版 Git yum remove git # 安装依赖包 yum install curl-devel expat-devel gettext-devel openssl-devel zli ...
- Android 开发Day7
<project version="4"> <component name="ExternalStorageConfigurationManager&q ...
- 实时云渲染:流式传输 VR 和 AR 内容
想象一下无需专用的物理计算机,甚至无需实物连接,就能获得高质量的 AR/VR 体验是种什么样的体验? 过去,与 VR 交互需要专用的高端工作站,并且根据头显.壁挂式传感器和专用的物理空间.VR 中的复 ...
- 【OpenCV】OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上. 它轻量级而且高效--由一 ...