先说说硬件环境,使用的是STM32F4DISCO(自带加速度)+Si4703+LCD5110。软件设计上,虽然应用的核心功能是收音机了,但是和大部分的应用相似,没有良好的用户交互界面,使用体验是要大打折扣的。所以下面的文字大部分都集中在用户交互设计上。
首先是控制部分,加速度计可以提供上下左右4个方向的控制,在应用中给音量增减和电台下上切台使用。由于敲击功能没有实现,因此电台的开关交给了开发板上的用户按键。用户按键原计划使用callback来实现功能,但是测试木有成功啊。不过既然加速度值也是用polling的话,那不如按键也一起好了。扫描使用最原始的方式,扫描到以后,延时10ms,然后再判断是否按下。加速度计在使用时,也存在类似的抖动,因此也使用了相同的逻辑来消抖。同时,通过测试,给定了一个加速度计倾转的阈值:g=0.3,也就是说当某个方向(不含z)的g大于0.3,表示有用户动作发生。
接下来就是显示界面了。整个5110有6行高度为8的字符可用,每行84个点。应用要显示的核心内容是电台频率和音量,内容不多,因此可以适当放大。最终频率选择了12*24的字体,占用3行,又不会把整行撑满;音量做了以模拟的bar显示,用竖条|||||||的多少表示音量的打下,占用两行;这样还多出一行,用来显示一个固定字符串“PY FM Radio”。
整体界面如下图所示:
事先用其他方式确定了若干个本地效果较好的电台,放到了radiolist中。当发现有左右手势的时候,取出radiolist中的下一个电台频率值,发送给Si4703,并更新显示界面,电台频率是绕圈改变的,也就是说到了radiolist的最后一个,下一次就回到了第一个。当发现有上下手势时,对volume进行响应的改变,并发送给Si4703,并更新显示界面。音量最大15,最小0(表示静音)。当发现有用户按键动作时,在开关状态之间切换。关闭时,清除屏幕,关闭Si4703;开机时,正常显示,FM工作。
视频演示:
说明:
设计过程中发现了浮点数运算的精度问题。比如频率99.6Mhz,在list当中是存成996的,显示的时候,通过运算channel=str(996/10),将电台转为浮点字符串99.6。前期调试的时候,用的电台较少,没有问题。后面把所有电台都加上时,发现有些电台,比如890,做了除法运算以后,变成了89.0001,导致显示行方向溢出。最后通过字符串截取的方式取到自己想要的长度。python似乎没有printf?
目前还有一些小问题,比如加速度识别的抖动有时候还会出现,音量有时候会有跳变等等。最后通过视频看下具体效果吧。
详细的制作讲解和main.py见附件内容。