当前位置: 首页 > news >正文

基于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仿真设计,有需要成品的或者需要定制的可以闲鱼私聊。

感谢你的观看!

在这里插入图片描述

http://www.xdnf.cn/news/771607.html

相关文章:

  • hot100 -- 6.矩阵系列
  • Linux(信号)
  • 第十天:Java反射
  • 灵动相册,助力教学:在线教学场景的图片管理利器——仙盟引渡仙君-智能编程——仙盟创梦IDE
  • 通俗理解“高内聚,低耦合”
  • react 生命周期
  • “等待-通知”机制优化(一次性申请)循环等待
  • 电子电路:4017计数器工作原理解析
  • 【Java EE初阶】计算机是如何⼯作的
  • “application/json“,“text/plain“ 分别表示什么
  • 【C#朗读文本DLL动态按钮控件组及按钮事件文本框拖放数据】2022-1-21
  • 【Go-补充】ioReader + ioWriter + bufio
  • Charles青花瓷抓取外网数据包
  • 【笔记】Windows 部署 Suna 开源项目完整流程记录
  • 格密码-LWE问题
  • Python基础:人生重开模拟器(小游戏)
  • 编译原理实验 之 TINY 之 语义分析(第二次作业)
  • PHP舆情监控分析系统(9个平台)
  • 机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战
  • Qt信号与槽机制深度解析
  • 【Godot】如何导出 Release 版本的安卓项目
  • 【笔记】Windows 下载并安装 ChromeDriver
  • IO模型IO模型
  • ISO18436-2 CATII级振动分析师能力矩阵
  • 振动分析师(ISO18436-2)四级能力矩阵 - 简介
  • ROS机器人和NPU的往事和新知-250602
  • python打卡训练营打卡记录day43
  • 阿里云服务器-解决宝塔登录不成功
  • DAY 41 简单CNN
  • 审计 - 风险应对 - 控制测试