Arduino 助力“跳一跳”

杭州经济技术开发区听涛小学 裘炯涛
温州中学 谢作如
微信朋友圈已经成为了现代人们社交的重要的场合,2017年末的朋友圈被一个简单的小游戏占领。在2017年12月29日更新的最新版微信中,增加了一个名为“跳一跳”的小游戏。
游戏的规则很简单,游戏中的小人要从一个方块跳到下一个方块上,玩家通过按压屏幕时间的长短来控制这个小人跳跃的距离。玩家需要每次都能让小人落在下一个方块上,如果每次都能跳到正中心还会有额外加分。
元旦假期,我也尝试去挑战这个游戏,但是屡试屡败,得分很少能超过50分。看着朋友圈里的好友都能跳到两三百分,我深深怀疑自己的笨手笨脚。稍作思考后,我准备利用Arduino挑战“跳一跳”高分榜。


图 1微信“跳一跳”小游戏

游戏分析

在游戏中,小人要从当前方块跳跃到下一个方块,玩家通过按压屏幕蓄力,按压越久,蓄力越多,跳得也就越远。

策略分析

经过分析,跳一跳的关键在于要精确控制手指按压屏幕的时间。人们可以区分1秒与2秒的时间差,但是10毫秒与20毫秒的区别,人就很难区分了。然而,机器却可以做到对时间的精确控制。
我打算利用Arduino控制舵机按压屏幕,按压一定时间后抬起舵机,小人就可以跳到一定距离之外。而按压时间根据需要跳跃的距离来推算,跳跃距离可以用尺子测量,并用旋钮传感器将距离输入Arduino。Arduino将距离转化成对应的按压时间,最后用一个按钮来控制舵机执行按压动作。


图 2所需元件

难点解决1:模拟手指

现在市面上的智能手机的屏幕绝大多数都是电容屏,一般来说需要用手指触摸才能有效,而普通的笔、木棒等并不能触控屏幕。那么可以使用哪些材料来代替手指呢?
电容触摸笔是专门为手机、平板电脑设计的触摸手写笔,使用触摸笔是最好的选择,如图 3所示。可以将电容笔固定在舵机臂上,用舵机带动电容笔按压手机屏幕。

图 3电容触摸笔

电容笔当然是最理想的选择,但是手头如果没有电容笔,还可以用导电铜箔或者导电胶布来代替。导电铜箔具有良好的导电性,将导电铜箔一端固定在舵机上,导电铜箔另一端与手指接触。在舵机带动下用铜箔按压手机屏幕,通过导电铜箔的连接,相当于手指按压了屏幕。
图 4导电铜箔

搭建结构

利用T1飞机盒做框架,搭建游戏盒子。先将手机放在纸盒中间,确定各元件安装位置,如图 5所示。


图 5元件安装位置

将LCD1602显示屏倒扣在纸盒上,用铅笔沿着显示屏画出轮廓,如图 6所示。


图 6画出元件轮廓

将LCD1602显示屏和旋钮传感器安装在孔位中,并用热熔胶进行固定,如图 7所示。
图 7安装显示屏和旋钮传感器

在舵机安装前,先垫高约1厘米的纸板,将舵机安装位置提高到与手机屏幕齐平的高度。然后用热熔胶将舵机固定在纸板上,将舵机臂安装到舵机上,由于舵机的塑料臂比较短,可以使用长约6厘米的雪糕棍进行延长,如图 8所示。


图 8安装舵机臂

在雪糕棍上安装一个竖直向下的竹签,竹签末端安装一个水平的2厘米左右的雪糕棍,用于模拟手指,雪糕棍表面要正好能触碰到手机屏幕,如图 9所示。
图 9安装模拟手指

在雪糕棍上缠绕导电铜箔,为了保证导电铜箔能与手机屏幕能充分接触,可以将接触面做大且压平。然后将导电铜箔引出15厘米左右,用于跟人手指接触,如图 10所示。
图 10缠绕导电铜箔

用一只手抓住导电铜箔一段,让模拟手指去接触手机屏幕,观察是否有反应。如果有反应说明模拟手指能实现功能,如果触摸效果不佳,检查导电铜箔是否缠绕牢固,接触面是否够大。

电路连接

将各元件连接到主控板对应管脚,传感器与管脚对应关系如表 1所示。
表 1传感器与管脚关系表

传感器 按钮传感器 舵机 旋钮传感器 LCD1602显示屏
管脚 D2 D8 A0 IIC

将主控板安装在纸盒内部,并连接好各元件,用热熔胶将按钮固定在盒子侧面。主板的供电可以使用9V电池,也可以在盒子侧面打孔,使用USB线连接到外部电源,如图 11所示。


图 11电路连接

难点解决:时间与距离的关系

之前我们定性地分析出按压时间越久,跳跃距离越大,但是并不知道两者之间的具体关系。
编写测试程序,当按钮按下后,舵机转动,带动模拟手指按压屏幕,并保持一定时间后弹回,程序如图 12所示。

图 12测试程序

以小人身体的尾部作为起点,沿着两个方块边缘平行的方向测量,终点为下一个方块的中心点,如图 13所示。


图 13测量距离

根据测量出的距离先估计按压时间,然后将时间赋值给变量time,上传程序并跳跃。再测量出实际跳跃距离,经过几轮测试,得出表 2数据。
表 2 按压时间与条约距离关系表

按压时间(time) 跳跃距离(distance)
500ms 15mm
600ms 20mm
700ms 25mm
800ms 30mm
900ms 37mm
1000ms 40mm

将以上数据输入到excel表格中,用表格中数据绘制散点图,并画出线性趋势线,得到按压时间与跳跃距离的关系式为distance=0.0517time-10.952,经转换time=(distance+10.952)/0.0517。[1]

图 14按压时间与跳跃距离关系图

难点解决:距离输入

经过几轮游戏测试与测量,小人跳跃距离的范围在10mm-50mm之间。距离输入可以使用旋钮传感器,旋钮传感器原本的输入范围是0-1023,而现在需要输入的距离为10-50mm,因此可以使用映射模块将数据范围进行转化。再利用LCD1602屏幕将跳跃距离和按压时间都实时显示出来,完整程序如图 15所示。


图 15“跳一跳”游戏盒完整程序

使用测试

游戏盒子制作完成后,就可以进行使用测试了。在手机上启动游戏,并将手机放在盒子上,用尺子量出当前小人的位置到下一个方块中心点的距离。在盒子上用旋钮传感器调节跳跃距离,LCD1602上会显示跳跃距离及对应的按压时间,调节完成后按下起跳开关,舵机就会带着模拟手指转动,在屏幕上按压一定时间后抬起,小人完成完美一跳。

小结

制作完成这个盒子后,我将使用该盒子玩“跳一跳”游戏的视频发到了朋友圈,有人给我点赞,也有人向我挑战,还有人说这是作弊。我觉得,这个作品再一次告诉我们,对于一些有规律的、重复性强的工作,机器比我们人类更加专业,可以比我们做得更好。2017年,可以说是“人工智能”元年,在这一年里,我们发现机器在越来越多的领域战胜了人类。毋庸置疑,在接下来的时间里,机器将更加深入全面进入人们的生活。


[1] 该公式是根据5寸屏幕测得的数据,不同尺寸的手机测得数据不同,公式也会不同。

你可能感兴趣的:(Arduino 助力“跳一跳”)