ljxljxljx 发表于 2022-12-9 11:38:33

【开源】基于stm32与迪文屏的蓝牙控制小车

系统方案相关附件:迪文屏设置: 源码:https://www.bilibili.com/video/BV1eV4y1P7BQ/(演示视频)1.1前言蓝牙作为一种无线技术标准,可实现固定设备、移动设备间的短距离数据交换。当今汽车车载蓝牙应用范围越来越广,移动智能手机也给人类的生活带来了便利。设计基于蓝牙控制技术的智能小车控制系统,可以为车载蓝牙与手机相结合的设计提供新的设计思维与方法,也为汽车无线远程控制的设计提供参考。1.2设计要求本课程设计以安卓系统作为控制端,以STM32F407作为蓝牙信号接收控制中心。首先需要在安卓手机端安装蓝牙APP,利用APP作为平台发送蓝牙数据,蓝牙小车端的蓝牙模块把接收到的数据通过主控芯片的串口把数据传给主控芯片,中控芯片处理判断后作出反应,如此实现对小车的蓝牙控制。蓝牙小车主要实现以下功能:(1)具有手机APP蓝牙控制功能的蓝牙小车,可以通过手机操作界面实现小车的前进、后退、右转弯、左转弯等功能。(2)使用JQ8400蓝牙模块、迪文屏模块、LED等外围电路来实时显示蓝牙小车的运动状态。(3)小车在行进的过程中,可以实现三挡调速功能。1.3 系统框图本蓝牙小车系统使用到的模块有:STM32主控芯片、LED灯、电机、舵机、JQ8400语音模块、DGUS_V7381串口屏幕、LED灯等,其系统框图如图1-1所示。1.4功能描述 1.4.1 初始状态说明       蓝牙小车上电启动后,迪文屏模块显示欢迎界面,JQ8400语音模块播报“小车启动”,此时打开蓝牙调试助手,用手机蓝牙连接小车蓝牙模块。1.4.2 按键说明(1)使用蓝牙调试助手输入“01”,小车电机启动,小车前进。此时迪文屏显示向上的箭头,语音模块播报“小车前进”。(2)使用蓝牙调试助手输入“03”,小车舵机左转。此时迪文屏显示向左的箭头,语音模块“小车左转”。(3)使用蓝牙调试助手输入“04”,小车舵机左转。此时迪文屏显示向左的箭头,语音模块“小车右转”。(4)使用蓝牙调试助手输入“05”,小车电机停转。此时迪文屏显示停止,语音模块播报“停止”。(5)在小车启动的情况下使用蓝牙调试助手输入“06”,小车电机加速。此时迪文屏显示向上的箭头,语音模块播报“小车前进”。(6)在小车启动的情况下使用蓝牙调试助手输入“07”,小车电机减速。此时迪文屏显示向上的箭头,语音模块播报“小车前进”。(7)在小车启动的情况下使用蓝牙调试助手输入“08”,小车舵机回正。(8)在小车启动的情况下使用蓝牙调试助手输入“02”,小车后退,此时迪文屏显示向下的箭头,语音模块播报“小车后退”。
第二章 模块设计2.1蓝牙模块设计    2.1.1 硬件选择本系统使用的是WH-BLE102蓝牙模块,WH-BLE102蓝牙模块是一款支持蓝牙4.2协议的低功耗模块,该模块主从一体,用户既可以使用一主一从的方式进行数据透传,通过该模块可以使传统的低端串口设备或者MCU控制的设备进行无线的数据传输。同时用户还可以根据标准BLE协议进行开发App,可以方便的与蓝牙模块进行数据通信。并且模块支持Mesh组网模式,可以实现简单的自组网络。同时模块支持一对多数据广播,并且内置iBeacon协设,简单的配置就可以作为一个iBeacon设备使用。是一款多功能,简单,低功耗的物联网传输模块。其基本功能图如图2-1所示。2.1.2 工作模式选择WH-BLE102蓝牙模块有四种工作模式:主设备模式,从设备模式,广播模式,Mesh组网模式。本课程设计要实现的是手机蓝牙调试助手对小车的控制,因而本设计主要使用蓝牙模块的从设备模式。从设备模式使用BLE 4.2协议,可以根据协议自己开发APP。此模式下包括一个串口收发的Service,使用时可以通过UUID找到它,里面含有读和写两个通道,本设计主要是通过写通道来实现的。如果使用该蓝牙模块作为从设备与手机蓝牙相连接,那么无需关注协议,两个设备可以直接进行数据的透明传输。2.1.3 蓝牙模块配置(1)配置原理对WH-BLE102蓝牙模块的配置方法为AT指令配置。AT指令配置是指,在命令模式下用户通过串口与模块进行命令传递的指令集。通过查阅小车原理图可知,该蓝牙模块与主控芯片串口5相连。我们通过串口5建立起主控芯片与蓝牙模块的通信,再通过串口1建立起主控芯片与PC机的通信(其功能图如图2-2所示)。这样,主控芯片通过串口5向蓝牙模块发送AT指令,蓝牙模块便会将指令执行的结果通过串口1显示在PC机串口调试助手上。

