1、系统结构设计
2、器件选型
3、PCB板绘制
4、程序调试
通信调试
按键设置
选手上面的数码管显示
主持人设备OLED显示
语音播报模块
总结
最近在指导一个小学弟完成他的设计,借此机会记录一个小项目从“系统结构设计、器件选型、PC板绘制、程序调试”的过程。
目的:设计一个四人的抢答器
设计要求:
1、抢答器可同时供四组抢答;
2、抢答器具有倒计时功能,倒计时时间通过主持人来设置,倒计时时间归零时,选手进行抢答;
3、抢答器具有锁存和显示功能,显示选手的抢答时间,分辨率不小于100ms;
4、抢答器具有无线功能;
5、抢答器具有语音功能,选手抢答成功后,语音会播报抢答选手的编号。
控制器:STM32F103C8T6
编译软件:RT Thread Studio V2.1.0
整体结构如上图所示,该抢答器由1个主控制器(主持人用)和4个触发器(选手用)构成。
主控制器: 触发器:
根据设计需求分析:
1、抢答器的计时功能:使用RT-Thread系统中的定时器。该定时器精度为1ms,完全满足该设计的定时需求。
2、抢答器显示功能:触发器端就显示一个时间倒计时就行了,因此采用2位数码管显示倒计时时间;控制端除了显示倒计时时间,还要显示设置的时间、选手的抢答所花费的时间、以及哪位选手抢答成功等,因此控制端采用的是OLED显示,在RT-thread-studio软件包中心里面可以找到对应的软件包,直接导入就行了。
3、抢答器的无线功能:根据需求不难得到:主控制端是MASTER,触发器是SLAVE,因此我这里首先考虑到的是成本比较低的NRF24L01无线通信模块来组成局域网,但是NRF24L01从我之前使用的经验来看,它的通信距离比较短,距离稍微长一点通信就不稳定了,由于多个设备用的是同一个通信通道,因此在编写软件的时候发送帧和反馈帧中要带有本机的地址,然后再去解析接收到的数据包,因此感觉这个方案不咋行;然后我就选择了亿佰特的Zigbee模块,虽然成本是高了一些(也就20块左右一个),但是起码通信距离变长了,局域网的构建方便了许多,Zigbee可以先通过官方给的软件先构建好局域网然后再使用,这对于开发周期也快了很多,稳定性也变好了。由于Zigbee使用的是串口通信,因此就在RT_thread中多开一个串口就行了。
4、语音播放功能:该功能是只在主控制端才有的,因此就在淘宝上溜达了一圈,选个简单一点的成品模块来用,就不用自己开发了。
其实器件选型这部分和上一节的内容关系是密不可分的,一般在设计产品的时候就需要在脑海中构建出一个大致的设计思路,然后再细节的去考虑如何去写代码,如果觉得其中有一部分模块的代码写起来可行性不大或者周期太长就换(比如:NRF24L01换成Zigbee),这样的话就能够争取你的这个东西一次性OK!!!
主控制端 | 触发器 | |
显示器件 | 0.96寸OLED | 2位数码管 |
语音功能 | JQ8900成品 | 无 |
通信器件 | Zigbee E18_MS1 | Zigbee E18_MS1 |
芯片 | STM32F103C8T6 | STM32F103C8T6 |
按键、灯 | 若干 | 若干 |
这里我就直接放图了,估计看图应该就清楚了噻,不懂的话私聊。。。。
主控制端:
触发器:
程序已经调试完成,后面再调调BUG。
由于ZigBee使用的是串口通信,这里图方便,先用亿佰特公司的软件直接配置好ZigBee内部的参数设置,如下图所示,设置的节点类型:选手为终端(局域网很多个),主持人为协调器(局域网就一个),设置FAN ID:统一为FFF9(只要保证局域网用的这个是一样的就行了),网络组号:也就是每一个设备都有不同的ID,主持人我设置为1,选手的我就按照2、3、4依次往下设置就行了。
完成之后,局域网设置就完成了,在代码里面就只需要完成Zigbee串口的接收和发送,关于RT thread 系统的串口可以参考官网的手册https://www.rt-thread.org/document/site/programming-manual/device/uart/uart/,之前小节我也有介绍,下面直接看通信协议:
选手的
主持人的
设备按键的配置,我没有采用官方以按键中断https://www.rt-thread.org/document/site/programming-manual/device/pin/pin/#_9去读状态,而是直接调用软件包中的Button模块
选手的
按键1功能:抢答
按键2功能:测试通信
主持人的
按键1:时间加
按键2:时间减
按键3:开始抢答
数码管我用的是2个共阴数码管,用2片74HC595驱动,通常2位数码管是利用片选脚来扫描显示的,不喜欢这种方式所以这里用两片74HC595芯片,根据74HC595驱动引脚图可以看出它有一个串行数据输出脚方便用spi协议去驱动,然后对照真值表去写显示代码就行了,调用RT thread中的spi板块https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/。
oled采用的是IIC通信,这里可以直接调用软件包中的U8G2模块就行了,上面也有介绍。我这里用的不是最新版软件包,而是1.2.0版本,这个版本存在一点小问题,要在中定义#define HAL_SPI_MODULE_ENABLED,然后修改一处地方spi为*spi(忘记在哪儿了,根据错误定位去看)
语音播报我没有单独开一个线程,而是直接在主持人Zigbee.c文件中加的,这里就需要先将语音模块JQ8900配置好。阅读JQ8900模块的资料手册后,我们只需要用到07指令,在该模块的u盘里面存入录好的音频,在“曲目高”“曲目低”设置要播放的音频,然后用串口去控制就行了,其中SM位是前面所有位相加后的低8位。
相关代码我已经打包上传,需要的自己下载
链接:https://pan.baidu.com/s/1xi_m-OZEEQdDrWe3lJebzA
提取码:jjj3
运行成功后,可以看出主持人和选手的倒计时时间不一致,我感觉可能是因为OLED显示屏是一行一行刷新显示的,在这里造成的时间延时,导致主持人时间会长一些。