• 发文
  • 评论
  • 微博
  • 空间
  • 微信

『免费开源』基于STM32的智能垃圾桶之综合代码(HAL库)

SingleYork 2020-07-31 10:09 发文

温馨提示

公众号菜单->获取资源->资料获取,百万份学习资料任你下载!更多精彩视频内容,请移步我们『芯知识学堂』的B站

大家好,我是『芯知识学堂』的SingleYork,前面给大家简单介绍了<基于STM32的智能垃圾桶之成员简介>、<基于STM32的智能垃圾桶之语音识别>、<基于STM32的智能垃圾桶之语音播报>和<基于STM32的智能垃圾桶之舵机控制(HAL库)>,今天笔者将要给大家介绍我们这个“DIY智能垃圾桶项目”的最后一个知识点,那就是这个项目的“综合代码”了,相信很多小伙伴都已经等得不耐烦了吧,不过笔者最近确实有点忙,很抱歉让大家久等了。

一说到“综合代码”,很多初学者,可能会一脸懵逼,因为,他们往往只会跟着开发板配套的教程,跑单一功能的代码,比如:控制某个LED亮与灭、串口收发、定时器基本操作、AD/DA控制等,这些单独的外设用的是“贼6”,可是,一旦让他们自己动手写包含多个外设的综合代码的时候,可能就是“狗咬刺猬—无从下手”。

当然咯,基础知识不扎实可能是其一方面,另外一个关键的原因就是练的太少,尤其是缺少项目实操的经验。那么,笔者希望通过我们这个“智能垃圾桶”的综合例程,对广大初学者有所帮助!

在介绍代码之前,我们先来看一下,我们这个“智能垃圾桶”项目要实现的功能:

呼唤“猫头鹰”-->应答“主人请吩咐”,板载RGB红灯亮,5秒内呼唤“旧报纸”->识别成功板载RGB绿灯亮,语音播报“可回收垃圾”,同时对应垃圾桶打开,延时5秒,垃圾桶合盖,RGB绿灯灭;

呼唤“猫头鹰”-->应答“主人请吩咐”,板载RGB红灯亮,5秒内呼唤“剩菜”  ->识别成功板载RGB绿灯亮, 语音播报“厨余垃圾”  ,同时对应垃圾桶打开,延时5秒,垃圾桶合盖,RGB绿灯灭;

呼唤“猫头鹰”-->应答“主人请吩咐”,板载RGB红灯亮,5秒内呼唤“灯泡”  ->识别成功板载RGB绿灯亮,语音播报“有害垃圾”  ,同时对应垃圾桶打开,延时5秒,垃圾桶合盖,RGB绿灯灭;

呼唤“猫头鹰”-->应答“主人请吩咐”,板载RGB红灯亮,5秒内呼唤“瓜子壳”->识别成功板载RGB绿灯亮,语音播报“其他垃圾”  ,同时对应垃圾桶打开,延时5秒,垃圾桶合盖,RGB绿灯灭;

在呼叫“猫头鹰”成功后,板载RGB红灯亮,若10秒内没有说出具体垃圾名,红灯灭,需要再一次唤醒“猫头鹰”。

硬件部分的连线,大家根据我们的扩展板的接口来连接即可,舵机的接线方式前面<基于STM32的智能垃圾桶之舵机控制(HAL库)>有介绍过,不清楚的小伙伴们可以去看一下,其中四个舵机接口定义如下:

舵机 1 接口对应“可回收垃圾”所在垃圾桶上的舵机;

舵机 2 接口对应“厨余垃圾”   所在垃圾桶上的舵机;

舵机 3 接口对应“有害垃圾”   所在垃圾桶上的舵机;

舵机 4 接口对应“其他垃圾”   所在垃圾桶上的舵机;

前面介绍单独的舵机驱动程序的时候,笔者是手把手教大家用CubeMX工具一步一步配置的,但是,今天的综合代码,笔者就不再给大家介绍如何用CubeMX工具来配置了,而是直接移植了硬石科技的例程,然后做了一些修改,这样比起自己完全用CubeMX工具来配置,还是要省不少事,而且,硬石科技的例程代码风格还是挺不错的,移植起来比较方便。废话不多说,我们还是来看代码吧,由于整个项目的代码比较多,限于篇幅也不可能全部进行讲解,这里主要是针对一些关键的代码部分进行简单讲解,需要完整代码的小伙伴们,可以在文末获取下载链接下载完整代码。

我们先来看配置部分相关的函数,配置部分主要都放在了main()函数的开头部分:

这里面的配置函数比较多,笔者主要介绍几个关键的函数,首先是系统时钟配置函数SystemClock_Config():

系统时钟配置部分基本上不需要做修改,跟CubeMX工具生产的代码也差不多,如果我们使用的是外部8MHz的晶振,基本上直接复制粘贴即可。这里需要注意的一个地方就是系统滴答定时器的配置,当我们有用到库函数HAL_Delay进行延时控制的话,就需要根据我们所需要延时的最小时间来配置系统滴答定时器。

接下来,就是GENERAL_TIMx_Init()这个函数,这个函数是在“bsp_GeneralTIM.c”这个文件中,是整个例程中比较关键的一个配置函数,主要实现了定时器TIM2定时1ms中断一次,还有定时器TIM3通道1-4作为PWM输出:

GENERAL_TIMx_Init()这个函数里面用到了很多宏定义,这些宏定义都是在“bsp_GeneralTIM.h”这个文件中,用宏定义增强了代码的可读性,便于后续维护、移植。

由于我们用到了定时器TIM3的PWM功能,所以,对TIM3的四个通道到引脚也需要进行配置,主要在HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)这个函数中实现,代码如下:

