目录

前言:

小车效果展示:

5路数字灰度传感器:

巡线思路:

加入PID调节的代码:


前言:

之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当初的学习记录。

小车效果展示:

STM32RCT6主控,5路灰度寻迹,超声波HC_SR04中断式测距,蓝牙模块HC_08通信,AS4950电机驱动芯片,减缓了MPU6050零漂问题,PID丝滑_哔哩哔哩_bilibili

5路数字灰度传感器:

这是某宝上买的5路灰度传感器,价格稍微有点贵,50多块一个。当然,一分钱一分货,这个模块可以用小螺丝刀来调节传感器上面的旋钮,通过这个旋钮来调节灵敏度,这个灵敏度调节好了的话可以识别黑白循迹、红白循迹。所以还是比较值得的。

对于这款5路数字灰度传感器来说。识别到黑线,传回来的数字量就是0,识别到白色,传回来的数字量就是1。

巡线思路:

博主想着用这5路的中间三路来巡线,用最左和最右端的传感器用来识别十字或者丁字路口,巡线时,加入PID算法,遇到十字或者丁字路口就用最左和最右的传感器来识别,识别到了之后,我们就可以搭配MPU6050进行转90°弯了。

加入PID调节的代码:

其中 sensor_bias 是根据中间三路传感器和黑线的相对位置来估计出的误差(如果你要问我怎么得来的,其实这个数据大差不差就行,它只是为PID服务的一个变量罢了,甚至你可以把62.5改成50,最后只要调好PID三个参数,达到的效果是一样的),这里的decide类似于状态机的信号,我令decide为6的时候,也就是小车跑出了黑线,小车停止。