(2)配置流程首先初始化串口1与串口5,烧录程序后上电启动WH-BLE102蓝牙模块。在PC端打开串口调试助手(默认波特率为57600),并在串口上输入“+++a”,蓝牙模块在收到“+++a”后会收到确认码“a+ok”,表明模块已经进入到了命令行模式,其效果如图2-3所示。成功进入命令模式后,我们需要将模块的工作模式设置为从设备模式,其指令为AT+MODE=S。除此之外,该蓝牙模块还可以配置波特率、断线重连、密码配对验证等多种功能,只需查阅指令表并在命令模式下输入AT指令即可。蓝牙模块配置结束后需要回到透传模式,从命令模式切换到透传模式需要采用AT+ENTM命令,在命令模式下输入AT+ENTM,以回车结尾,即可切换到透传模式。蓝牙模块配置过程的流程图如图2-4所示。

2.1.4数据传输测试根据设计要求,当在手机端的蓝牙调试助手上向主控芯片发送数据时,小车应当完成相应操作。由于前期各模块还没有整合,我通过串口1是否能够收到蓝牙调试助手发送的数据来测试蓝牙模块是否实现了预期的功能。测试过程如下:(1)模块上电后,芯片背部的LED灯闪烁,使用蓝牙调试助手搜索名为“WH-BLE102”的设备并点击连接,软件界面如图2-5所示:(1)连接成功后芯片背部的LED灯变为常亮,点击左下角的WRITE一项便会进入到数据发送页面(如图2-6所示),此时我们输入要写的数据并点击WRITE,串口1便会接收到发送的数据。实验效果如图2-7、2-8所示。经过反复多次的测试,蓝牙模块的连接速度与数据发送速度都比较良好,蓝牙模块的测试实现了预期的效果。DGUS系列的产品分类包括:Mini DGUS、C系列(低成本消费类应用)、T系列(满足工业应用)、S系列(苛刻工业环境应用)、18WT系列(取代标准HMI)、多媒体系列产品。最新产品有:语音播放DGUS屏、超高亮度DGUS屏(1000-1500nit)、集成电容式触摸的DGUS屏。迪文屏的正反面如图2-14所示:2.3.2迪文屏的模块设计迪文屏模块设计图如图2-15所示:由上图可知:PC机通过串口1给小车(STM32)发送前进、后退等指令,小车收到指令后开始相应的运动,同时通过串口3给LCD屏发送另一串指令,让屏可以根据小车的运动状态自动切换相对应的图片。由部分原理图2-16可知,STM32的引脚PD8、PD9要复用为串口3。2.3.3迪文屏界面和程序设计STM32通过串口3和迪文屏进行通信,波特率为115200。迪文屏的界面设计首先采用PS软件做出自己需要的图片,然后保存成320*480分辨率的BMP图片格式。接着采用迪文DGUS软件进行显示和控制设计。在程序设计部分,首先需要配置串口3使STM32和LCD屏可以通信,串口3的配置步骤如图2-17所示。然后STM32要向屏发送一串指令,让其显示相应的图片,以编号为00的图片为例,STM32收到蓝牙发送的指令后,立即通过串口3向屏发送指令“5AA5078200845A010000”,其中5AA5是帧头;07表示后面有7位数据(每两个数字为1位);82是写数据指令;0084是变量地址(多个变量一起读写时,只需定义起始变量地址);5A表示启动一次页面处理的指令;01表示页面切换;0000表示图片的编号。在程序中以数组的形式连续发送,发送数据指令的流程图如图2-18所示(以编号为00的图片为例)。数组a有6行,每一行有10位数据,数组a中0代表发送第一行数据,j从0循环到10,即数组连续发送了10个数据,这10个数据为一个指令,屏收到指令后会显示对应的图片。延时20ms是为了避免发送的两个数据之间间隔太短而产生错乱,延时100ms是为了避免图片与图片之间切换得太快而发生混叠。包括还有pwm输出使电机和舵机转动,在这里就不一一赘述。更多内容已写入报告中,欢迎码友下载交流学习。电机舵机模块调试(1)调试过程中遇到的问题:明明主程序中没有直接左偏的代码,但每次小车一上电舵机就会自动左偏,这是什么原因又该怎么解决呢?小车左右转可以来回控制,但偏转之后无法回正,所以在最基本的前进、后退、左转和右转四种状态下,我们需要做什么才能让它回正呢?给定电机一个压差使它可以前进后退,那么压差改变它是否可以加减速呢?(2)原因分析与探究:对于问题一,一开始我想过上电后舵机自动左偏会不会跟初始值psc和arr有关,但仔细理解一下舵机的原理就可知,arr是PWM的机械周期,psc是预分频系数,在没有指令的情况下是不会出现自动左偏的情况的,所以只可能是小车自身特性的原因。这一点也在调试左右转时得到了验证,本来想让舵机左偏45°,那输入信号的脉冲应该设置为1ms才对,但是经过多次调试后发现小车最接近45°的时候脉冲大概为1.4ms,所以由于小车自身的特性一上电就会左偏。对于问题二,要使小车回正,我们只需利用PWM调节舵机角度,使其偏转角恰好为0°就可以了。对于问题三,PWM占空比的大小决定了电机两端电压差的大小,而压差的大小决定了电机转动的速度,所以只要调整好PWM的占空比就可以得到不同速度的挡位。(3)问题的解决:对于问题一,虽然小车自身的特性我们无法改变,但我们可以利用回正函数使小车不左偏。因此,在主函数while循环的开始就添加一个回正函数,使小车保持0°的状态。对于问题二,我们依然使用函数TIM_SetCompare4(TIM1,x)来调节,经过反复测试,当x=850时小车处于回正状态。对于问题三,前进时,PB6和PB8的PWM脉冲值为99,PB7和PB9的PWM脉冲值为899,加速时,保持PB7和PB9的PWM脉冲值不变,将PB6和PB8的PWM脉冲值改为0,从而压差变大,速度加快。同理,减速时,将PB6和PB8的PWM脉冲值为199,从而压差变小,速度减慢。3.2迪文屏模块调试(1)调试过程中遇到的问题:第一天做屏的时候一直烧录不上,步骤看似没什么问题,但总是出现雪花屏,后续步骤都无法进行。第二天图片可以成功下载后又开始思索小车要向屏发送什么指令才能使屏显示出对应的状态呢?一连串的指令又要通过什么发送呢?(2)原因分析与探究:屏的烧录过程看似简单,但有一些细节地方不注意就会出错,经过不断查阅资料和询问我发现主要是这三个问题:首先是图片的格式必须为bmp的形式;其次是图片的分辨率要改成320*480;最后是图片的帧率,有的图片较为复杂帧率太高需要调低。要使迪文屏能够自动切换成对应状态的图片需要发送带有切换功能的指令,为了测试指令是否正确,我首先用串口调试助手向屏发送了指令看屏是否可以自动切换。问题的解决:将图片格式、分辨率和帧率修改正确后,屏得以成功烧录。STM32向屏发送指令“5AA5078200845A010000”,其中5AA5是帧头;07表示后面有7位数据(每两个数字为1位);82是写数据指令;0084是变量地址(多个变量一起读写时,只需定义起始变量地址);5A表示启动一次页面处理的指令;01表示页面切换;0000表示写入的数据值,即图片的编号。要想在程序代码中连续发送这串指令,我们以for循环+数组的形式连续发送。不过每发一组数据就要进行一次短延时,避免发送的两个数据之间间隔太短而产生错乱,每发一整串指令就要进行一次较长延时,避免图片与图片之间切换得太快而发生混叠。3.3蓝牙模块调试(1)调试过程中遇到的问题:正常情况下,手机端与蓝牙模块进行配对,然后在蓝牙调试助手输入数据,电脑上的串口就可以直接接收到了。但在实际测试的过程中,手机端可以成功与蓝牙模块连接,但无法进行正常的数据收发。(2)原因分析与探究:我首先怀疑出现上述原因是因为蓝牙模块没有工作在从设备模式,从而无法正常收发数据。通过操作蓝牙模块进入AT指令模式,并输入模块查询指令(AT+MODE),蓝牙模块返回指令“Slave”,表明该蓝牙模块确实工作在从设备模式,所以故障不是由于模式设置的原因导致的;其次我怀疑蓝牙模块存在故障导致了无法正常收发数据,经过更换芯片故障仍然存在,因而排除这一原因;最后我们怀疑是因蓝牙协议兼容性的问题导致了上述原因,并通过更换手机以及尝试不同的APP,上述问题得到了解决。(3)问题解决:通过反复的试验我们确定问题出现在了蓝牙调试助手上,通过尝试不同的蓝牙调试助手,我们找到并选取了连接速度最快、实验效果最好的软件继续完成课程设计。3.3语音模块调试(1)调试过程中遇到的问题:语音无法完整播出,一直循环的一个字。(2)原因分析与探究:语音模块是通过延时函数设置的模拟时序,与小车的电机运行时的中断冲突。(3)问题解决:在语音播报函数后加一个延时,使语音顺利播完后再运行电机代码。



页: [1]
查看完整版本: 【开源】基于stm32与迪文屏的蓝牙控制小车