智能车载终端系统,基于UCOS进行开发,分享一下自己的制作思路!

[TOC]

一、赛题

1. 设计目标

设计制作一款可以人机交互、具备移动互联功能的智能车载终端系统。

2. 基本要求

  1. 车载娱乐播放
    (1)读取储存在SD卡中的音乐文件,并通过扬声器播放出来。
    (2)以TFT彩屏作为显示终端,显示当前的音乐文件信息,歌曲名、进度条、音量、码率等。
    (3)实现歌曲播放控制,具有”上一首”、”下一首”、”暂停”等基本操作功能。
  2. 车载仪表显示
    (4)以TFT彩屏作为显示终端,显示照明灯的状态(开/关)、继电器的状态(开/闭);显示水温(单位摄氏度)、油位(无单位,数值一般为占满量程的比例)、车速(单位千米/小时)信息。
    (5)水温来自于温度传感器、油位来自于滑动变阻器、车速来自于旋转的步进电机测速;水温数据、油位数据、车速数据每隔2秒动态刷新;采用合理方式调整水温、油位信号变化,以产生可见动态变化效果。
    (6)设计按键模拟油门给出”加速”、”减速”、”停车”等输入指令,控制步进电机做相应动作,并将车速及运行状态”加速/减速/停车”显示于TFT屏。

    3. 扩展要求

    (1)可以实现音频文件的录制功能,不通过第三方的导入功能,直接录制并存储音频。
    (2)实现歌曲播放控制的更多操作,例如生成播放列表、设置循环模式(单曲、顺序、随机)等。
    (3)模拟实现汽车”黑匣子”功能:当某一按键按下时,系统记录当前时刻的仪表信息(如水温、油位、车速及运转状态、照明灯与继电器状态等),并存储于EEPROM硬件中;关机后重新开机能够复现前次的各类信息。

    4. 发挥要求

  3. 移动互联功能
    (1)通过以太网或WIFI网络方式,与移动互联模块(手机或平板)之间进行车内仪表数据的上传。
    (2)编制安卓或苹果APP,实现与车内仪表类似的界面显示。
  4. 智能语音控制
    (3)通过语音识别实现对硬件设备的控制,例如说出”打开照明灯”、”关闭继电器”等,可直接转换为对应的输出设备动作。

题目链接:计算机能力挑战赛

二、分析

在拿到题目的时候,首先浏览了一遍题目,第一感觉:

这什么鬼、题目量也太大了吧,裸机手撸死翘翘好吧,所以果断选择uCos来作为调度系统,进行多任务管理。虽然任务量很大,但对处理器的要求并不是很高,只是逻辑布置很麻烦,所以我计划使用STM32F103ZET6来做这个。
然后开始逐步分解题目内容,从基本要求开始做,一点一点增加任务,完成项目,下面开始讲解基本任务:

1. 基本要求-车载娱乐播放

第一点要求读取SD卡音乐文件,并且播放,这里的技术要点主要是建立一个FAFT文件系统,挂载SD卡,读取我们指定的音乐目录下的音乐文件,然后通过解码播放,这里选择VS1053模块来做解码,接一个扬声器播放。
TFT显示信息直接使用LCD就行,使用极其方便,初始化一下,直接调用API就行,这里我一开始想使用EMWIN来做界面,但考虑到直接使用这些不是熟练,故放弃使用EMWIN做界面。关于显示歌曲的信息,因为直接使用的VS1053,可以直接通过寄存器发送读取对应信息的指令,之后读取对应返回值进行处理就行,这部分代码在正点原子战舰的例程里面有给出,代码封装的风格很好,读一遍基本可以理解,然后就能调用。关于音乐切换其实就是在mp3初始化时,把所有音乐的文件路径存储到一个字符串链表里面,播放不同音乐就是根据链表重新选择一下文件路径,然后再进入死循环播放就行了,音乐暂停,在UCOS里面直接使用挂起任务就可以完成,需要继续播放则使用任务恢复API就可以完成恢复。
VS1053模块

2. 基本要求-车载仪表显示

仪表显示因为没有使用emwin界面工具,用单纯的纯手画图方式设计一个好看界面太占据内存,并且效率不高,实现意义不大,故直接使用最传统的方式—-显示文字法,节省内存,提高效率(就是丑了点~)
温度采集使用DS18B20来采集温度信息,单总线结合GPIO模拟协议进行写入和读取,电机速率采集则使用红外对管测速,通过外部中断配合定时测量一段时间内转动码盘上经过的孔的数量,从而计算出速率,加速减速通过改变步进电机脉冲之间的时间。
DS18B20:
在这里插入图片描述
测速模块:
在这里插入图片描述

3. 扩展要求-音频录制

