目录
1 项目概述
1.1 项目背景
1.2 系统功能介绍
1.2.1 下位机智能小车控制系统
1.2.2 微信小程序App
1.2.3 PC上位机App
1.3 框图介绍
1.3.1 主控板卡
1.3.2 小车控制模块
1.3.3 通信模块
1.4 系统使用的技术要点
2 系统硬件设计
2.1 Version board主控板块系统结构
2.1.1 传感器接口
2.1.2 超声波测距接口
2.1.3 显示器模块
2.1.4 WIFI通信模块
2.1.5 Version Board 与 小车控制器模块通信接口
2.2 小车控制模块
2.2.1 寻迹模块
2.2.2 电机控制模块
3 系统软件设计
3.1 主控模块
3.1.1 软件架构
3.1.2 软件实现流程图
3.1.3 数据结构定义
3.1.4 主控制模块与小车控制模块通信协议定义
3.1.5 程序架构介绍
3.2 小车控制模块
3.2.1 软件架构
3.2.2 小车速度控制的PID算法
3.2.3 程序架构
3.3 上位机部分1:微信小程序模块
3.3.1 软件架构设计
3.3.2 微信小程序AppUI
3.3.3 程序架构
3.4 上位机部分2: PC上位机Server
3.4.1 软件架构设计
3.4.2 软件UI介绍
3.4.3 程序架构
3.5 RT-Thread Nano版本在STM32F103上的移植
4 功能测试
4.1 传感器数据上传功能测试
4.2 小车功能实验测试
4.2.1 蓝牙App控制小车运行(实验测试)
4.2.2 WIFI连接PC-APP控制小车运行(实验测试)
项目设计文件和源代码下载地址:
https://club.rt-thread.org/ask/article/61550c7507ea5f89.html
[24嵌入式大赛-Vision-Board]测试视频-3:APP控制小车运行轨迹
1 项目概述
1.1 项目背景
当下是一个智能化的时代,万物互联是时代的需要。基于这样的需要应运而生了许多新的技术,以支持这样的需求。在一些比较特殊的领域,单靠人力解决这些问题的成本是很高的,例如:狭窄的甬道、微小的洞穴、火灾现场、甚至是战场。这时如果使用智能机器人进行环境探测或者现场勘探,付出的代价成本会小很多。如今出现了无人机,无人小车,无人舰艇等等。这些设备的诞生都是为了解决特辣领域的需求。
本系统是一款硬件上基于Vision-Board 开发板,应用RT-Thread嵌入式操作系统设计的一款智能控制小车。其可实现采集现场环境的温度、湿度、光照强度,同时使用超声波雷达扫描环境的参数,以了解特殊环境的地形特性,并通过WIFI和蓝牙实时的发送给系统服务器,便于决策者采取措施和行动。
1.2 系统功能介绍
本系统分为3个部分,其分别为:
1)下位机智能小车控制系统;
2)微信小程序App
3)PC上位机App
1.2.1 下位机智能小车控制系统
本系统基于Vision-Board 开发板, 该板块是 RT-Thread 推出的基于瑞萨 Cortex-M85 架构 RA8D1 芯片的一款开发板。 其主要功能如下:
1)使用Vision-Board 作为主控板卡,该板块实时读取温湿度传感器,光照传感器的数据。同时通过超声波测距模块扫描环境参数。
2)控制OLED显示器,对读取的温度、湿度、光照、测距数据进行处理,将这些数据实时的显示在OLED屏幕上。
3)控制蓝牙模块,实时接收蓝牙模块接收到的从微信小程序发送的。
4)发送命令给小车运行控制模块,实现小车运行轨迹的控制。
5)实时接收和处理微信小程序App发送的控制命令,同时将这些命令转发给小车运行控制模块,实现小车的控制
6)实时上传温度、湿度、光照、测距数据给微信小程序App
7)实时接收和处理PC上位机App发送的控制命令,同时将这些命令转发给小车运行控制模块,实现小车的控制
8)实时上传温度、湿度、光照、测距数据给PC上位机App
1.2.2 微信小程序App
微信小程序App: 其用于实时接收下位机智能小车控制系统发送的环境参数数据,同时发送控制信号给下位机,可通过App实时控制小车的运行轨迹和状态。该App的操作小车的优先级高于Wifi接口(此时PC App控制小车功能失效)。该App可以实现小车运行状态的模式切换功能。
1)自动模式:此时小车通过寻迹模块自行运行
2)手动模式:控制App上的控制按钮,实时控制小车的运行状态,当超过60s没有指令下发给下位机时,小车会自动切换到自动模式。
1.2.3 PC上位机App
PC上位机App: 通过WIFI实时接收下位机智能小车控制系统发送的环境参数数据,同时发送控制信号给下位机,可通过App实时控制小车的运行轨迹和状态。
该APP可以配置小车的运行状态:
1)自动模式:此时小车通过寻迹模块自行运行
2)手动模式:控制App上的控制按钮,实时控制小车的运行状态
1.3 框图介绍
1.3.1 主控板卡
本系统基于Vision-Board 开发板, 该板块是 RT-Thread 推出的基于瑞萨 Cortex-M85 架构 RA8D1 芯片的一款开发板。 Vision Board搭载全球首颗 480 MHz Arm Cortex-M85芯片 ,其具备优越的性能和丰富的外围资源,完全满足该系统的设计要求。
同时RT-Thread提供了丰富的应用硬件和软件模块可供选择使用。便于开发者基于RT-Thread软件平台快速搭建开发平台。
1)该板卡作为系统的主控模块,其用于控制温度、湿度、光照、距离传感器,并实时从这些sensor中读取数据,并将这些数据实时发送给上位机App。
2)发送控制指令给小车控制模块,实现小车的智能控制
3)将实时读取到的温度、湿度、光照、距离数据显示在OLED屏幕上,数据更新时间间隔为1秒。
4)使用RT-Thread实时操作系统管理系统的资源,整个系统的软件架构基于该系统进行开发。
1.3.2 小车控制模块
该模块式基于STM32F103的一块扩展模块,选择该模块的原因如下:
1) 对4路(2组)电机控制,需要4路PWM信号波,而Vision-Board 开发板的扩展IO上,不能提供4路PWM控制信号。
2)由于PWM信号由STM32F103模块负责,为了降低小车运动部分软件的开发难度,将4路寻迹信号。光电编码器测速模块放在STM32F103模块上,便于系统的效应速度的实时性。
3)控制蓝牙模块,Vision-Board 开发板只提供一个外扩UART,该接口用于和STM32F103扩展模块通信。于是将蓝牙模块放在STM32F103扩展板卡上。
4)软件架构,采用RT-Thread Nano版本实现资源管理和线程处理
1.3.3 通信模块
WIFI通信模块:
系统使用该模与上位机App通信。Vision-Board开发板已经集成 RW007 模块,且在RT-Thread中已经实现其驱动程序,在RT-Studio下可以通过配置使用LWIP协议栈,快速搭建系统。
蓝牙模块:
本系统使用的蓝牙模块为HC-08蓝牙串口通信模块 ,其最大通信距离可达到80M, 其与MCU之间通过串口连接。上位机部分使用微信小程序实现App功能,其可以实时接收下位机上传的环境参数数据,该App同时可以发送控制命令给下位机,以控制小车的运行状态。
1.4 系统使用的技术要点
1)主控模块基于RT-Thread 软件架构设计
2)使用的MCU: Renesa R7FA8D1BH, STM32F103
3) MCU配置软件: FSP, STM32Cube
4) 开发软件: RT-Studio , Keil, Visual Studio 2022, 微信小程序开发工具
5)开发语言: C语言, C#, JS, WXLL, WCSS
6) 通信模块: WIFI通信,网络通信,蓝牙通信,Socket编程
7) 控制算法: PID控制技术
8)光电编码测试技术
9)寻迹检测
10)双MCU之间的协同通信
11) I2C总线挂载多个设备,实时进行数据传输
12)智能小车智能控制:PWM调速,运动方向控制
13)RT-Thread Nano版本在STM32F103上的移植
2 系统硬件设计
本系统的硬件分为两个部分:
1)Version board主控板块
2)小车驱动控制部分
2.1 Version board主控板块系统结构
2.1.1 传感器接口
该系统挂载了两个传感器:温度传感器SHT20和光照传感器ISL29035,其与Version board通过I2C接口连接,系统硬件连接图如下:
硬件实物图如下:
2.1.2 超声波测距接口
系统使用HC-SR04模块,用于探测环境情况,其硬件连接图如下:
HC-SR04模块与Version board的接口连接关系:
模块引脚 | Version Board IO 引脚 | 注释 |
---|---|---|
SR-04 TRIG | PORT_05_PIN_10 | 测距触发信号 |
SR-04 ECHO | PORT_00_PIN_06 | 测距信息 |
硬件实物图如下:
2.1.3 显示器模块
系统选用OLED显示屏,用于实时显示温度、湿度、光照和HC-SR04测到的距离数据,该模块与Version Board之间通过I2C接口连接。其具体连接图如下:
硬件实物图如下:
2.1.4 WIFI通信模块
Renesa Version Board中WIFI功能,该模块基于RW007模块设计,RT-Thread软件架构已经实现该硬件相关的驱动接口。笔者基于该模块的相关接口在LWIP软件框架的基础上实现Client功能。实现数据的发送和接收。其硬件实物图如下:
2.1.5 Version Board 与 小车控制器模块通信接口
由于Version board的可使用的扩展接口,不能满足小车驱动控制的要求,因此本系统将小车驱动控制部分单独设计,该模块基于STM32F103,其与主控MCU Version Board通过串口通信,其通信连接图如下:
硬件实物图如下:
2.2 小车控制模块
2.2.1 寻迹模块
本系统选用4个寻迹模块TR5000,其小车控制模块之间通过IO连接起来,连接方式如下:
硬件实物图:
2.2.2 电机控制模块
系统使用4路PWM信号控制两组电机,同时,使用光电编码器监测电机的转动速度。以实现PID闭环扣控制。
硬件实物图如下:
3 系统软件设计
3.1 主控模块
3.1.1 软件架构
基于Version board 的软件架构分为三个层级:
1) MCU驱动层接口
主要实现MCU底层驱动,包括I2C接口驱动,SPI驱动,UART接口驱动,Timer接口驱动,RTC接口驱动,IO接口驱动。
2)RT-Thread 应用层接口
RT-Thread集成了相关的驱动接口,首先使用Renesa 的配置软件FSP使能各个模块的驱动参数,然后在RT-Studio Setting中使能RT-Thread的驱动框架下的接口,就可以完成这些驱动的应用设计,此时,在App中就可以调用相关驱动,实现相应的功能。
3)App应用层
该软件层主要实现系统的相关功能,其具体内容包括如下这些:
外围资源驱动程序:
项目 | 名称 |
---|---|
1 | sht20 驱动和应用程序接口 |
2 | ISL29036驱动和应用程序接口 |
3 | HC-SR04驱动和引用程序接口 |
4 | OLED驱动程序和应用接口 |
5 | WIFI驱动模块 |
功能程序接口
项目 | 名称 |
---|---|
1 | LWIP Client功能 |
2 | 控制小车运行状态模块 |
3 | 数据上传软件模块 |
4 | 系统运行状态灯模块 |
3.1.2 软件实现流程图
软件流程图功能介绍:
1)MCU初始化
主要包括内容: I2C接口,UART接口,IO口,配置定时器参数,初始化SPI接口,配置和使能RTC。
2)RT-Thread初始化
主要初始化RT-Thread栈空间,创建Task,初始化console控制台等。
3)外围资源初始化
主要包括初始化SHT20 Sensor, 光照传感器Sensor ISL29030,创建和HC-SR04相关的对象
4)主函数功能
Task-1: 使用RT-Thread 创建一个Task,在该task中实时读取各类Sensor的数据,并将这些数据存储到相应的数据结构中。
Task-2:读取上位机数据,并对该数据包进行解析,同时对命令进行打包,然后将该控制命令下发给小车控制模块
Task-3: 上传实时数据给上位机App,包括微信小程序App和基于WIFI模块通信的上位机App
3.1.3 数据结构定义
该数据结构主要用于将系统的Sensor和控制命令打包在一个整体的数据结构中,便于在其他模块中使用这些数据结构。系统上位机发送回传控制时,可以直接将这个数据结构发送出去,上位机接收数据包时,也直接使用该数据结构解析数据。
typedef struct
{
uint8_t mode;
uint8_t mcmd;
union{
float sr_value;
uint8_t sr_valueList[4];
};
union{
float humidity;
uint8_t humidity_valueList[4];
};
union{
float temperature;
uint8_t temperature_valueList[4];
};
unsigned int luxValue;
}Struc_SensorPack;
3.1.4 主控制模块与小车控制模块通信协议定义
主控模块与小车控制模块之间通过串口进行通信,当主控模块接收上上位机发送的命令后,解析完成命令,然后对这些控制数据进行打包。并同时传送命令给小车控制模块。控制协议数据结构定义如下:
#define HEAD '['
#define END ']'
#define DATALEN 256
#define RCS_SUCESS 0x8000
#define RCS_READ 0x4000
#define CAL_CMD_CODE 0x3fff
#define PROTOCOL_HEADER_OFFSET 0
#define PROTOCOL_SOURADDR_OFFSET 1
#define PROTOCOL_TARADDR_OFFSET 2
#define PROTOCOL_FUMN_OFFSET 3
#define PROTOCOL_CMD_OFFSET 5
#define PROTOCOL_DATA_LENGTH_OFFSET 7
#define PROTOCOL_DATA_OFFSET 8
typedef enum
{
ERROR_NONE = 0,
ERROR_OUT_OF_RANGE = 0x0001,
ERROR_UN_RECONGNITION = 0x0002,
ERROR_FAIL_SAVE_PARAMATER = 0x0003,
ERROR_PARAMATER_NOT_ESIXIT = 0x0004,
}RCS_ErrorCode_enum;
typedef struct {
uint16_t OptCode :14;
uint16_t TransfMode :1;
uint16_t OptMode :1;
} RCS_CommStatus;
typedef struct
{
uint8_t *RcsParserBuff;
uint8_t HostSendBuf[DATALEN];
uint8_t sourAddress;
uint8_t targetAddress;
uint8_t frumIndex;
uint8_t dataLength;
uint8_t crc;
uint16_t cmdCode;
uint8_t *dataBuff;
void (*pf_SendPut)(uint8_t*, uint16_t);
void* CmdTable;
uint16_t CmdTotal;
}RCS;
typedef void (*PFNCT_RCS)(RCS *);
typedef struct
{
uint8_t command;
PFNCT_MCS pf_FuncPtr;
} RCS_CmdNode;
3.1.5 程序架构介绍
本程序使用RT-Studio IDE进行软件开发,系统基于Version board板卡创建项目。主控模块的程序主要在如下两个代码包中开发。
3.2 小车控制模块
3.2.1 软件架构
软件流程图功能介绍:
1) 初始化MCU外围的资源:包括定时器,IO,UART,外部中断
2)初始化外围资源:该模块的外围资源主要的定义IO的状态,以及关电编码器所使用的控制接口
3)主程序功能:
Task-1: 实时读取TR5000的状态,并将这些数据保存起来。
Task-2: 解析上位机发送的命令,执行相关的操作
Task-3: 上传从主控模块中接收到的传感器数据给微信小程序App
Task-4: 小车运行状态控制。
3.2.2 小车速度控制的PID算法
3.2.3 程序架构
小车功能控制模块使用Keil IDE开发,软件基于RT-Thread Nano架构进行开发,该软件部分主要包括两个模块
1)电机控制部分
2)运行状态功能控制部分
3.3 上位机部分1:微信小程序模块
微信小程序App通过蓝牙模块与下位机通信,其实时读取下位机上传的温度、湿度、光照强度数据,以及超声波测距参数。该App上还设计了5个按键,用于控制小车的运行状态。
3.3.1 软件架构设计
3.3.2 微信小程序AppUI
微信小程序的UI分为两个部分
1)界面-1: 主要用于扫描蓝牙Client
2) 界面-2:微信小程序主界面,该UI分为两个部分:
part-1: 显示Sensor的实时数据,包括:温度、湿度、光照、SR测距数据
part-2: 小车运行轨迹控制
3.3.3 程序架构
本程序使用微信小程序开发工具编写,其程序架构如下:
3.4 上位机部分2: PC上位机Server
PC上位机主要与Version board 的WIFI模块实现Client通信,该上位机实现了一个Server功能,可支持多个Client同时连接该设备。其主要实现实时显示下位机上传的温度、湿度、光照、SR测距数据。用户同时可以在该软件上配置小车的工作模式。操作小车的运行轨迹。
3.4.1 软件架构设计
3.4.2 软件UI介绍
软件UI分为5个区域
Part-1: 网络相关参数配置,启动或者停止监听网络Client
Part-2: 模式配置,配置为手动模式时,此时可以通过蓝牙或者PC-Client控制小车的运行状态,配置为自动模式时,此时小车启动自动寻迹功能。
Part-3: 智能车控制:该区域有5个Button,用于控制小车的运行状态。
Part-4: 传感器数据显示区
Part-5: 消息监控区,实时打印网络接收到的log。
3.4.3 程序架构
本程序使用Visual stdio 2022 开发工具编写代码,开发语言为C#, 其程序框架结构如下:
UI设计框架
3.5 RT-Thread Nano版本在STM32F103上的移植
笔者使用STM32F103板卡作为电机的控制模块,为了更好的利用STM32F103的资源,这里选用RT-Thread Nano版本作为该MCU的操作系统。在使用该系统之前,需要移植该系统,其具体步骤如下:
Step -1: 在Keil IDE上选择RTOS(笔者已经安装了RT-Thread packet)
Step-2: 配置相关的代码
1)在board.c文件中添加MCU的时钟初始化函数
2)在rtconfig.h文件中使能RT_USING_CONSOLE
3) 实现console的相关接口
4)控制台命令接口
5) SysTick_Handler函数调用rt_os_tick_callback函数
step-3: 测试RT-Thread运行情况,当系统打印如下log信息,说明RT-Thread在板卡上已经移植成功。
4 功能测试
4.1 传感器数据上传功能测试
功能一: Version board读取温度、湿度、光照强度、距离数据,并将这些数据显示在OLED屏幕上
功能二:Version board 通过WIFI连接上位机PC-App
version board 连接上服务器的log信息
PC-App上监测到Version board的连接信息,并收到message,同时在数据显示区,实时展示传感器的数据信息
功能三:微信小程序通过蓝牙接收到sensor 数据并实施显示出来
1)启动微信小程序真机调试功能
2)手机客户端启动App,并得到Sensor数据
4.2 小车功能实验测试
4.2.1 蓝牙App控制小车运行(实验测试)
测试视频链接地址:
[24嵌入式大赛-Vision-Board]测试视频-3:APP控制小车运行轨迹
微信小程序和蓝牙模块控制小车运行状态
[24嵌入式大赛-Vision-Board]测试视频-3:APP控制小车运行轨迹哔哩哔哩bilibili
微信小程序和蓝牙模块控制小车运行状态哔哩哔哩bilibili
4.2.2 WIFI连接PC-APP控制小车运行(实验测试)
step-1: 在PC-App上配置手动模式
Step-2: 点击方向按钮控制小车
Version board 收到上位机发送的log:
测试视频链接:
[24嵌入式大赛-Vision-Board]测试视频-1:基于Vision-Board的智能应急环境监测控制小车之自动模式寻迹模式
[24嵌入式大赛-Vision-Board]测试视频-2:基于Vision-Board的智能应急环境监测控制小车之手动模式控制小车运行轨迹和环境参数数据实时上传