基于STM32的循迹避障小车的Proteus仿真设计
文章目录
- 一、基于STM32的循迹避障小车
- 1.题目要求
- 2.思路
- 2.1 主控
- 2.2 显示
- 2.3 电源模块
- 2.4 舵机云台
- 2.5 超声波测距
- 2.6 红外循迹模块
- 2.7 蓝牙模块
- 2.8 按键
- 2.9 电机驱动
- 3.电路仿真
- 3.1 未仿真
- 3.2 自动模式
- 3.3 手动模式
- 3.4 蓝牙模式
- 4.仿真程序
- 4.1 程序说明
- 4.2 主程序
- 4.3 红外程序
- 4.4 测距程序
- 二、总结
一、基于STM32的循迹避障小车
1.题目要求
主控:STM32
显示:OLED
电源模块
舵机云台
超声波测距
红外循迹模块(3个,左中右)
蓝牙模块
按键(6个,模式和手动控制小车状态)
TB6612驱动的双电机
功能:
该小车共有3种模式:
自动模式:根据红外循迹和超声波测距模块决定小车的状态
手动模式:根据按键的状态来决定小车的状态
蓝牙模式:根据蓝牙指令来决定小车的状态
自动模式:
自动模式下,检测距离低于5cm小车后退
未检测到任何黑线,小车停止
检测到左边或左边+中间黑线,小车左转
检测到右边或右边+中间黑线,小车右转
检测到中边或左边+中间+右边黑线,小车前进
手动模式:根据按键的状态来决定小车的状态
蓝牙模式:
//需切换为蓝牙模式才能指令控制
*StatusX X取值为0-4
0:小车停止
1:小车前进
2:小车后退
3:小车左转
4:小车右转
2.思路
2.1 主控
常规的主控STM32使用STM32F103C8T6的最小系统
2.2 显示
使用的是0.96寸的OLED显示屏
由于需要显示汉字,需要搭配PCtoLCD2002取模软件
2.3 电源模块
这里的12V输入代表的是12V电源适配器或者12V的电池盒供电。
第一级的TL793降压电路将12V降压到5V,可以参考立创商城编号的C96088的应用电路
第二级的AMS1117-3.3降压电路将5V降压到3.3V供后端的单片机等供电,为什么用二级,主要考虑到降压降压,LDO会发烫的问题,也可以直接用TL783降压到3.3V或者用个DCDC电源芯片来输出3.3V。(参考立创商城编号的C347222的应用电路)
2.4 舵机云台
想模拟实物的云台,可以带动上面的超声波测距检测各个方向的障碍物距离,实际有点鸡肋。可以直接去掉。
2.5 超声波测距
超声波测距模块HC-SR04
2.6 红外循迹模块
proteus仿真里面没有红外避障模块,这边用3个单刀双掷开关来模拟,开关向上闭合模拟检测到对应的黑线,开关向下闭合模拟未检测到黑线。
2.7 蓝牙模块
proteus仿真里面没有蓝牙模块,这边采用虚拟终端(需用到虚拟串口软件创建一对虚拟串口)配合串口调试工具进行模拟。
这边用的虚拟串口软件是Virtual Serial Port Driver 6.9,如下所示:
这边用的串口调试工具是SSCOM V5.13.1,如下所示:
2.8 按键
按键就没什么好说的了,未按下的时候由于加了上拉电阻,所以检测电平是高电平,按下按键,拉低到地,所以检测电平是低电平。
2.9 电机驱动
这里采用的电机驱动是TB6612驱动芯片,驱动2个直流电机(如果需要电机立刻停止,可以替换成MOTOR黑的电机,那个会立刻停)
TB6612驱动芯片控制电机转动的真值表如下(来源立创商城的C88224)
3.电路仿真
3.1 未仿真
3.2 自动模式
自动模式:
自动模式下,检测距离低于5cm小车后退
未检测到任何黑线,小车停止
检测到左边或左边+中间黑线,小车左转
检测到右边或右边+中间黑线,小车右转
检测到中边或左边+中间+右边黑线,小车前进
3.3 手动模式
手动模式:根据按键的状态来决定小车的状态
3.4 蓝牙模式
蓝牙模式:
//需切换为蓝牙模式才能指令控制
*StatusX X取值为0-4
0:小车停止
1:小车前进
2:小车后退
3:小车左转
4:小车右转
4.仿真程序
4.1 程序说明
主控芯片:STM32F103C8
HSI:64MHZ
Systick: 1ms
超声波测距:TR(PA0),ECHO(PA1)
舵机(模拟云台):PWM1(PA2)
模拟蓝牙模块(Uart1):9600(PA9:tx1,PA10:rx1)
红外循迹模块:IR1(PA13),IR2(PA14),IR3(PA15)
按键:
KEY1(PB0)
KEY2(PB1)
KEY3(PB2)
KEY4(PB3)
KEY5(PB4)
KEY6(PB5)
电机驱动:
PWMA(PB6)
PWMB(PB7)
AIN1(PB10)
AIN2(PB11)
BIN1(PB12)
BIN2(PB13)
OLED显示屏:SCL(PB14),SDA(PB15)
串口协议
举例如发送*Mode2,即设置蓝牙模式
*ModeX X取值为0-2(0表示自动模式,1表示手动模式,2表示蓝牙模式)
自动模式:根据红外循迹和超声波测距模块决定小车的状态
手动模式:根据按键的状态来决定小车的状态
蓝牙模式:根据蓝牙指令来决定小车的状态
//需切换为蓝牙模式才能指令控制
*StatusX X取值为0-4
0:小车停止
1:小车前进
2:小车后退
3:小车左转
4:小车右转
4.2 主程序
/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"/*** @brief main function.* @param none* @retval none*/
int main(void)
{UserSystemInit();//用户配置初始化 while (1){ if (stSysTime.flg._10ms + TEN_MILLISECOND < Time_millis()) //10ms{stSysTime.flg._10ms = Time_millis(); Key_Scan();//按键扫描IR_Scan();//红外检测 }if (stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms{stSysTime.flg._50ms = Time_millis(); Measurement_function();//测距 Motor_function();//电机函数 }if (stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms{stSysTime.flg._100ms = Time_millis(); OLED_Handel();//OLED显示 Receive_data_Handel();//数据接收判断 IWDG_ReloadCounter();//清开门狗 }}
}
4.3 红外程序
/******************************************************************************** 函数名:IR_Scan* 描述 :红外扫描* 输入 :void* 输出 :void* 调用 :10ms* 备注 :*******************************************************************************/
void IR_Scan(void)
{ if(IR1_IN_Read())//IR1{ IR1_flag = 1;}else{IR1_flag = 0; }if(IR2_IN_Read())//IR2{ IR2_flag = 1;}else{IR2_flag = 0; }if(IR3_IN_Read())//IR3{ IR3_flag = 1;}else{IR3_flag = 0; }
}if((!IR1_flag)&&(!IR2_flag)&&(!IR3_flag))//未检测到任何黑线,小车停止
{IR_Status = 0;
}
else if((IR1_flag)&&(!IR2_flag)&&(!IR3_flag))//检测到左边,小车左转
{IR_Status = 1;moto1_dir = 1;moto2_dir = 0;
}
else if((IR1_flag)&&(IR2_flag)&&(!IR3_flag))//检测到左边+中间黑线,小车左转
{IR_Status = 2;moto1_dir = 1;moto2_dir = 0;
}
else if((!IR1_flag)&&(!IR2_flag)&&(IR3_flag))//检测到右边,小车右转
{IR_Status = 3;moto1_dir = 0;moto2_dir = 1;
}
else if((!IR1_flag)&&(IR2_flag)&&(IR3_flag))//检测到右边+中间黑线,小车右转
{IR_Status = 4;moto1_dir = 0;moto2_dir = 1;
}
else if((!IR1_flag)&&(IR2_flag)&&(!IR3_flag))//检测到中边黑线,小车前进
{IR_Status = 5;moto1_dir = 1;moto2_dir = 1;
}
else if((IR1_flag)&&(IR2_flag)&&(IR3_flag))//检测到左边+中间+右边黑线,小车前进
{IR_Status = 6;moto1_dir = 1;moto2_dir = 1;
}
4.4 测距程序
HCSR04_W_TR(1); Delay_20us();HCSR04_W_TR(0); while(HCSR04_R_ECHO()==0);//等待低电平结束ditance_count = 0; while(HCSR04_R_ECHO()==1);//等待高电平结束 ditance_flag = 1; if(ditance_count < Overtime)//小于超时时间 38ms{MM_ditance = ((ditance_count * 400)/2/10);//单位毫米}
二、总结
今天主要讲了基于STM32的循迹避障小车的Proteus仿真设计,有需要成品的或者需要定制的可以闲鱼私聊。
感谢你的观看!