看到网上有一个《程序员是如何玩Chrome断网小恐龙游戏》的视频,也有人称之为《基于光电感知的危险预判和主动避障系统的开发与实践》。看完觉得也可以拿Arduino做一个。

小恐龙游戏的玩法

首先是选择合适的传感器和驱动设备,考虑的传感器包括光敏传感器、寻迹传感器、颜色传感器,考虑的驱动设备包括步进电机和伺服电机。

要识别小恐龙游戏中的仙人掌,其灵敏度从高到底依次是光敏传感器、寻迹传感器和颜色传感器,所以传感器选择光敏传感器。

步进电机和伺服电机都可以根据电脉冲(高电频)旋转一定角度,区别是步进电机受限于电机类型,每个电脉冲只能旋转固定角度,比如我手里的四相步进电机,每转1°需要发送32个脉冲信号,旋转速度非常慢,所以不适用。而伺服电机(也叫舵机)可以根据电脉冲精准的旋转0~180°的角度,精度和速度都比步进电机强,所以驱动设备选择伺服电机。

传感器和驱动设备选定后,根据其原理就可以设计程序和调试了:光敏传感器识别小恐龙游戏的障碍(仙人掌、翼龙),电阻增大,驱动伺服电机旋转敲击空格。基于我笔记本外形、伺服电机摆放位置和方式,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <Servo.h>

const int photocellPin = A0;
int outputValue = 0;
Servo servo;

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
servo.attach(9);
servo.write(10);
}

void loop() {
outputValue = analogRead(photocellPin);
Serial.println(outputValue);
if (outputValue >= 375)
{
servo.write(20);
}
else
{
servo.write(10);
}
}

因为要尽可能快地按下空格,所以初始状态伺服电机旋转角度调整其单臂刚好碰到空格,传感器识别到仙人掌或翼龙时,电阻增加到375Ω以上,伺服电机旋转至20°按下空格,电阻降低时转回10°松开空格。

最后调整传感器在屏幕上粘贴位置,就完成了。

原视频拆掉了光敏传感器的电路板,所以没有电路板LED发出的蓝光,体积也小很多。因为笔记本电容键盘的缘故,按下空格较吃力,所以得拿手摁着伺服电机不让它晃动。之所以关灯,是因为光敏电阻会受其他光源影响,开灯会让它无法识别到小的仙人掌。

另外,这个沙雕玩法并不会比手动玩分数高,因为光敏传感器只能识别屏幕上单点高度的仙人掌或翼龙,飞的高的翼龙无法识别,且游戏到一定分后游戏里的天会黑,上面的程序并没有考虑这种情况。