帮我写一个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. JS5-PC端网页特效

    常见offset系列属性作用 常见client系列属性作用 常见scroll系列属性作用 封装简单动画函数 写出网页轮播图案例 offset 偏移量,使用offset相关属性可以动态的得到该元素的位置 ...

  2. 记一次docker安装Jenkins

    docker安装Jenkins 0. 下载docker镜像 docker search jenkins docker pull jenkins/jenkins:lts 1. 安装步骤 创建映射文件夹 ...

  3. Istio中的核心资源及定义

    Istio 的核心资源主要包括以下几种: 1. Gateway 用于建模边缘网关,可以为进入或离开网格的流量提供专用的入口和出口点.Gateway 定义了在网格边缘运行的负载均衡器,用于接收传入或传出 ...

  4. k8s通过help、dry-run、explain提高编写yaml效率

    在Kubernetes(k8s)环境中,help.dry-run和explain命令可以帮助你提高编写YAML文件的效率.这些命令提供了关于资源定义.命令用法和字段说明的信息,从而让你能够更快速.更准 ...

  5. stm32 串口DMA调试总结和反思

    一 引言 最近在调试stm32的多串口.没想到居然遇到那么多的问题.这里做一个总结,还是非常有必要的. 二 问题 这里先弄清楚几个问题. 1 串口有必要使用DMA吗? DMA可以在串口高速的时候不占用 ...

  6. 基于Apollo3 Blue MCU芯片的可穿戴产品解决方案开发之健康手环源码解析

    一 前记 健康手环是Apollo3 Blue的一个主打业务,也是该芯片最适合做的产品,在健康穿戴设备领域,该芯片有着对场景的透彻理解和技术的深厚积累. 二 源码分析 协议栈初始化: exactle_s ...

  7. 《TencentNCNN系列》 之bin文件(网络参数文件)格式分析

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. uni学习笔记分享

    目录介绍 01.遇到问题汇总 02.关于布局设置 03.基础语法总结 04.关于交互问题 06.关于回传数据 07.关于网络请求 08.关于页面刷新 09.关于注意问题 10.待解决和思考 01.遇到 ...

  9. 03.Android之View原理问题

    目录介绍 3.0.0.1 View的绘制需要经过哪些过程?有哪些常用回调方法?View的绘制流程的详细流程是怎样的? 3.0.0.2 View绘制流程,当一个TextView的实例调用setText( ...

  10. drools执行String规则或执行某个规则文件

    1.背景 此处主要记录一下2个小的知识点,防止以后忘记. 1.如何在drools中执行某个drl文件. 2.如果我们的规则是一个String类型的字符串,那么该如何执行. 2.实现 2.1 执行指定的 ...