文章目录
- 前言
 - 一、红外壁障模块分析
 
- 1. 跟随小车实现原理
 
- 二、具体实现
 
- 1. 硬件接线
 - 2.CUBEMX配置
 - 3. 代码实现
 
 
前言
紧接着上一篇博客的内容,上一节内容.我们添加了红外模块.用于实现循迹模块,
 这一篇博客,将在上一篇的基础上.添加小车的跟随模块.原理与循迹模块类似
一、红外壁障模块分析
跟随模块与循迹模块类似,都是靠红外的反射.但是跟随模块红外朝外,而循迹模块红外朝下.
 如图:

1. 跟随小车实现原理
左边跟随模块能返回红外,输出低电平,右边不能返回,输出高电平,说明物体在左边,需要左转
 右边跟随模块能返回红外,输出低电平,左边不能返回,输出高电平,说明物体在右边,需要右转
二、具体实现
1. 硬件接线
B-1A – PA0
 B-1B – PB1
 A-1A – PA1
 A-1B – PB10
 跟随模块(左) – PB5
 跟随模块(右) – PB6
2.CUBEMX配置
其他的配置都基于上一篇博客文章的内容.

3. 代码实现
由于上篇代码是循迹模块的代码,所以我们为了保留之前的代码,保留之前的循迹功能,我们可以定义一个全局变量
#define XJMS 1
#define GSMS 2
// 定义全局变量mode
char mode = XJMS;然后通过串口1中断,对他进行修改,串口用蓝牙模块进行连接控制.提示:蓝牙模块需将波特率设置为9600,至少我的蓝牙模块需要 由于代码太长了,就将代码封装到一个文件中
motor.c
#include "motor.h"
#include "gpio.h"
#include "tim.h"
// 左轮动
void goForward(void)
{
	//前进
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,200);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,200);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
}
void turnLeft(void)
{
//左转
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,80);
		__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,200);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
}
void turnRight(void)
{
	//右进
	__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,200);
	__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,80);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
}
void stop(void)
{
	//停止
	__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,0);
	__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,0);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET);
}main.c
if(mode == XJMS)
		{
			 if(LEFTWHEEL == GPIO_PIN_RESET && RIGHTWHEEL == GPIO_PIN_RESET)
			{
				goForward();
			}
			if(LEFTWHEEL == GPIO_PIN_SET && RIGHTWHEEL == GPIO_PIN_RESET)
			{
				turnLeft();
			}
			if(LEFTWHEEL == GPIO_PIN_RESET && RIGHTWHEEL == GPIO_PIN_SET)
			{
				turnRight();
			}
			if(LEFTWHEEL == GPIO_PIN_SET && RIGHTWHEEL == GPIO_PIN_SET)
			{
				stop();
			}
		}
		if(mode ==GSMS){
			if(LEFTWT == GPIO_PIN_RESET && RIGHTWT == GPIO_PIN_RESET)
			{
				goForward();
			}
			if(LEFTWT == GPIO_PIN_SET && RIGHTWT == GPIO_PIN_RESET)
			{
				turnRight();
			}
			if(LEFTWT == GPIO_PIN_RESET && RIGHTWT == GPIO_PIN_SET)
			{
				turnLeft();
			}
			if(LEFTWT == GPIO_PIN_SET && RIGHTWT == GPIO_PIN_SET)
			{
				stop();
			}
		}
		
  }                