音频的录制和mp3播放使用的同一个模块,故在使用音频播放时需要创重新初始化vs1053同时需要重新配置mp3播放的功能,录音的使用和mp3其实差不了多少,正点原子关于这个模块有较详细的叙述,后面我也简单的写一下。

4. 扩展要求-歌曲列表

歌曲列表的显示其实就是轮询SD卡音乐文件夹下各个音乐的信息,然后将音乐名称打印出来,每次切换音乐都重新打印,可以刷新列表,关于切换音乐,顺序播放切换音乐就是对链表切花时位移一个,单曲位移为0,使播放原地踏步,随机播放呢,我使用的UCOS内部产生32位随机数的API然后除以最大音乐数目取余数,相当于在所有音乐之中随机播放音乐。

5. 扩展要求-汽车黑匣子

黑匣子这个难度不是很大,IIC连接EEPROM存储信息就行了,但是跑着uCos上可能会出一些问题,尤其在使用正点原子的ucos延时时会出现这个问题,正点原子ucos代码us级延时误差挺大,我文中会给出解决方法。
EEPROM模块:
在这里插入图片描述

6. 发挥要求-移动互联功能

移动互联网功能就是一个上云功能,at指令配好,了解一下MQTT协议就能完成,然后就可以传输数据上云了(公网云),我们这使用的是阿里云平台,因为他有个快速制作app界面的功能,所以使用起来很方便,也能做出题目要求的界面效果,所以使用阿里云。
ESP8266模块:
在这里插入图片描述

7. 发挥要求-智能语音控制

语音识别直接配置完整的模块,写入识别信息,模块自带匹配功能,识别之后执行对应的指令,配置过程很简单,直接使用源码没有问题!
LD3320语音识别模块:
在这里插入图片描述

三、制作

分析完理论知识和需要的模块的之后,开始正式进入code环节,下面继续按照上面的步骤进行调试代码。

  1. 实现原理:
    项目首先构建硬件连接关系图,连接硬件,通过MDK对STM32F103ZET6进行软件编程,使用uCos实时系统,调度STM32F103ZET6内部串口、定时器、中断、硬件SPI、IIC等资源,配置外部模块,使STM32F103ZET6可以对外围模块进行控制及数据采集,进一步进行处理与逻辑控制,使stm32可以达到用户所需要的目的。
  2. 硬件框图:
    STM32F103ZET6与外围电路的连接框图如下,通过IO口连接步进电机、矩阵键盘、灯、继电器,通过SPI连接语音识别模块ASR、1053_MP3模块,通过串口连接ESP32WIFI模块,通过FSMC输出信息给TFT液晶屏,通过ADC模块转化电位器位值,通过外部中断检测红外对管电平,通过SDIO协议读取SD卡数据信息,通过单总线协议读取DS18B20的温度信息;
    在这里插入图片描述
  3. 软件流程:
    项目使用STM32基于UCOS实现所有功能,在代码编写上,共计建立了9个任务进行调度,调度流程如下,调度过程中,CPU使用率基本上稳定在50%以下,同时任务运行稳定,长时间运行不崩溃,切任务实时性高,处理事件反应快,达到较好的用户交互效果。
    在这里插入图片描述

    四、结果

    作品展示
  4. 1 项目连接的整体视角:
    在这里插入图片描述
  5. 2 TFT初始化后的UI界面:
    在这里插入图片描述

1.3 手机端APP界面:
在这里插入图片描述
1.4 矩阵键盘按键功能图:

在这里插入图片描述
2. 功能实现
2.1 基本要求的实现
读取了SD卡的音乐文件并播放,《音乐播放器》板块显示了歌曲名、进度条、音量、码率等,并可通过按键1、2、3实现切歌、暂停。
在采集信息板块,LIGHT为照明灯状态,RELAY为继电器状态,Temp为水温,OIL_H为油位,SPEED为车速信息,并每隔2s刷新。通过按键9、10、11实现步进电机相应动作,并将车速显示在挡位上,运行状态显示在电机状态上。
2.2 扩展要求的实现
录音状态显示在《WAV录音机》板块,通过按键16实现音频录制功能,录制完成后按下按键14存储音频。歌曲的更多操作显示在《音乐播放器》板块,按键7切换播放模式,将模式显示在播放后,按键4和按键8实现音量增减并显示音量VOL。汽车黑匣子显示在复现信息板块,由按键5和按键6实现,按键6写入当前状态数据,按键5读取之前状态。
2.3 发挥要求的实现
数据通过WIFI模块上传至云平台后,云服务器显示已连接,上图为手机接收到的仪表数据,显示在APP上。按下按键3后暂停MP3并使用语音识别,在说出“关闭照明灯”及“打开继电器”均能实现相应数据更新动作。

五、源码

github:链接
gitee:链接

六、交流

我的个人博客网页:链接
微信公众号,求个关注0.0

wechat