资讯详情

STM32 学习笔记3-智能小车-红外避障

红外避障的基本原理:

硬件:

红外传感元器件:红外,眼睛,探测前方障碍物的情况,并反馈给小车

控制模块:STM32 F103 系列 LM393 :比较电压

电路图:

软件:

逻辑定义(及相关系统性能定义):

代码实现

主函数:main.c

越学越糊涂,C语言中 .h文件和.c文件区别?

红外避障配置:void IRAvoidInit(void) PB1 口的基本思路是配置GPIO的思路


红外避障

红外避障的基本原理与上一篇文章非常相似,但传感器元件是红外传感器。当检测到障碍物时,车辆后退 左右 转等动作

红外传感元件:红外,,探测前方障碍物的情况,并反馈给汽车

F5红外发射管940NM V7

F5红外接受管940NM V4

详细了解:以下链接文章红外收发管参数及硬件设计参考:_sternlycore的博客-CSDN博客_二极管参数红外接收

汽车及相关附件:,车身底板,四轮, 其功能是提供相关部件的安装点

驱动:,电机 两台直流电机

控制模块:STM32 F103 系列 LM393 :比较电压

2.模块描述电路板尺寸:3.2CM*1.4CM;3mm 螺孔易于固定和安装;接通电源后,红色指示灯亮起。传感器模块对环境光有很强的适应性。它有一对红外发射和接收管。发射管发射一定频率的红外。当检测方向遇到障碍物(反射面)时,红外反射被接收管接收,通过比较器LM393电路处理后,绿色指示灯亮起,信号输出接口输出数字信号(低电平信号),检测距离可通过电位器旋钮调节,顺时针调节电位器,增加检测距离;逆时针调节电位器,减少检测距离,有效距离范围为2~30cm,检测角度35°,工作电压为3.3V-5V。传感器模块输出端口OUT 可直接与单片机配合IO 口连接也可以直接驱动5V 继电器;目标反射率和形状是探测距离的关键。黑色探测距离最小,白色探测距离最大;小物体距离小,大面积距离大。接口:1 VCC 外接3.3V-5V 电压(可直接与5v 单片机和3.3v 单片机连接);2. GND 外接GND;3 OUT 数字量输出接口(0 和1)调试时注意不要用黑色遮挡,红外线直接吸收后不能返回。 ———————————————— 原文链接:https://blog.csdn.net/u011878611/article/details/110110927

传感器持续 检测前方障碍物

1、无障碍物→ 保持前进

2.有障碍物→ 后退→向左转→ 检测障碍物

3、若无→前进

4、若有→回到第二步

设置相关参数

传感器:传感器探测距离S=10m左右,

传感器:探测物体的类型=黑色为啥不能检测?与物体表面的光洁度有关系?涉及标定

避障后退距离: L1=speed * time 

避障左转:  speed   和   time 的设置     大概就这些

其实最最重要的是,避障的策略相关算法的实现,由于我这个小车就是买的网上的成品,非定制,暂未这么深入分析,还在摸索基本功能。

主函数:main.c

主函数比较简单,各个函数的初始化,最主要的是 避障函数的定义

#include "stm32f10x.h"  //stm 系统函数
#include "delay.h"        //延时函数
#include "motor.h"      //电机
#include "keysacn.h"    //按键扫描函数
#include "IRSEARCH.h"    //红外搜索函数
#include "IRAvoid.h"     //红外避障函数

 int main(void)
 {	
	 delay_init();    //初始化延时
	 KEY_Init();      //初始化按键
	 IRSearchInit();   //初始化 红外搜索  
	 IRAvoidInit();     //初始化红外避障
	 TIM4_PWM_Init(7199,0);  //初始化 PWM 避障
	 STM32_brake(500);      //电机刹车0.5s
	 keysacn();		        //初始化按键搜索
		while(1)
		{  
		 AVoidRun();  //避障函数
		}
 }

#ifndef __IRAVOID_H_
#define __IRAVOID_H_

#include "stm32f10x.h"                  // Device header

void IRAvoidInit(void);
void AVoidRun(void);
/* 
避障传感器AVOID_PIN	PB1
 */

#define AVOID_PIN         GPIO_Pin_1
#define AVOID_PIN_GPIO    GPIOB
#define AVOID_IO          GPIO_ReadInputDataBit(AVOID_PIN_GPIO, AVOID_PIN)
#define BARRIER_Y 0      //有障碍物
#define BARRIER_N 1      //无障碍物

#endif

越学越糊涂,C语言中 .h文件和.c文件区别?

(来源于:C语言中 .h文件和.c文件区别 - 知乎)

一、意思不同

  1. .h中一般放的是同名.c文件中定义的变量、数组、函数的,需要让.c外部使用的声明。
  2. .c文件一般放的是变量、数组、函数的

二、用法不同

  1. .h文件,称为,一般存储类型的定义,函数的声明等。通常,头文件被.c文件包含,使用#include 语句。但值得注意的是,这只是一种约定,而非强制。
  2. .c文件,以c为扩展名,一般

三、作用

如果在.h文件中实现一个函数体,那么如果在多个.c文件中引用它,而且又同时编译多个.c文件,将其生成的目标文件连接成一个可执行文件,在每个引用此.h文件的.c文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成,那么在连接时,就会发现多个相同的函数,就会报错。

如果在.h文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此.h文件的.c文件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编 译器就会将此变量放入,最终在连接阶段,会在DATA段中存在多个相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空 间,而不是多份空间,假定这个变量在.h文件没有赋初值,编译器就会将之放入连接器会对BSS段的多个同名变量仅分配一个存储空间。

void IRAvoidInit(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
	GPIO_InitStructure.GPIO_Pin = AVOID_PIN;            // PB1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;       // 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   // 
	GPIO_Init(AVOID_PIN_GPIO , &GPIO_InitStructure); 
}

避障函数: 

void AVoidRun(void)
{
	if(AVOID_IO == BARRIER_N )     //BARRIER_N=0  无障碍物   BARRIER_Y=1 有障碍物  
	{
		 STM32_run(50,10);       //直行
		 BEEP_RESET;                //蜂鸣器不工作
     LED_D3_RESET;		            //LED不亮
	}
	else
	{
	 BEEP_SET;                     //蜂鸣器不工作        
     LED_D3_SET;	               //LED亮
	     STM32_brake(300);         //停止300MS
		 STM32_back(50,400);      //后退400MS
	     STM32_Left(50,500);     //左转500MS
				
	}
	
}

标签: 50cm红外避障传感器传感器线色白色红色620nm二极管980nm红外光二极管1050nm发射二极管模块450nm二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台