Arduino助力“跳一跳”
2018-05-02裘炯涛谢作如
裘炯涛 谢作如
2017年岁末,最热门的游戏莫过于微信的“跳一跳”了(如图1)。游戏的规则很简单,游戏中的小人要从一个方块跳到下一个方块上,玩家通过按压屏幕时间的长短来控制这个小人跳跃的距离,确保每次都能让小人落到下一个方块上,如能跳到方块正中心还会有额外加分。
元旦假期,笔者也尝试挑战了这个游戏,但是屡试屡败,得分很少能超过五十分。看着朋友圈里的好友都能跳到两三百分,笔者深觉自己有点笨手笨脚。作为学校的创客教育导师,稍作思考后,笔者就准备利用Arduino来挑战“跳一跳”高分榜。
游戏分析
在“跳一跳”游戏中,小人要从当前方块跳跃到下一个方块的关键是控制跳跃距离。玩家通过按压屏幕蓄力,按压越久,蓄力越多,跳得也就越远。经过测试后,笔者发现按压时间长短和跳跃距离呈线性关系。要获得游戏高分,得设计一个可以替代人的手指,并能够精确控制按压屏幕时间的小装置,也就是常说的“物理外挂”。
解决方案设计
人可以区分1秒与2秒的时间差,而区分10毫秒与20毫秒却很难,但是用Arduino之类的单片机来实现精确控制就很容易。看了看创客空间的设备,笔者设置了一个大致的方案:
在舵机上绑定一支电容笔,用Arduino控制舵机按压屏幕,按压一定时间后抬起舵机,小人就可以跳到一定距离之外。而按压时间根据需要跳跃的距离来推算,跳跃距离可以用尺子测量,并用旋钮传感器将距离输入Arduino。Arduino将距离转化成对应的按压时间,最后用一个按钮来控制舵机执行这一按压动作,所需元件如图2所示。
步骤一:模拟手指
现在市面上的智能手机的屏幕绝大多数都是电容屏,电容触摸笔是专门为手机、平板电脑设计的触摸手写笔,使用触摸笔是最好的选择(如图3)。可以将电容笔固定在舵机臂上,用舵机带动电容笔按压手机屏幕。
电容笔是最理想的选择,但是手头如果没有电容笔,还可以用导电铜箔或者导电胶布来代替。导电铜箔具有良好的导电性(如下页图4),将导电铜箔一端固定在舵机上,导电铜箔另一端与手指接触。在舵机带动下用铜箔按压手机屏幕,通过导电铜箔的连接,相当于手指按压了屏幕。
步骤二:搭建结构
笔者找了个纸盒做这一装置的平台,盒子上面放了各种元件,Arduino等可以放在盒子中间,尽量让这个“外挂”看起来比较像个作品,命名为“跳一跳游戏盒子”。
先将手机放在纸盒中间,确定各元件安装位置(如图5)。
将LCD1602显示屏倒扣在纸盒上,用铅笔沿着显示屏画出轮廓(如图6)。
将LCD1602显示屏和旋钮传感器安装在孔位中,并用热熔胶进行固定(如图7)。
在舵机安装前,先垫高约1厘米的纸板,将舵机安装位置提高到与手机屏幕齐平的高度。然后用热熔胶将舵机固定在纸板上,将舵机臂安装到舵机上,由于舵机的塑料臂比较短,可以使用长约6厘米的雪糕棍进行延长(如图8)。
在雪糕棍上安装一个竖直向下的竹签,竹签末端安装一个水平2厘米左右的雪糕棍,用于模拟手指,雪糕棍表面要正好能触碰到手机屏幕(如图9)。
在雪糕棍上缠绕导电铜箔,为了保证导电铜箔能与手机屏幕充分接触,可以将接触面做大且压平,然后将导电铜箔引出15厘米左右,用于跟人手指接触(如下页图10)。
用一只手抓住导电铜箔一端,让模拟手指去接触手机屏幕,观察是否有反应。如果有反应说明模拟手指能实现功能,如果触摸效果不佳,检查导电铜箔是否缠绕牢固,接触面是否够大。
步骤三:电路连接
将各元件连接到主控板对应管脚,传感器与管脚对应关系如下页表1所示。
将主控板安装在纸盒内部,并连接好各元件,用热熔胶将按钮固定在盒子侧面。主板的供电可以使用9V电池,也可以在盒子侧面打孔,使用USB线连接到外部电源(如下页图11)。
步骤四:计算时间与距离的关系
我们虽然已经分析出按压时间越久,跳跃距离越大,但是并不知道两者之间的具体关系,这还需要通过编程来测试。
编写测试程序,当按钮按下后,舵机转动,带动模拟手指按压屏幕,并保持一定时间后弹回,程序如下页图12所示。
以小人身体的尾部作为起点,沿着两个方块边缘平行的方向测量,终点为下一个方块的中心点(如下页图13)。
根据测量出的距离先估计按压时间,然后将时间赋值给变量time,上传程序并跳跃,再测量出实际跳跃距离,经过几轮测试,得出表2数据。
将以上数据输入到Excel表格中,用表格中数据绘制散点图,并画出线性趋势线,得到按压时间与跳跃距离的关系式为distance=0.0517time-10.952,经转换time=(distance+10.952)/0.0517。注意:这个公式是根据笔者的5寸屏幕手机测得的数据,不同尺寸的手机测得数据不同,公式也会不同(如图14)。
步骤五:实现距离数据的输入
经过几轮游戏测试与测量,小人跳跃距离的范围在10mm~50mm之间。距离输入可以使用旋钮傳感器,旋钮传感器原本的输入范围是0~1023,而现在需要输入的距离为10mm~50mm,因此可以使用映射模块将数据范围进行转化,再利用LCD1602屏幕将跳跃距离和按压时间都实时显示出来,完整程序如下页图15所示。
游戏盒子的使用测试
“跳一跳游戏盒子”制作完成后,就可以进行使用测试了。在手机上启动游戏,并将手机放在盒子上,用尺子量出当前小人的位置到下一个方块中心点的距离。在盒子上用旋钮传感器调节跳跃距离,LCD1602上会显示跳跃距离及对应的按压时间,调节完成后按下起跳开关,舵机就会带着模拟手指转动,在屏幕上按压一定时间后抬起,小人完成了完美的一跳。利用这个装置,笔者成功地拿到了1000多分,高居朋友圈游戏排行榜的榜首。
小结
制作完成创客作品后,笔者把使用该盒子玩“跳一跳”游戏的视频发到了朋友圈。有人点赞,有人挑战,还有人说这是作弊,其实这个作品最重要的价值不是帮笔者拿到游戏高分,而是告诉更多的人:对于一些有规律、重复性强的工作,机器比人类更专业,可以比人类做得更好。不是吗?紧跟笔者发布这个作品的前后,好多工程师都发布类似的“物理外挂”,大疆工程师甚至用摄像头来做视角识别,让更多的人知道了人工智能并不遥远,而是“近在身边”。
2017年被媒体誉为“人工智能”元年。在这一年里,我们不断看到机器在越来越多的领域战胜了人类。毋庸置疑,在接下来的时间里,机器将更深入、更全面进地入人们的生活。未来已来,中小学教育亟待改革,让我们从创客教育开始做起吧!