去年时间做了个自行车风火轮,这个东西现在市面上很多。我做的这个用32个LED,加上了无线遥控功能,算是一点点创新吧。我会把资料都放出来,说实话并不算很完美。
先看成品图:
方案实现上,我用的是STC89C54,74HC595锁存器,霍尔传感器A3144,PT2262/2272无线遥控模块。
用STC89C54的原因是它有16K的ROM,能存的画面数据比较多,这个设计我存了10个画面。再有STC的比AT更人性化,比如说EA脚不用给高电平也行。
595是串口输入并口输出的锁存器,其实用74HC573也可以,可能会更好。因为573的输出电流比595要低一些,595的输出电流是35mA,这个电流驱动一个LED灯是有点大了,用573会比较合适。另外控制上573比595简单一些,573是并口输入并口输出。或者用595的话就每个输出口加200欧电阻限流,我设计的时候没有加。这些留给大家验证吧。
A3144没什么可说的,再简单不过了,正常高电平,有磁场就输出低电平,用来触发单片机的外部中断,很好用。
PT2262/PT2272其实也挺简单的,因为是做成模块了,只需要编程控制它,这个芯片有两种,一种是点动输出,一种是持续输出,就是按下遥控的时候,接收端的输出方式不同,一种按着就一直输出,放手就停止输出,另一种是按下后放手了也继续输出。它的接收端芯片有一个信号脚和4个数据脚,数据脚用来判断按键的,信号脚可以用来触发中断,我就是用它的VT脚的负跳变来触发单片机外部中断,实现遥控功能。
电源方面,我用的是6个1.5V的干电池串成的9V电源供电,进过7805,前面说到595的输出电流是35mA,在这个情况下,如果32个灯同时亮起来的电流其实也是蛮大的,所以如果是普通的电池,折腾不了多久的,如果真的要使用的话,建议还是换9V的锂电池。我就遇到一个情况就是电池电压降得太厉害,虽然单片机不受影响,但是遥控的接收模块却不行,遥控会失灵的,或者另外一个解释是电流太大,会干扰影响接收端的解码,从而使遥控无问题。
硬件设计方面,我用99se设计的,
PCB长24cm,宽4cm。
软件方面
这个设计非常重要的一个环节就是画面的取模,我用的取模软件来自互联网。
软件可以将位图取模,就是按一排32个LED灯的模式,从圆心向外把一个图分成256个扇形,每个扇形4份,每份8位二进制数,这样一个图像取模成1024个16进制数据存于单片机的ROM里。
接下来说说编程思路。
当风火轮固定在自行车辐条上,随着车轮转动,怎么样才能让画面显示成完整的一个圆呢。我用的方法是延时,在256份里,每份延时一定的时间,显示完256份以后刚好是一个完整的圆。具体是这样的,用霍尔传感器提供给单片机的外部中断1,配合T0定时器,就可以计算出上一圈车轮转一圈用的时间,因为自行车的加速度不大,可以认为上一圈的时间和将要转动的这一圈的时间是一样的。另外用软件仿真的方式计算出单片机把一个图像的数据送给锁存器显示需要的时间是多少,用之前算出的车轮转动的时间减去一个图像的时间,得出的时间差再256等份,然后没显示1份就延时一次,这样下来,画面就形成一个圆了。
主函数的流程图:
我设计了一个功能是转一圈排灯增加一个亮,满了之后再一个个减少。
再一个是根据车轮转动的速度,速度越快亮的灯数越多,不过这里有个问题是,程序运行需要时间,所以这个功能只是速度在一定范围内的显示,太快或太慢都不行。
还有一个功能就是自动换画面,每转20圈换下一个。
遥控这一块,当遥控器按下,接收端解码成功,数据管脚输出相应的数据,信号管脚由低变高。这个不管,我要用的是放手之后,信号管脚产生下降沿,触发外部中断0,数据口连着单片机的P1口,中断程序开始就读取P1口的值,然后判断键值,再执行相应的控制。
外部中断0的流程图:
介绍得差不多了,最后要说的一点是,单片机的中断优先级要改一下,最高的是外部0,次外部1,再定时器T0中断。默认是外部1比T0低,因为我要遥控是最高级,然后霍尔是次级,但是这两个都是外部中断,所以要改一下。
这个东西说实话也挺简单的,就用到几个锁存器,和一个遥控,这个遥控编程也超简单,然后就是把数据送给锁存器了。
做板子的话,条件有限,只能做到这样子了。