STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

这篇具有很好参考价值的文章主要介绍了STM32循迹小车系列教程(三)—— 使用灰度传感器循迹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本章节主要讲解如何获取灰度传感器值以及如何使用灰度传感器循迹

灰度传感器简介

灰度传感器如图 1 所示

灰度传感器 使用一对抗干扰较强的光电传感器,其中发射管的光源采用高亮白色聚光 LED,发射管端发出的光线通过不同环境背景的反射之后,最终由光敏接收管来接收,光敏接收管的阻抗随反射光线的强弱变化而变化(反射光线越强,阻值越小),最后通过分压和运放比较电路实现数字/模拟信号的双输出。

灰度传感器模块对白光反射强弱不同背景环境有非常好的识别效果,背景差异越大,分辨效果越好。灰度传感器相比普通红外传感器有着更高的抗干扰能力。

STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

灰度传感器检测原理

灰度传感器是一组模拟传感器,由一只发光二极管和一只光敏接收管组成,二者安装在同一面上。 灰度传感器利用不同颜色的检测背景对光的反射程度不同,同时光敏接收管接收到不同检测面返回的光线,其阻值也不同的原理进行颜色深浅检测。

当光敏接收管接收到的光线越强, 它的阻值就越小, 即地面背景灰度越深或者离地距离越远, 光敏二极管的阻值越大。

在有效的检测距离内,发光二极管发出白光,照射在检测面上,检测面反射部分光线, 光敏接收管检测此光线的强度并通过分压电路和运放比较电路将其转换模拟/数字信号,最后通过机器人主板上的模拟/数字口输入到微控制器进行处理。

电路分析

STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

在上图所示灰度传感器检测电路中,LED1~3为发射补光管, LEDP1为光敏接收管,U1为比较运放芯片LM393A。用户可根据是否使用比较运放芯片决定使用模拟量或数字量。

使用模拟量时,ADC端的电压通过光电二极管分压得到,由光电二极管的特性曲线可得,当光电二极管接收光线弱时,光电二极管阻值趋向于无穷,此时ADC端电压接近于0。反之,当光电二极管接收光线强时,光电二极管阻值趋向于0,此时ADC端电压接近5V,由于不用颜色对于光的吸收程度不同,ADC端反映的值也不同,由此可根据光电二极管的值判断小车处于线的位置。

使用数字量时,当地面背景为深色或者高灰度值时, 经地面反射后进入光敏接收管端的光线较少, 2端输出的电压较高,经比较器比较后1端输出低电平控制三极管导通,GPIO输出高电平。同理当地面背景为浅色或者低灰度值时, 经地面反射后进入光敏接收管端的光线较多, 2端输出的电压较低,经比较器比较后1端输出低电平控制三极管截止,GPIO输出低电平。

数字量可满足大部分MCU,用户通过调节电位器RPOT1即可设定循迹阈值,而模拟量需要MCU具备ADC转化功能,将转化的数字量比较赛道路线的阈值即可获得和数字量一样的效果。相比之下,使用模拟量相对简单,但是需要消耗的MCU资源较多,而数字量不方便调节,但目前大多数MCU的IO口均有检测电平输入功能,用户无需二次配置。

循迹原理

巡线原理

1.先在平整的路面上调小车走直线。通过调整小车左右电机的速度,尽可能的让小车走直线,这样可以减少在巡线过程中调整的次数,可以让小车跑的更快。

2.巡线过程中,小车偏离线,如图1左,小车向左偏,应该增加左侧电机的速度,减小右侧的速度,减小或增加的量,根据小车实际情况修改测试。如图1右,小车向右偏,则相反。

3.靠近中心的探头照到线,调整的量要小些,越是离中心探头远的管子照到线,调整的量要越大。

4.调整的时候,切记不要将其中一个轮子停下来或者倒转。要用差速来调整方向这样车行走比较稳,而且速度要快。

STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

路口判断

路口判断,如图2所示,以7路巡线传感器为例,1号探头用来判断左侧T型路口。7号探头用来判断右侧T型路口。1和7同时照到线,用来判断十字路口。

STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

转弯判断

1.巡线走到需要转弯的路口,如图3。