#include "sensor.h"
#include "stm32f10x.h"
#include "move.h"
#include "motor.h"
#include "FSM.h"//STEER4      --> PA11  --> R2  红线
//STEER3        --> PC9  --> R1  橘线
//                  --> PB4   --> M0  黄线
//STEER1        --> PA6   --> L1  绿线
//ENCODE1_A --> PB5    --> L2  棕线float Kp_sensor = 8.134, Ki_sensor = 0.021, Kd_sensor = 2.36;//pid弯道参数参数
float sensor_bias = 0;
float sensor_bias_last = 0;
float P = 0, I = 0, D = 0, PID_value = 0;  //pid直道参数
int decide;unsigned char move_flag;
extern unsigned char FSM_state;
void sensor_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启C时钟   PC9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//这句话其实可以不用,在使用输入功能时,不需要配置频率GPIO_Init(GPIOC, &GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启A时钟  PA11  PA6GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_6;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启B时钟  PB4  PB5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;GPIO_Init(GPIOB, &GPIO_InitStructure);
}unsigned char times;
extern unsigned char FSM_hc08;
unsigned char back_flag;
unsigned char one_time;
unsigned char one_flag;
unsigned char channel_num;//channel的存在导致发送2号通道的时候只会进入一次
void sensor_read()
{if((L2 == 1)&&(L1 == 1)&&(M0 == 1)&&(R1 == 0))// 1 1 1 0 {if(one_time == 0){if(FSM_hc08 == Channel_1){FSM_state = Turn_lift_state;//跳出循环,将PID分别清零。one_time++;P = 0;I = 0; D = 0;}else if(FSM_hc08 == Channel_2){if(one_flag == 0){channel_num++;one_flag = 1;}if(channel_num == 2){  FSM_state = stay2_state;//跳出循环,将PID分别清零。one_time++;P = 0;I = 0; D = 0;}}}}else if((L1 == 0)&&(M0 == 1)&&(R1 == 0))// 0 1 0 {sensor_bias = 0;decide = 3;one_flag = 0;//积分项清零}else if((L1 == 1)&&(M0 == 1)&&(R1 == 0))// 1 1 0 {sensor_bias = -62.5;decide = 2;}else if((L1 == 0)&&(M0 == 1)&&(R1 == 1))// 0 1 1 {sensor_bias = 62.5;decide = 2;}else if((L1 == 1)&&(M0 == 0)&&(R1 == 0))// 1 0 0 {sensor_bias = -125;decide = 4;}else if((L1 == 0)&&(M0 == 0)&&(R1 == 1))// 0 0 1 {sensor_bias = 62.5;decide = 4;}else if((L1 == 0)&&(M0 == 0)&&(R1 == 0))// 0 0 0 {decide = 6;}else if((L1 == 1)&&(M0 == 1)&&(R1 == 1))// 1 1 1 {decide = 6;FSM_state = Judge_state;       //如果读取到了整条黑线,那么就进入下一状态if(back_flag == 1){FSM_state = Back_state;back_flag = 0;}          //第一次识别到全黑线为小车停止线。第二次识别到,代表小车即将回归循迹}}
void Sensor_pid()
{if(decide<=5){P = sensor_bias;I = I + sensor_bias;D = sensor_bias-sensor_bias_last;PID_value = Kp_sensor*P + Ki_sensor*I + Kd_sensor*D;sensor_bias_last = sensor_bias;//对积分值设置一个限制,防止积分值超标if(I >=3500)I = 3500;if(I <= -3500)I = -3500;PWM_value_R = 2099 - (int)PID_value;PWM_value_L = 2099 + (int)PID_value;//当线在左,左轮要慢,右轮要快,左轮要加,右轮要减,但这里的偏差是负值Motor3_forward(PWM_value_R);Motor4_forward(PWM_value_L);//4 --> 右电机//3 --> 左电机 }else{Move_stop();}
}

对应的头文件部分

#ifndef __SENSOR_H
#define __SENSOR_H//STEER4 --> PA11 --> R2  绿线
//STEER3 --> PC9     --> R1  黄线
//      B  --> PB6  --> M0  橘线
//STEER1 --> PA6  --> L1  红线
//      A  --> PB7   --> L2  白线
// 灰度传感器,当传感器识别到黑线的时候,输出为1,其余时刻输出为0
// 所以在这里我们要使用下拉输入
#define L2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)
#define L1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
#define M0 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
#define R1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)
#define R2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)void sensor_Init(void);
void sensor_read(void);
void Sensor_pid(void);#endif

四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹相关推荐

  1. 四轮两驱小车(一):STM32驱动AS4950

    目录 前言: 效果展示: 车体展示: 前言: 在前两周的时间里,我对上个版本的小车进行了一个更新换代,将原本的4驱小车换成了4轮两驱小车,舍弃了树莓派4B作为上位机.新版小车采用两个520直流减速电机 ...

  2. ARDUINO NANO 的 PID 循迹小车

    [Arduino项目]使用 ARDUINO NANO 的 PID 循迹小车 -------------------------------------------------------------- ...

  3. arduino两轮小车 四红外传感模块 循迹代码 供大家参考交流,如有更好的方法希望不吝赐教

    参加学校举办的循迹小车比赛,由于是新手,写的程序不免有些冗杂,但结果还是不错的,所以写在这里供大家参考交流. 如有更简单的方法,请不吝赐教

  4. 【32最小系统板】pid循迹小车(铁丝循迹)

    文章目录 前言 一.任务.要求及评分标准 1.1 任务 1.2 要求及评分标准 1.3 说明 二.先上视频效果 三.小车循迹方法 1.第一次做循迹时 2.第二次做循迹时 状态机 调PID 四.铁丝与硬 ...

  5. STM32控制3路超声波传感器

    使用STM32定时器输入捕获模块控制3路超声波传感器 本次使用的超声波传感器是常见HC-SR04,该传感器常常使用在小型机器人和智能小车的避障系统中. 在上图中,5v和GND为模块提供电能,Trig用 ...

  6. 基于STM32F103C8T6最小系统板驱动灰度模块进行循迹

    循迹小车,我们学院进行过一次实训,正好也今年四川省电子设计大赛C题刚好也跟循迹分不开关系(电赛用的TI板子噢).通过这两次机会,对灰度循迹有了很好的理解. 先来说说,灰度模块. 我用的是六路灰度. 长 ...

  7. 【arduino】三路pid循迹小车

    这是个很久之前的项目,没有保存照片,故使用文字+图片说明 先提前说明,想用pid就需要足够的精度,数字信号很难满足,故选用模拟信号,51系列建议放弃,没有自带模拟接口,只能外接转换器,非常麻烦 pid ...

  8. ROS小车-上位机代码:两驱小车直线行走校准

    前言 要想实现对小车的精准控制.定位精度的准确,那必然前提就是找到小车速度控制的数学逻辑. 本文实现的目的是:通过teleop_twist_keyboard键盘速度控制节点,给小车下发速度指令,希望在 ...

  9. STM32驱动ADXL345三轴传感器

    简介:STM32F103C8T6驱动ADXL345三轴倾斜度传感器源码介绍. 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:ADXL345 特别提示:驱动内可能使用了 ...

最新文章

  1. 服务器无法显示大内存的处理办法
  2. Hyper-v Server虚拟光纤通道
  3. 浅析网站SEO整站优化的优势!
  4. db2查询字段备注_通过逐浪数据精灵管理sqlserver数据表备注以及字段说明
  5. docker启动mysql容器_Docker容器开机自启动
  6. Wait-for-it之参考
  7. 瑞士行-少女峰,峡谷徒步
  8. 程序员如何巧妙学习算法技巧?
  9. Docker-服务安装
  10. 老白聊数据-关于销售预测的那些事
  11. 程序设计实践(评注版) 评注者序
  12. 4g内存 mysql_mysql 4G内存配置表
  13. 如何将带网口打印机进行局域网共享打印
  14. 2021年电工(中级)报名考试及电工(中级)考试资料
  15. DataSciComp 有关数据科学的比赛
  16. Chrome浏览器获取Google搜索结果批量URL
  17. logback入库配置
  18. 016--JLE JNG(小于等于)
  19. 华为开发人员与测试人员
  20. 2017年5月许小年最新演讲:深圳人没房的,还是咬咬牙就买吧!

热门文章

  1. 2011年的一些思考
  2. 基于SCORM标准课件的移动客户端架构设计
  3. CAN通信----CANTest下载和安装
  4. 我与我的专业计算机作文500字,我的理想作文500字——电脑高手
  5. 前端开发的工具化与工程化
  6. 无线射频专题《IEEE 802.11协议讲解2@WiFi抓包分析之MAC_Header》
  7. PMBOK(第六版) PMP笔记——《九》第九章(项目资源管理)
  8. 学生选课系统的ER图
  9. DNF单机版:注册失败的解决
  10. $(function() {})是什么?