ADIForum

基于cortex-M3、ADXL345的重力感应遥控器的实现

ADIForum 員工 在 2014-5-6 建立的討論區
最後回覆由星 刘於2017-1-12提供

经作者,网友“小桥流水”(微博ID:@launcher-)授权转载,分享给大家参考。本文作者原发新浪博客链接:http://blog.sina.com.cn/s/blog_52e8baa401019t2p.html

 

已经是很久没有写文章了,因为没有时间,人家都说大四不考研,天天像过年,可我依旧没能有那份闲暇的时间。


现在几乎人人的手里都是一款安卓智能机这是我非常羡慕的,而我手里只有上学期用380元买的一台二手诺基亚N96,虽然也称得上智能机但是远远没有如今安卓智能的优秀,其中一个功能就是通过重力感应玩赛车游戏,我想这个大家都不陌生,只要把手机歪一歪斜一斜就可以控制赛车方向了,这个功能令桥哥好生羡慕嫉妒恨,可惜自己的手机不能玩,上周突来灵感何不自己做一个玩玩。正好上学期开始着手给侄子做的四轴飞行器的基板基本调试完成,核心的芯片就是一块M3微控器,一块三轴加速度传感器ADXL345,一块三轴数字陀螺仪。而要做一个简单的重力感应遥控器用M3结合ADXL345就可以实现了。实际上由于之前调试把芯片的控制函数都写好了,而且上位机的程序又有之前给学长做毕设的时候写的程序的基础,所以花的时间很少也就两个下午的时间。

001.jpg

要实现一个控制电脑游戏的重力感应遥控器原理也非常简单,无非就是判断此时遥控器倾斜角度,然后M3将指令迅速传给电脑,电脑根据指令给出跟敲击键盘方向键一样的指令就完事了。检测倾斜角度由ADXL345实现,三轴加速度传感器能够测出静态时xyz方向的加速度,如果平放的情况下,只在z轴有一个向下的重力加速度,如果倾斜,那么重力将可以分解到xy方向,这样产生了xy方向的加速度,从而可以测得遥控器向哪边倾斜了。

002.jpg

 

接下来,M3通过IIC总线方式读取ADXL345测得的X轴的加速度数据,只要通过判断X轴方向的数据就可以判断基板往哪个方向倾斜了。下面是M3的测量代码

003.jpg

M3判断出倾斜方向之后立即通过57600波特率的串口向电脑上位机发送指令,为了提高遥控器灵敏度和反映速度,我这里指令只用了一个字符,L代表左,R代表右,并且不使用校验,也不需要上位机回应M3,M3只管往上位机不断发指令就可以了,可以大大提高效率,实际测试中,这种波特率情况下即保证了传输速率,误码率也是较低的。


接下来上位机接收到方向指令后就得通过代码来模拟我们平时敲击键盘的动作,程序也是非常简单。跟我以前做的无线鼠标的实现代码非常的类似。

004.jpg

通过这段代码可以发现,除了左键右键的指令外,还有一个名为’X’的空白指令,代表的是当遥控器水平放置的时候释放按键。


VC写的上位机界面如下所示

005.jpg

看起来比较的粗糙,外观上我就不做什么修饰了,毕竟做的是电子而不是软件开发,只要能够实现我需要的功能,软件难看一点就将就吧。中间的四个方向按键作用是为了满足有些游戏是需要一直按下某个按键玩的,比如极品飞车你就得一直按着方向键才能走吧呵呵,当然就目前来讲我只判断了ADXL345的X轴数据,如果联合Y轴数据来判断,就可以同时控制上下左右四个方向了,这点我就先不再做,因为最近还是忙。最右边的调试数窗口用来做开发的时候监测串口数据用的,也可以用于系统的后续开发的调试使用。

006.jpg

实测状况,因为这块小板原先的设计是微型四轴所以用的是电池供电,还是非常方便的,这块电池也是非常给力,就冲了一次电,我都拿它调试过很长的时间了,依旧有电。

 

007.jpg

遥控器通过串口跟电脑连接以后,打开软件然后打开串口,然后把软件最小化之后就可以使用了,已经过了一把重力感应玩赛车的隐。


我现在还用的是有线串口实现通信,如果是无线的遥控器那将会更加完美,实际上我的板子上设计有2.4G无线通信模块接口,但是向无线模块写入发送数据,然后另一方还得有接收然后再通过串口传给电脑,这中间就额外增加了一段时间,或许会给遥控器的灵敏度带来下降,当然我还没有实测过,这是后续开发的事,我已经没有太多的时间放在此处,接下来我的重心将放在四轴飞行器上边,或许最好的结果是在今年过年可以让小侄看到能够飞起来的四轴,当然很可能也是他什么都看不到,我只能尽力了况且还有好多任务做真心忙。还有我还有两个小外甥呢,等他们大点不也要给它们弄个玩玩呀呵呵,可以的。

結果