首页 > 其他分享 >pid循迹小车的实现,arduino

pid循迹小车的实现,arduino

时间:2023-04-26 11:12:48浏览次数:43  
标签:循迹 arduino int float pid numSensors leftSpeed error rightSpeed

帮我写一个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表示左右轮的速度

标签:循迹,arduino,int,float,pid,numSensors,leftSpeed,error,rightSpeed
From: https://www.cnblogs.com/LiuXinyu12378/p/17355039.html

相关文章

  • pid算法函数实现,c语言版
     #include<stdio.h>floatpid(floatsetpoint,floatprocess_variable,floatkp,floatki,floatkd,floatdt,float*integral,float*last_error){//Calculateerrorfloaterror=setpoint-process_variable;//Calculateintegral......
  • 利用Arduino制作音乐播放+随节奏闪光仪器实现
    1.实验器材Arduino开发板,面包板一块,杜邦线若干,LED灯若干,220欧电阻若干,蜂鸣器一个。2.实验操作将六个led灯的正极依次接到arduino板I/O接口的2-7口,电源负极依分别接一个220欧的电阻。整体负极接arduino板的GND接口。蜂鸣器正极接arduino板I/O接口的8口,负极接GND。3.代码......
  • 【HMS Core】视频编辑服务报错method not allowed 20124、Parameter error. Error: ap
    【关键字】视频编辑服务、报错 【问题背景】问题1:集成视频剪辑服务,在原子能力SDK的素材管理时,提示Parametererror.Error:appIdisinvalid.问题2:视频编辑sdkdemo的所有功能提示methodnotallowed20124,后台已申请动态照片、一键微笑、AI着色、一键动效、一键染发的功能......
  • RapidAPI —— mac 上最先进的 API 测试工具
    RapidAPIforMac是一个功能齐全的HTTP客户端,可让您测试和描述您构建或使用的API。它有一个漂亮的原生macOS界面来编写请求、检查服务器响应、生成客户端代码和导出API定义。官网:https://jenni.ai/......
  • m厌氧间歇发酵动态控制系统matlab仿真,对比PID控制和MPC控制
    1.算法描述        生物发酵过程,其中稀释速率和供料基质浓度可作为操作变量。出口的细胞浓度或生物浓度、基质浓度以及产品浓度是过程的状态变量。例如在生产酒精的发酵过程中,是酵母浓度,是葡萄糖浓度,而是乙醇浓度。假设发酵培养基是单一均相生长的有机体,则广泛采用的非构......
  • Day 25 25.1 Scrapy框架之全站爬虫(CrawlSpider)
    Scrapy框架之全站爬虫(CrawlSpider)在之前Scrapy的基本使用当中,spider如果要重新发送请求的话,就需要自己解析页面,然后发送请求。而CrawlSpider则可以通过设置url条件自动发送请求。LinkExtractorsCrawlSpider是Spider的一个派生类。CrawlSpider与spider不同......
  • 功能强大的JavaScript引擎--SpiderMonkey
    JavaScript在浏览器中的应用几乎是尽人皆知的。实际上,JavaScript技术也可以使用在非浏览器应用程序当中,从而让应用程序具有自动的脚本功能。本文介绍了一种功能非常强大的JavaScript引擎SpiderMonkey。这个引擎是Mozilla浏览器的JavaScript引擎。该引擎接口定......
  • 基于神经网络的自适应PID控制器 通过将RBF(BP)神经网络和PID控制器相结合
    基于神经网络的自适应PID控制器通过将RBF(BP)神经网络和PID控制器相结合,建立了神经网络PID控制器,采用传递函数进行系统建模,通过自动调整PID参数,实现了对方波信号的跟踪。程序有注释YID:5650652300828715......
  • 基于51单片机智能小车循迹功能的实现
    说明:本博客来自本人CSDN博客点击跳转本人csdn博客点击跳转本人个人网站目录说明:本博客来自本人CSDN博客一、思路(仅供参考)二、部分硬件模块介绍1、L298n电机驱动模块2、两路红外循迹模块三、实现1、代码2、运行视频四、总结一、思路(仅供参考)本实验采用两路红外循迹模块单黑线......
  • Spider爬虫
    爬虫Spider该爬虫分为两部分,分别为Spider.py和model.pySpider.py该文件主要业务逻辑是调用Selenium来通过自动化测试的方法实现模拟人的行为来对网页进行请求,并将请求到的HTML提取为文本,为后续的数据抽取做铺地。需要的第三方工具包Selenium,scrapy,timespider.py具体实现fr......