整理一位朋友做的基于STM32开发板设计一台智能小车,自己的文件不见了;可以实现自动循迹、避障、蓝牙控制等功能!整体不难实现,希望正在做或者准备做的朋友有一定的帮助。
本次项目采用的是基于ARM Cortex-M4内核的STM32F407开发板:
芯片参数:
1.IO口
(1)STM32F407ZGT6:144引脚 114个IO口
(2)大部分IO口都耐 5V (模拟通道除外)
(3)支持调试: SWD和JTAG,SWD只要2根数据线
2、通信接口多达17个 3.定时器多达17个
(1)3个I2C接口 4.16个DMA通道
(2)6个串口 5.32位 高性能ARM Cortex-M4处理器
(3)3个SPI接口 6.时钟 高达168MHz
(4)2个CAN2.0 7.支持FPU(浮点运算)和DSP指令
(5)2个USB OTG
(6)1个SDIO
规格参数如下:
蓝牙使用前一定要使用软件格式化,不然如果蓝牙之前有绑定过别的ID后就会新连接不上!
这里我们使用的是STM32的串口3与蓝牙进行通信;
蓝牙模块APP功能设定:
mian.c文件
#include "gec_init.h"
#include "gec_gpio.h"
#include "gec_time.h"
#include "gec_uart.h"
#include "gec_int.h"
// 红外循迹、避障模块IO宏定义
#define GL Gec_GPIO_Get_Value(GPIOC,GPIO_Pin_9)
#define GR Gec_GPIO_Get_Value(GPIOC,GPIO_Pin_11)
#define L Gec_GPIO_Get_Value(GPIOC,GPIO_Pin_6)
#define R Gec_GPIO_Get_Value(GPIOG,GPIO_Pin_15)
int i;
int cmd;
uint8_t recv_buf[4];
//小车控制
void car_contrl(int i,int j,int k,int l)
{
Gec_GPIO_Set_Value(GPIOB,GPIO_Pin_7,i);
Gec_GPIO_Set_Value(GPIOD,GPIO_Pin_6,j);
Gec_GPIO_Set_Value(GPIOA,GPIO_Pin_4,k);
Gec_GPIO_Set_Value(GPIOD,GPIO_Pin_7,l);
}
// 电机驱动IO初始化
void car_contrl_init()
{
Gec_GPIO_Init(GPIOB,GPIO_Pin_7,GPIO_MODE_OUT_PP);
Gec_GPIO_Init(GPIOD,GPIO_Pin_6,GPIO_MODE_OUT_PP);
Gec_GPIO_Init(GPIOA,GPIO_Pin_4,GPIO_MODE_OUT_PP);
Gec_GPIO_Init(GPIOD,GPIO_Pin_7,GPIO_MODE_OUT_PP);
}
//小车电平判断
void tracking_init()
{
Gec_GPIO_Init(GPIOC,GPIO_Pin_6,GPIO_MODE_IN_PULLUP);
Gec_GPIO_Init(GPIOG,GPIO_Pin_15,GPIO_MODE_IN_PULLUP);
Gec_GPIO_Init(GPIOC,GPIO_Pin_9,GPIO_MODE_IN_PULLUP);
Gec_GPIO_Init(GPIOC,GPIO_Pin_11,GPIO_MODE_IN_PULLUP);
}
void go_back()//后退
{
car_contrl(0,1,0,1);
}
void go_up()//前进
{
car_contrl(1,0,1,0);
}
void go_back_right()//后右
{
car_contrl(0,0,0,1);
}
void go_back_left()//后左
{
car_contrl(0,1,0,0);
}
void go_up_right()//前右
{
car_contrl(1,0,0,0);
}
void go_up_left()//前左
{
car_contrl(0,0,1,0);
}
void go_circle_right()//原地右转
{
car_contrl(1,0,0,1);
}
void go_circle_left()//原地左转
{
car_contrl(0,1,1,0);
}
void stop()//停止
{
car_contrl(0,0,0,0);
}
// 蓝牙模块
void bluetooth_ISR(void)
{
uint8_t Res;
if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
{
Res = USART_ReceiveData(USART3);
recv_buf[i++]=Res;
if(i==4)
{
if((recv_buf[0]+recv_buf[1]+recv_buf[2])%256 == recv_buf[3])
{
cmd = recv_buf[1];
i=0;
}
}
}
}
int main(void)
{
//初始化
car_contrl_init();
tracking_init();
Gec_UART_Init(USART3,9600,USART_Parity_No,8,USART_StopBits_1);
Gec_Int_Register(BSP_INT_ID_USART3,bluetooth_ISR);
Gec_Int_Enable(BSP_INT_ID_USART3);
uint8_t set_name[]="AT+NAME=CAOLE\r\n";
Gec_UART_Write(USART3,set_name,sizeof(set_name));
while(1)
{
//小车控制
//1、蓝牙控制
if(cmd == 0x01)
{
go_up();
mdelay(50);
stop();
}
else if(cmd == 0x02)
{
go_back();
mdelay(50);
stop();
}
else if(cmd == 0x03)
{
go_up_left();
mdelay(50);
stop();
}
else if(cmd == 0x04)
{
go_up_right();
mdelay(50);
stop();
}
else if(cmd == 0x05)
{
go_back_left();
mdelay(50);
stop();
}
else if(cmd == 0x06)
{
go_back_right();
mdelay(50);
stop();
}
else if(cmd == 0x07)
{
go_circle_left();
mdelay(50);
stop();
}
else if(cmd == 0x08)
{
go_circle_right();
mdelay(50);
stop();
}
else if(cmd == 0x09)
{
stop();
}
else if(cmd==0x0A)
{
if(L==0&&R==0)
{
go_up();
}
//2、循迹控制
else if(L==1&&R==0)
{
go_up_right();
mdelay(5);
stop();
mdelay(5);
}
else if(L==0&&R==1)
{
go_up_left();
mdelay(5);
stop();
mdelay(5);
}
else if(L==1&&R==1)
{
stop();
mdelay(5);
}
}
else if(cmd==0x0B)
{
if(GL==1&&GR==1)
{
go_up();
mdelay(1000);
stop();
}
//3、避障控制
else if(GL==0&&GR==0)
{
go_back();
mdelay(1000);
stop();
}
else if(GL==0&&GR==1)
{
go_back_left();
mdelay(1000);
stop();
}
else if(GL==1&&GR==0)
{
go_back_right();
mdelay(1000);
stop();
}
}
else if(cmd == 0x0C)
{
go_circle_right();
mdelay(500);
}
}
}
总结:基本功能完美实现,但是也有美中不足,如:代码没有对速度进行控制,全程是输出一个匀速,可以结合PWM和PID算法对小车速度进行控制,这样更加完美!
想要获取更多资源,可以关注公众号:Kevin的学习站,“天下代码都在抄,抄来抄去有提高”,希望此文对您有一定的帮助,整理不易,但您的点赞、关注、收藏就是对我最大的鼓励!