四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹
目录
前言:
小车效果展示:
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循迹相关推荐
- 四轮两驱小车(一):STM32驱动AS4950
目录 前言: 效果展示: 车体展示: 前言: 在前两周的时间里,我对上个版本的小车进行了一个更新换代,将原本的4驱小车换成了4轮两驱小车,舍弃了树莓派4B作为上位机.新版小车采用两个520直流减速电机 ...
- ARDUINO NANO 的 PID 循迹小车
[Arduino项目]使用 ARDUINO NANO 的 PID 循迹小车 -------------------------------------------------------------- ...
- arduino两轮小车 四红外传感模块 循迹代码 供大家参考交流,如有更好的方法希望不吝赐教
参加学校举办的循迹小车比赛,由于是新手,写的程序不免有些冗杂,但结果还是不错的,所以写在这里供大家参考交流. 如有更简单的方法,请不吝赐教
- 【32最小系统板】pid循迹小车(铁丝循迹)
文章目录 前言 一.任务.要求及评分标准 1.1 任务 1.2 要求及评分标准 1.3 说明 二.先上视频效果 三.小车循迹方法 1.第一次做循迹时 2.第二次做循迹时 状态机 调PID 四.铁丝与硬 ...
- STM32控制3路超声波传感器
使用STM32定时器输入捕获模块控制3路超声波传感器 本次使用的超声波传感器是常见HC-SR04,该传感器常常使用在小型机器人和智能小车的避障系统中. 在上图中,5v和GND为模块提供电能,Trig用 ...
- 基于STM32F103C8T6最小系统板驱动灰度模块进行循迹
循迹小车,我们学院进行过一次实训,正好也今年四川省电子设计大赛C题刚好也跟循迹分不开关系(电赛用的TI板子噢).通过这两次机会,对灰度循迹有了很好的理解. 先来说说,灰度模块. 我用的是六路灰度. 长 ...
- 【arduino】三路pid循迹小车
这是个很久之前的项目,没有保存照片,故使用文字+图片说明 先提前说明,想用pid就需要足够的精度,数字信号很难满足,故选用模拟信号,51系列建议放弃,没有自带模拟接口,只能外接转换器,非常麻烦 pid ...
- ROS小车-上位机代码:两驱小车直线行走校准
前言 要想实现对小车的精准控制.定位精度的准确,那必然前提就是找到小车速度控制的数学逻辑. 本文实现的目的是:通过teleop_twist_keyboard键盘速度控制节点,给小车下发速度指令,希望在 ...
- STM32驱动ADXL345三轴传感器
简介:STM32F103C8T6驱动ADXL345三轴倾斜度传感器源码介绍. 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:ADXL345 特别提示:驱动内可能使用了 ...
最新文章
- 服务器无法显示大内存的处理办法
- Hyper-v Server虚拟光纤通道
- 浅析网站SEO整站优化的优势!
- db2查询字段备注_通过逐浪数据精灵管理sqlserver数据表备注以及字段说明
- docker启动mysql容器_Docker容器开机自启动
- Wait-for-it之参考
- 瑞士行-少女峰,峡谷徒步
- 程序员如何巧妙学习算法技巧?
- Docker-服务安装
- 老白聊数据-关于销售预测的那些事
- 程序设计实践(评注版) 评注者序
- 4g内存 mysql_mysql 4G内存配置表
- 如何将带网口打印机进行局域网共享打印
- 2021年电工(中级)报名考试及电工(中级)考试资料
- DataSciComp 有关数据科学的比赛
- Chrome浏览器获取Google搜索结果批量URL
- logback入库配置
- 016--JLE JNG(小于等于)
- 华为开发人员与测试人员
- 2017年5月许小年最新演讲:深圳人没房的,还是咬咬牙就买吧!
热门文章
- 2011年的一些思考
- 基于SCORM标准课件的移动客户端架构设计
- CAN通信----CANTest下载和安装
- 我与我的专业计算机作文500字,我的理想作文500字——电脑高手
- 前端开发的工具化与工程化
- 无线射频专题《IEEE 802.11协议讲解2@WiFi抓包分析之MAC_Header》
- PMBOK(第六版) PMP笔记——《九》第九章(项目资源管理)
- 学生选课系统的ER图
- DNF单机版:注册失败的解决
- $(function() {})是什么?