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

目录

红外避障基本原理:

硬件:

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

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

电路图:

 软件:

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

代码实现

主函数:main.c

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

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


cybertruck 镇楼 (图文无关)

红外避障基本原理:

红外避障基本原理和上一篇的循迹很像,只不过传感元器件为一个红外传感器,检测到障碍物的时候,车辆后退 左右 转等动作

硬件:

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

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=10cm左右,

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

(传感器主动红外线反射探测,目标的反射率和形状是探测距离的关键。黑色探测距离最小,白色最大;小面积物体距离小,大面积距离大。)

避障后退距离: 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();  //避障函数
		}
 }

IRAvoid.h

#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段,最终在连接阶段,会在DATA段中存在多个相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空 间,而不是多份空间,假定这个变量在.h文件没有赋初值,编译器就会将之放入BSS段,连接器会对BSS段的多个同名变量仅分配一个存储空间。

PB1  口,基本思路就是配置GPIO的思路

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); 
}

避障函数: AVoidRun();

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
				
	}
	
}

  • 8
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值