2.车继续向前走一小段,让小车的旋转中心点靠近线的交叉点。小车有编码器可以用编码器精确控制,或没有编码器可以用延时,让车继续向前走一段时间,这些都需要实际写代码测试。

3.小车原地转弯,直到中间的探头(4号),照到线。这是转到第一个路口,若这条线是设定的路线,则巡线向前走,若不是这条线,继续旋转,等待中间的探头照到线,则转到了下一个路口。

STM32循迹小车系列教程(三)—— 使用灰度传感器循迹

循迹小车功能实现

灰度部分

uint8_t stop_way = 0;//停止线检测
uint8_t sensor_val[5];//灰度返回值
uint16_t gray_state = 0x0;//当前灰度状态
uint16_t gray_status[2]={0},gray_status_backup[2][20]={0};//灰度传感器状态与历史值
uint32_t gray_status_worse=0;	//灰度管异常状态计数器

/****************************
函数名称:
函数作用:5路循迹获取状态
函数参数:无
函数返回值:当前巡线状态 16进制
****************************/
uint16_t Sensor_GetState(void)
{
	uint16_t State = 0X0000;
	
//	sensor_val[0] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
//	sensor_val[1] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1);
//	sensor_val[2] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2);
//	sensor_val[3] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3);
//	sensor_val[4] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);
//	
//	State |= (sensor_val[4] << 4);
//	State |= (sensor_val[3] << 3);
//	State |= (sensor_val[2] << 2);
//	State |= (sensor_val[1] << 1);
//	State |= (sensor_val[0] << 0);
	
	for(int8_t i=4;i>=0;i--)
	{
		sensor_val[i] = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0<<i);
		State |= (sensor_val[i]<<i);
	}
	
	return State;
}

void gray_check(void)
{
	gray_state = Sensor_GetState();
	
	//记录上一次传感器量
	for(uint16_t i=19;i>0;i--)
	{
	    gray_status_backup[0][i]=gray_status_backup[0][i-1];
	}
	
	gray_status_backup[0][0]=gray_status[0];
	
	//灰度检测
	switch(gray_state)
	{
		case 0x01:gray_status[0] = 4; gray_status_worse/=2;break;	  //00001b
		case 0x03:gray_status[0] = 3; gray_status_worse/=2;break;	  //00011b
	    case 0x02:gray_status[0] = 2;	gray_status_worse/=2;break;   //00010b
		case 0x06:gray_status[0] = 1;	gray_status_worse/=2;break;	  //00110b
		case 0x04:gray_status[0] = 0;	gray_status_worse/=2;break;   //00100b
		case 0x0C:gray_status[0] = -1;gray_status_worse/=2;break;		//01100b
		case 0x08:gray_status[0] = -2;gray_status_worse/=2;break;		//01000b
		case 0x18:gray_status[0] = -3;gray_status_worse/=2;break;		//11000b
		case 0x10:gray_status[0] = -4;gray_status_worse/=2;break;		//10000b
		case 0x00:gray_status[0] = gray_status_backup[0][0];gray_status_worse++;break; //00000b
		
		default://其它特殊情况单独判断
		{
			gray_status[0]=gray_status_backup[0][0];
			gray_status_worse++;
		}
	}	
	
		switch(gray_state)//停止线检测
		{
			case 0x0F://01111b
			case 0x1E://11110b
			case 0x1F://11111b
			{
				stop_way++;
			}
			break;
		}		
}

主函数部分

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM2_Init();
  MX_TIM4_Init();
  /* USER CODE BEGIN 2 */
		HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
		HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
		
		HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
		HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		motor_ctrl(500+gray_status[0]*100,-(500-gray_status[0]*100));
		Get_Encoder();
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

可以观察到小车延黑线行驶 

循迹效果

需要代码的朋友可以点击以下链接下载,有问题请私信我。 

x(85条消息) 【免费】STM32循迹小车(灰度+OpenMV权重判断)资源-CSDN文库 文章来源地址https://www.toymoban.com/news/detail-441322.html

