前言
紧接着上一篇博客的内容,上一节内容.我们添加了红外模块.用于实现循迹模块,
这一篇博客,将在上一篇的基础上.添加小车的跟随模块.原理与循迹模块类似
一、红外壁障模块分析
跟随模块与循迹模块类似,都是靠红外的反射.但是跟随模块红外朝外,而循迹模块红外朝下.
如图:
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();
}
}
}
文章评论