帮我写一个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算法计算出的控制量,leftSpeedrightSpeed表示左右轮的速度

pid循迹小车的实现,arduino的更多相关文章

  1. Micropython教程之TPYBoard制作蓝牙+红外循迹小车

    1.实验目的 学习在PC机系统中扩展简单I/O接口的方法. 进一步学习编制数据输出程序的设计方法. 学习蓝牙模块的接线方法及其工作原理. 学习L298N电机驱动板模块的接线方法. 学习蓝牙控制小车的工 ...

  2. arduino智能循迹小车代码(三个循迹模块)

    #include <Servo.h>int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = ...

  3. arduino循迹小车

    int MotorRight1=14; int MotorRight2=15; int MotorLeft1=16; int MotorLeft2=17; int MotorRPWM=3; int M ...

  4. 智能循迹避障小车&抢答器

    智能循迹避障小车 →视频链接← 抢答器

  5. MicroPython教程之TPYBoard开发板DIY红外寻迹小车

    智能小车现在差不多是电子竞赛或者DIY中的主流了,寻迹,壁障,遥控什么的,相信大家也都见得很多了,这次就大家探讨一下寻迹小车的制作方法,不同于以往的是这次的程序不用C语言写,而是要使用python语言 ...

  6. 基于STM32单片机的简单红外循迹的实现

    初步接触STM32,采用两路红外传感器实现小车循迹,稍显简略,如有不好的地方,欢迎大家指点改正

  7. 我的大学,我的SPR机器人队

    时间过的真快,我这个在协会呆了好多年的老油条今年都毕业了,在石油大学大学七年几乎三分之二的时间就是在协会度过的.实话说在北京这是我最亲切的地方,这里有我喜欢的各种设备,有亲爱的老师和一起奋斗的队友,在 ...

  8. TPYBoard V102:能跑Python的stm32开发板

    近来micropython语言做硬件编程很火,随之而来的就开始带动着支持micropython语言编程的开发板也开始火的发烫,今天小编就来和大家介绍一款很经典的micropython开发板-TPYBo ...

  9. [MicroPython]TPYBoardv102超全DIY案例一览

    TPYBoardv102是一款比较成熟和经典的MicroPython开发板,不仅适用于学习实验还能应用于大型的工业级开发,是MicroPython入门和研发的不二之选.下面我们就扒开v102的“层层外 ...

  10. stm32定时器学习二——PWM设置

    /* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...

随机推荐

  1. golang官方包管理vendor模式无法引用非go文件

    主页 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ 背景&问题 golang作为高级计算机语言之一,在云原生以及web网站 ...

  2. 基于RocketMQ实现分布式事务(半消息事务)

    一.背景 RocketMQ的分布式事务可以称为"半消息事务". 二.原理 2.1原理 RocketMQ是靠半消息机制实现分布式事务: 事务消息:MQ 提供类似 X/Open XA ...

  3. JS4-BOM浏览器对象类型

    什么是BOM 浏览器的顶级对象 页面加载事件以及注意事项 定时器函数 JS执行机制 页面跳转.刷新 history.navigator对象 什么是BOM 浏览器对象模型(Browser Object ...

  4. C++ 中的关联,聚合,组合 以及 它们的生命周期。

    关联,C++使用指针实现,两者到关系最弱,并且可以两向关联,B* A::b 与 A* B::a 可以并存,两者间没有明确的ownership关系,为什么不是引用,因为引用没有办法实现相向引用,这会是一 ...

  5. .NET开源快速、强大、免费的电子表格组件

    前言 今天大姚给大家分享一个.NET开源(MIT License).快速.强大.免费的电子表格组件,支持数据格式.冻结.大纲.公式计算.图表.脚本执行等.兼容 Excel 2007 (.xlsx) 格 ...

  6. 记一次kafka无法生产发送消息排查经历

    参考,欢迎点击原文:https://stackoverflow.com/questions/37902167/kafka-error-while-fetching-metadata-with-corr ...

  7. CodeForces Hello 2024 个人题解(A~C)

    A. Wallet Exchange 时间限制: 1秒 内存限制: 256兆 输入: 标准输入 输出: 标准输出 Alice and Bob are bored, so they decide to ...

  8. 手把手制作mobileconfig文件,在iphone上创建h5网页桌面图标

    1,下载mobileconfig文件制作工具 下载地址:点击关注公众号,回复appicon, 获取工具的下载地址 新建配置描述文件,填写通用信息 填写Web Clip信息 点击菜单栏的导出,注意这里一 ...

  9. docker相关命令杂理

    - 2020.11.16docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #保存现有的镜像 # docker commit -a "r ...

  10. Java获取客户端IP地址进行记录

    1.编写工具类IpUtils public class IpUtils { /** * 访问IP:0:0:0:0:0:0:0:1 * 访问IP:192.168.1.10 */ private stat ...