基于 STM32 智能小车红外避障模块化控制程序

这里用到了两个红外避障模块,分别充当左右两边眼睛,我们结合上一章节内容,来做一个红外避障模块化的扩展

上一章节内容

HS,公众号:平凡灵感码头基于 STM32 的四路 PWM 控制智能小车运动的模块化控制程序

以上述文章的初始化好了 PWM 按键 还有智能小车的运动程序,结合上述内容进行补充

这节会初始化一个红外模块的函数,简单很

#include "stm32f10x.h"                  // Device headervoid Irobstacle_Init(void){	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	GPIO_InitTypeDef GPIO_InitStructure;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	GPIO_Init(GPIOA,&GPIO_InitStructure);}uint8_t Left_Irobstacle_Get(void){	return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11);}uint8_t Right_Irobstacle_Get(void){	return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12);}

定义两个函数,用来判断左右是否遇到障碍物

主函数讲解

#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "robot.h"#include "Irobstacle.h"#include "Key.h"uint8_t i;int main(void){	robot_Init();       	Key_Init();         	Irobstacle_Init();  	while(Key_GetNum() == 0); 	while (1)	{			if(Left_Irobstacle_Get() == 1 && Right_Irobstacle_Get() == 1)			{				makerobo_run(70,0);  			}			else if(Left_Irobstacle_Get() == 1 && Right_Irobstacle_Get() == 0)			{				makerobo_Left(70,400); 			}			else if(Left_Irobstacle_Get() == 0 && Right_Irobstacle_Get() == 1) 			{				makerobo_Right(70,400);			}						else if(Left_Irobstacle_Get() == 0 && Right_Irobstacle_Get() == 0) 			{				makerobo_brake(400);          				makerobo_Spin_Right(70,900);  			}	}}

程序解释

  • robot_Init():初始化小车硬件,如电机、PWM输出等。

  • Key_Init():初始化按键,用于手动启动系统。

  • Irobstacle_Init():初始化红外避障模块,包括传感器的IO配置。

等待按键启动

while (Key_GetNum() == 0); 

程序在这里阻塞运行,直到检测到有按键按下为止。常用于让用户“确认启动”,确保在无人干预状态下不自动运行。

红外避障逻辑说明

✅ 情况一:两侧都没有障碍
 
  

if (Left_Irobstacle_Get() == 1 && Right_Irobstacle_Get() == 1){      makerobo_run(70,0);  }

  • 意义:左右两个红外传感器都返回 1,表示没有障碍。

  • 操作:小车直行,速度为 70。


⬅️ 情况二:左侧无障碍,右侧有障碍
 
  

else if(Left_Irobstacle_Get() == 1 && Right_Irobstacle_Get() == 0){	makerobo_Left(70,400); }

  • 右侧探测到障碍(0 表示有障碍),左侧通畅。

  • 操作:小车向左转以避开右侧障碍,转弯速度为 70。


➡️ 情况三:右侧无障碍,左侧有障碍
 
  
else if(Left_Irobstacle_Get() == 0 && Right_Irobstacle_Get() == 1){	makerobo_Right(70,400);}

  • 左侧探测到障碍。

  • 操作:小车向右转,避开左边的障碍。


⛔ 情况四:两侧都有障碍

else if(Left_Irobstacle_Get() == 0 && Right_Irobstacle_Get() == 0){	makerobo_brake(400);          	makerobo_Spin_Right(70,900);  }

  • 左右两侧都探测到障碍。

  • 操作:

    1. 先刹车makerobo_brake(400),停止运动 400ms;

    2. 原地右旋转makerobo_Spin_Right(70,900),右转 900ms,寻找新路线。

你可能感兴趣的:(stm32项目实现,stm32,单片机,嵌入式硬件)