串口部分配置的代码,主要在“bsp_usartx.c”这个文件中,其中MX_USARTx_Init()这个函数用于对USART1、USART2和USART3的参数进行配置:

同样,这里用到了很多宏定义,宏定义部分的代码在“bsp_usartx.h”文件中实现:

虽然这里配置了3个串口,实际上,我们这个例程中,只需要用到USART1和USART3这两个串口,这里尤其是要注意一下USART1,STM32F103C8T6的USART1的TX和RX默认是在PA9和PA10这两个引脚上,而我们的扩展板使用的是PB6和PB7这两个引脚,所以,我们在USART1硬件初始化配置的时候,还需要添加一行“__HAL_AFIO_REMAP_USART1_ENABLE();”这个代码,将USART1重映射到PB6和PB7这两个引脚上:

USART2和USART3因为没有涉及到引脚的重映射,所以使用默认的配置即可:

接下来,我们就来看下语音播报相关的函数,前面讲<基于STM32的智能垃圾桶之语音播报>时候,笔者给大家提到了WT2003S-16S 这个MP3芯片“指定SPI-FLASH索引播放”功能的指令帧格式:

于是,我们可以这条控制指令的特点,写如下这样一个函数:

这样的话,在我们需要播放第N首音频文件的时候,只需要调用PlayByFileIndex(N)就可以播放了。

另外,我们还可以控制音频播放时音量的大小,同样,WT2003S-16S这个芯片提供了这样一个指令可用于设置音量的大小:

同样的,我们根据这条指令,写了如下这么一个函数:

这样我们就可以直接通过VolumeSetting(N)来设置播放音量等级为N了。

我们的板子上还搭载了一颗RGB的指示灯,实际上对于我们这个例程来说是无关紧要的,但是,为了便于我们更方便的观察到一些实验现象,笔者还是讲这个RGB灯用起来了,那么,我们来看下这个RGB灯的初始化代码吧,主要是通过“bsp_led.c”文件中的LED_GPIO_Init()函数来实现:

同样的,我们也使用了大量的宏定义,这些宏定义在“bsp_led.h”文件中:

在所有的外设都配置完成后,我们就可以来使用这些外设的功能了,由于我们要使用到定时器TIM2的定时中断功能,所以,我们要在中断模式下启动定时器TIM2,调用HAL_TIM_Base_Start_IT(&htimx2)这个函数即可实现。另外,我们还有用到定时器TIM3的PWM输出功能,因此,我们还需要启动定时器TIM3的四个PWM通道输出:

我们用定时器TIM2来实现1ms整数倍时间的定时,是在“非阻塞模式下定时器的回调函数” HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)中,添加一些变量来实现:

接下来,我们可以设置4个舵机的初始状态,根据<基于STM32的智能垃圾桶之舵机控制(HAL库)>中介绍的有关舵机控制的知识,我们可以通过如下方式设置4个舵机的初始角度为0°,并将4个舵机的状态都设置为“空闲”状态:

因为我们有使用到USART1和USART3这两个串口的中断功能,所以,我们还需要使能他们的中断接收:

在使能中断接收后,当串口有接收到数据,便会自动进入到“串口接收完成回调函数” HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)里面来:

我们在使用定时器中断和串口中断时,还需要在“stm32f1xx_it.c”文件中,添加如下代码,否则,定时器中断和串口中断不起作用:

接下来,我们就要来实现语音识别部分的代码,如下图所示,让我们USART1接收到0xFE(即:254)时,语音模块口令模式唤醒成功,这个时候RGB红灯亮,同时语音播报模块会提示“主人请吩咐”。若10秒内没有说出具体的垃圾名,则RGB红灯灭,下一次操作时需要重新唤醒:

这个时候,便进入了具体的垃圾类别的处理程序,当我们语音播报模块播放“主人请吩咐”完成后,我们便可以说出具体的垃圾名,然后,系统会根据语音识别模块的返回值来执行对应的动作,这里是通过一个switch()语句来实现:

具体的垃圾分类识别成功后,RGB绿色指示灯会亮,且语音播报模块会播放对应的垃圾分类名,同时,对应的垃圾桶盖会慢慢打开,这个打开的速度,可以在一定范围内调节。垃圾桶盖打开完成后,延时5秒,便会自动关闭,这部分功能实现代码,是在Servo_OpenAndClose()这个函数中,以舵机1的代码为例,其余3个舵机代码类似:

接下来,我们只需要将代码下载到我们的开发板中,即可看到运行的效果:

由于我们的蜂鸣器正好跟舵机4共用了定时器TIM3的通道4引脚,所以,下载程序后蜂鸣器会一直在响,可能会对语音识别有一点小干扰,但是影响不会很大,如果有小伙伴在用我们的『OWL Micro F1开发板』做这个DIY项目,大家也可以把蜂鸣器拆除。

好了,到这里,我们的整个<智能垃圾桶>的DIY项目就全部介绍完成了,感兴趣的小伙伴们可以自己动手做起来,虽然这个代码是在我们的『OWL Micro F1开发板』上实现的,但是,如果大家没有我们的这款开发板,大家也可以将代码移植到别的STM32F1系列的板子上去运行。当然咯,大家也可以在我们的代码基础上继续做一些优化,做一个更好玩的DIY项目出来。

需要完整代码的小伙伴们可在我们『芯知识学堂』微信公众号后台回复“智能垃圾桶”后即可获得本项目所有资料的下载链接,您们的支持是我们坚持创作的动力,感谢大家的支持!

原创不易,转载请务必注明出处!

end


声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    SingleYork

    微信公众号『芯知识学堂』官方账号...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码