基于STM32F103的智能循迹绕障小车,利用红外循迹、超声波避障,实现当小车遇到障碍物时绕开障碍物后能回到轨道上继续循迹
时间: 2024-02-12 13:03:28 浏览: 198
好的,下面是一个基于STM32F103的智能循迹绕障小车的核心代码,供您参考:
```
#include "stm32f10x.h"
#define IR_FL GPIO_Pin_0
#define IR_L GPIO_Pin_1
#define IR_BL GPIO_Pin_2
#define IR_FR GPIO_Pin_3
#define IR_R GPIO_Pin_4
#define IR_BR GPIO_Pin_5
#define TRIG GPIO_Pin_8
#define ECHO GPIO_Pin_9
void delay_us(uint32_t n)
{
uint32_t i;
for(i = 0; i < n; i++);
}
void delay_ms(uint32_t n)
{
uint32_t i, j;
for(i = 0; i < n; i++)
for(j = 0; j < 1000; j++);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = IR_FL | IR_L | IR_BL | IR_FR | IR_R | IR_BR;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = TRIG;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Forward(void)
{
// 控制小车轮子向前运动
}
void Backward(void)
{
// 控制小车轮子向后运动
}
void Left(void)
{
// 控制小车轮子向左运动
}
void Right(void)
{
// 控制小车轮子向右运动
}
void Stop(void)
{
// 控制小车轮子停止运动
}
void AvoidObstacle(void)
{
// 超声波避障
GPIO_SetBits(GPIOA, TRIG);
delay_us(10);
GPIO_ResetBits(GPIOA, TRIG);
while(GPIO_ReadInputDataBit(GPIOA, ECHO) == 0);
uint32_t t1 = SysTick->VAL;
while(GPIO_ReadInputDataBit(GPIOA, ECHO) == 1);
uint32_t t2 = SysTick->VAL;
uint32_t t = (t1 - t2) / SystemCoreClock * 1000000 / 58;
if(t < 30) // 如果遇到障碍物
{
Stop(); // 先停车
// 往右转一定角度,确保能绕开障碍物
Right();
delay_ms(500);
// 开始绕障
while(1)
{
// 读取红外线传感器的信号
int ir_fl = GPIO_ReadInputDataBit(GPIOB, IR_FL);
int ir_l = GPIO_ReadInputDataBit(GPIOB, IR_L);
int ir_bl = GPIO_ReadInputDataBit(GPIOB, IR_BL);
int ir_fr = GPIO_ReadInputDataBit(GPIOB, IR_FR);
int ir_r = GPIO_ReadInputDataBit(GPIOB, IR_R);
int ir_br = GPIO_ReadInputDataBit(GPIOB, IR_BR);
// 如果已经绕过障碍物
if(ir_fl == 1 && ir_l == 1 && ir_bl == 1 && ir_fr == 1 && ir_r == 1 && ir_br == 1)
{
// 往左转一定角度,确保能回到轨道上
Left();
delay_ms(500);
break;
}
// 如果前方有障碍物,继续绕障
if(ir_fl == 0 || ir_l == 0 || ir_bl == 0)
Right();
else if(ir_fr == 0 || ir_r == 0 || ir_br == 0)
Left();
else
Forward();
}
}
}
int main(void)
{
GPIO_Configuration();
while(1)
{
// 读取红外线传感器的信号
int ir_fl = GPIO_ReadInputDataBit(GPIOB, IR_FL);
int ir_l = GPIO_ReadInputDataBit(GPIOB, IR_L);
int ir_bl = GPIO_ReadInputDataBit(GPIOB, IR_BL);
int ir_fr = GPIO_ReadInputDataBit(GPIOB, IR_FR);
int ir_r = GPIO_ReadInputDataBit(GPIOB, IR_R);
int ir_br = GPIO_ReadInputDataBit(GPIOB, IR_BR);
// 判断小车行驶的方向
if(ir_l == 0 && ir_bl == 0)
Right();
else if(ir_r == 0 && ir_br == 0)
Left();
else if(ir_fl == 1 && ir_l == 1 && ir_bl == 1 && ir_fr == 1 && ir_r == 1 && ir_br == 1)
Forward();
else
AvoidObstacle();
}
}
```
以上代码仅供参考,具体实现需要根据具体的硬件和应用场景进行适当的修改和调整。
阅读全文