到了这里,关于STM32循迹小车系列教程(三)—— 使用灰度传感器循迹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32实战项目系列教程 (一)—— 循迹小车

    以往我们看到很多学习单片机知识的教程往往是从 单片机内部资源 出发,这样的教程原理往往晦涩难懂,初学者很难系统的学习开发单片机的项目。 而本次教程是 从项目出发 教你学习循迹小车的制作,整个项目采用 STM32 单片机作为控制器来实现,所以在学习前需要大家有

    2024年02月11日
    浏览(35)
  • stm32循迹小车教程(保姆级教程)

                    我历时四周终于制作完成原理图设计,原件焊接,代码测试,赛道循迹。在此,我要十分感谢在我制作过程中给予过帮助的所有人。首先明确小车使用主控芯片为stm32f103c8t6。                 制作小车要用的软件有:嘉立创EDA                 首先明确一

    2024年02月02日
    浏览(32)
  • STM32智能小车循迹教程

    本篇文章将带大家学习STM32智能小车的循迹功能。 电路工作描述 以其中一路为例 TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于关闭状态,此时比较器LM393的2脚的电压低于3脚的电压,输出O

    2023年04月08日
    浏览(45)
  • STM32CubeMX——循迹传感器TCRT5000的使用

    人生如逆旅,我亦是行人。 ————苏轼《临江仙·送钱穆父》 TCRT5000 是一种反射式光学传感器,它包括一个红外发射器和一个 3.5mm 引线封装的光电晶体管,可阻挡可见光。还具有 1mA 典型被测输出电流, 2.5mm 峰值工作距离,可应用传感与仪表,工业等行业。 TCRT5000 具有紧

    2024年02月04日
    浏览(28)
  • 使用STM32 再实现循迹/跟随/摇头避障小车

    硬件介绍和接线 TCRT5000 使用方法和原理见89C52时期的介绍。 循迹小车需要使用两个TCRT5000, 左侧的DO接到PB3 ; 右侧的DO接到PB4 CubeMX 1. 在上节的基础上进行修改 + 配置两个传感器的GPIO 2. 惯例配置更新代码 Keil 注意, 如果要使用PWM调速就必须全部是PWM调速 ,因为一旦使用PW

    2024年02月15日
    浏览(33)
  • 智能小车STM32——蓝牙循迹

    1、功能介绍 蓝牙切换功能:智能小车内置了蓝牙模块,可以通过手机或其他蓝牙设备与之连接。用户可以通过手机发送指令控制小车的运动方向,实现远程控制。 循迹功能:智能小车配备了红外线传感器,可以实现循迹功能。通过检测地面上的黑线或白线,小车能够自动沿着

    2024年01月19日
    浏览(45)
  • STM32智能小车------TCRT5000循迹

    ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生。 ⏩进入正题,最近在做小车,目前已经加入红外避障、超声波测距、红外遥控、红外循迹四个传感器,分别实现遥控切换模式、超声波控制距离、避障、循迹功能。 ⏩本次文章说说 循迹功能 的

    2024年02月14日
    浏览(36)
  • 【 STM32实例 】 智能小车的红外循迹

    这篇文章我主要讲的是让基于stm32单片机下的智能小车实现红外循迹功能,智能小车的项目非常多,比如说循迹避障、蓝牙遥控、视觉控制等等,我将会一步一步带大家走进stm32单片机的项目当中。 项目源码置文章底部,可自提 在硬件部分,与前几节我所介绍的51智能小车大

    2024年02月02日
    浏览(34)
  • STM32循迹避障小车(颜色识别)

    主控采用stm32F103C8T6,三个循迹模块,超声波模块,openmv,降压模块,锂电池组,TT马达四个,L298n。可以实现循迹,避障,颜色识别等功能。 1、循迹模块 红外循迹模块通常包含一组红外线发射管和一组红外线接收器,发射管发出红外线,接收器接收地面反射的红外线信号。

    2024年02月07日
    浏览(34)
  • 基于STM32的智能循迹避障小车实验(循迹部分)

    接上一部分基于STM32的智能循迹避障小车实验(小车运动部分) 上一篇我们成功让小车动起来了,现在我们试着让小车听话地运动。 这一部分主要利用了循迹模块两个 图 1循迹模块 就是这个东西: 一共三个引脚 VCC :电源线,连接单片机的 3.3V-5V GND :地线,连接单片机的接

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包