(一)项目简介
本人是单片机初学者,本着初生牛犊不怕虎的精神报了DIY大赛,主要目的是借机给自己定一个具象的目标来促进学习,增长经验。通过这次比赛,可以说完成了自己第一个真正意义上的单片机作品,也算颇具纪念意义~具体的开发过程可谓是磕磕绊绊,充满了困难,也可以说是现学现卖,踩了不少坑,犯了不少二…不过好在最终勉强完成了作品。但是就水平而言跟各位大佬相比肯定是很LOW的~不过既然已经报了名,那么还是把成果恬不知耻的发出来分享一下吧,希望能刚入门的新手同志一点参考,哈哈,让各位大佬见笑了~
本项目的题目是基于GD32的自行车方向指示器。预计实现的目标很简单:用摇杆实现LED点阵屏幕图案的控制。当时之所以选定这个题目是因为一个实际的生活需求,由于本人经常夜里骑行通勤,在路上经常能看到一些夜骑爱好者在自己自行车尾部坐管处安装一个警示灯,具体效果类似如下图1所示。这些尾灯基本有一些简单的运行模式,比如爆闪,常亮等。安装这种尾灯后可以在夜间起到警示作用,主要用来提示骑行者后方车辆,有效提升骑行者安全(当然尾灯亮度不能太高,如果晃到后方车辆,那样既不道德也不安全)。开始感觉这个小创意很不错,本人也曾想买一个装在车上,但后来转念一想又觉得这东西功能过于单一,图案也很单调,还有很大的提升空间,于是便萌生了自己制作一款具有指示行车方向功能的尾灯。所谓指示行车方向,其实就是起到类似汽车转向灯的作用,骑行者在进行转向、减速、前进时可以自己通过控制器控制指示灯来提示后方车辆自己下一步的运行状态。但是由于自行车空间有限,肯定不能像汽车那样在尾部两侧安装转向灯,于是便想到了利用点阵屏幕绘制方向箭头来实现提示效果,效果图如图2所示。
图1 尾灯实物图
图2 点阵显示效果图
(二)系统框图
本项目系统构成很简单,主要由五部分组件构成:控制摇杆、8*8LED点阵、MAX7219驱动板、GD32E231开发板以及电源组成,系统框图如图3所示。其中控制摇杆、MAX7219驱动板以及LED点阵实物以及它们的工作原理会在下文着重解释,至于电源与开发板就不解释啦。
图3 系统结构框图
(三)硬件工作原理说明
双轴摇杆实物图如图4所示,其本质其实就是一个双向电位器外加一个微动开关,其工作原理很简单:十字摇杆为一个双向的10K电阻器,随着摇杆方向不同,抽头的阻值随着变化。在使用5V供电(在本项目中使用3.3V)的原始状态下X,Y读出电压为2.5V左右(本项目为1.65V),当把推钮向一个方向推动时,电压值随着增加,最大到5V(本项目最大为3.3V);向反方向推动时,电压值减少,最小为0V。即模块特设二路模拟输出和一路数字输出接口,输出值分别对应(X,Y)双轴偏移量,其类型为模拟量;按键表示用户是否在Z轴上按下,其类型为数字开关量。
图4 双轴摇杆控制器
MAX7219驱动模块以及LED点阵屏实物如下图5所示,原理图如图6所示。
图5 MAX7219驱动板与LED点阵屏
图6 MAX7219与LED点阵原理图
MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。MAX7219与SPI™、QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。还拥有一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219允许用户对每一个数据选择编码或者不编码。MAX7219与8031单片机连接采用三线串行接口。在使用方法上,MAX7219的串行数据是以16位数据包的形式从Din脚串行输入,在CLK的每一个上升沿一位一位地送入芯片内部16位移位寄存器,而不管Lout脚的状态如何。Load脚必须在第16个CLK上升沿出现的同时或之后,但在下一个CLK上升沿之前变为高电平,否则移入的数据将丢失。操作者只需编程发送16位数据包,就能简单地操作LED的位选以及段选,设置和改变MAX7219的工作模式。16位数据包的数据格式如下图7所示,读写时序如图8所示。
图7 7219数据格式
图8 7219读写时序图
其中:D7~D0:8位数据位,D7最高位,D0为最底位;D11~D8:4位地址位;D15~D12:无关位,通常全取1。MAX7219通过D11~D84位地址位译码,可寻址14个内部寄存器,分别是8个LED显示位寄存器,5个控制寄存器和1个空操作寄存器。LED显示寄存器由内部8×8静态RAM构成,操作者可直接对位寄存器进行个别寻址,以刷新和保持数据,只要V+超过2V(一般为+5V)。控制寄存器包括:译码模式,显示亮度调节,扫描限制(选择扫描位数),关断和显示测试寄存器。寄存器地址分配表如下图9所示。在对7219进行初始化时,根据下表地址发送指定参数即可完成参数设置,具体参数配置详见源码。
图9 7219寄存器地址分配表
(四)程序设计
本项目的驱动程序实现很简单,因为有7219驱动板的存在,所以不需要耗费太多精力就可以搞定。在具体实现方式上,本设计主要采用SPI实现数据传输,因此只需定义并初始化3个引脚。本项目中使用PB13 SPI1_SCK,PB15 SPI1_MOSI,PB1连接7219驱动板的CLK,DIN以及CS引脚。初始化完配置完毕后,需要编写数据发送函数,其中需要注意的是在进行发送数据时一定要先拉低片选管脚电平再进行地址以及数据的写入,这一点要注意留意7219的时序图。写好发送函数后还需要对7219进行初始化,具体方法是通过刚编写的数据发送函数向7219特定寄存器中写入特定数据,如果不进行这一步,7219将无法正常工作。以上都配置完成后,LED点阵屏其实已经可以工作了,这时只要将数组形式的字库通过发送函数传给7219就可以驱动屏幕显示图案了。字库的格式十分通俗易懂,简单来说就是用16进制的8字节数据从上到下依次表示8行LED的显示内容,以此来拼接成一个图案。字库的编写其实很简单,自己拿笔划两下就能搞定。
由于本设计的设计目的是为了指示方向,所以自己画了几个箭头图案。但如果仅仅是静态显示就过于Low了,起码得让图案动起来才说得过去对吧?想让点阵屏上的图案动起来方法其实很简单,简言之就是采用循环以及操作矩阵的方式让字库中的数据动起来后,在不断刷新显示,由于视觉暂留效应而形成动画效果。函数具体的实现方法在源代码里有,不难理解,这里就不赘述了。不过需要注意的是,调用数据发送函数时一定要在其前后加入延时,不然图案会变成一坨乱码…具体原因不明,目前猜测可能因为7219与GD32的工作频率不匹配所致…
使用摇杆对图案进行控制的实现方法也很简单,简言之就是通过ADC实现信号的读取,再在循环中不断进行判断以及显示调用。本设计中只使用了摇杆的两个输出引脚,因此只需要配置好两个通道的ADC就可以实现信号的读取,具体方式采用了非DMA模式的两路通道配置。配置完毕后编写ADC值读取函数,然后将其写在中断函数里,使得两通道的ADC值可以不断快速更新。这里要注意的是采样周期的配置,可以适当将精度设置小一些以提升实时性,因为仅仅读取的是摇杆的位置信息,精度太大了也没有用。
在完成上述工作的基础上,主函数的内容就很简单了,只需要依次执行系统时钟配置,SPI初始化,SPI初始化,MAX7219驱动初始化,ADC初始化,然后执行循环即可。循环里的内容主要是根据ADC返回值不断判断摇杆的推动方向,以此控制LED点阵显示对应方向的箭头。具体的效果可以见视频演示。
(五)成果演示
照片
小视频
(见附件)
说明:如视频里所示,向上推动摇杆时,屏幕显示的是一个向上流动的箭头,此时表示车辆将向前前进;往左推动摇杆时屏幕会显示一个向左流动的箭头,代表即将左转,右转时同理;向后推动摇杆时整个LED屏幕全部点亮,此时表示车辆正在减速或者即将停止。
(六)总结及展望
整体介绍下来后,本人觉得十分羞耻且愧疚…因为就目前的情况而言,成品实在太过简陋。本来设想的是通过蓝牙作为通讯连接方式实现遥控,这样可以将摇杆干净利落的装在握把上,此外还想将点阵驱动芯片、主控芯片、电源电路等集成在一块板子上,再3D打印一个可容纳电池与电路板的封装,以此缩小体积,并进一步优化功耗与性能,使之成为一个可以直接装在车上的小产品…不过由于本人水平实在太菜外加时间有限,这些设想都没来得及实现就到deadline了…不过在后续工作中,还是会继续努力将其不断完善的~毕竟是自己的第一个单片机作品嘛,希望能开个好头,哈哈~
另外特别感谢基友LuLu对我的大力支持,感谢他不厌其烦的助我解决问题,带我领略技术之美!
|