机器人做好了,没钱买礼物,于是我憋了几句酸词
因为要搬家的缘故,所以十周年的惊喜只好提前上线,本次更新主要是修复上个版本遗留的一些问题,虽然它没有达到我理想的状态,但是却圆满地完成了安排给它的任务。
![十周年](https://pic1.zhimg.com/v2-14855933b3e1f094c1179a7be72102dd_1440w.jpg)
致敬西部世界
之前画的控制界面只能通过四个按键来控制前进、后退、左转弯和右转弯,无法实现向右后退或向左后退,这个功能在狭小空间转弯时是非常有用的,但要实现这样的功能就需要调整控制界面的布局,把控制按键独立分开,就像玩吃鸡游戏时开载具一样。正好那段时间西部世界第四季马上要上映,于是我从前三季的部分剧集中截取了一些可以参考的界面,花了一天的时间制作了一个新的操作界面,这里面最麻烦的部分是科幻剧科幻电影中都喜欢用的斜边按钮和斜边边框。我很喜欢西部世界这部剧,尤其是第一季,在我做出一个真正的机器人之前,我只能先通过制作一个操控界面的方式来向这部剧致敬了。
![旧的操作界面](https://pic3.zhimg.com/80/v2-cc0f392701d242dc823133bce7a2f342_720w.jpg)
转向
原本的轮子可能为了更强的抓地力,胎壁很薄,没有什么支撑力,稍微用力往下压,轮胎就瘪了,相比原来的小车,机器人重量增加了许多,转向的时候轮胎的摩擦力也就增加了许多,而且原本小车的每次转向都是把方向打死,电机断电后通过弹簧来将方向回正,所以机器人增重后,轮胎增加的摩擦力加上弹簧的弹力导致 130 电机使用的 3.25:1 减速比对转向操作变得力不从心。
本来我是想通过提高减速比来增大扭矩完成转型操作,但是这需要重新布局电机和齿轮,而且对结构的精度要求比较高,误差稍微大点就可能导致齿轮就无法正常咬合,我手上的工具和材料没法保证这个精度要求,所以我直接使用一个 MG946R 舵机来负责转向操作,同时在轮胎内填充泡沫增加支撑力,以减少转向的摩擦力。舵机除了增加输出扭矩外,还可以根据需要精确控制转向角度。
感觉舵机的安装和固定是这个项目最麻烦的地方了,舵机牵动转向轮的同时也会受到反作用力,如果使用轧带或者胶水固定,则转向的角度会随着舵机的位移变得非常不精确,甚至可能根本无法完成转向。最开始我是从亚克力板上裁下一小块固定的零件,通过螺丝固定在地盘上,然后在使用螺丝将舵机固定在这个零件上,但是当我使用螺丝将零件固定在地盘上时,螺丝孔一拧就裂开了,后来我找来一个废旧的无线路由器,使用路由器的外壳裁出来的零件就没有再出现开裂的情况。可能是因为手裁的原因,这个过程很耗时,首先是从大块塑料板上裁下来,然后就是不停地削切使得零件的尺寸可以刚好卡住舵机。所以说工欲善其事必先利其器,以后还是要使用一些更专业的工具。
仪式感
当我向朋友聊起这个项目的时候,朋友的第一反应就是问我打开舱盖后礼物是不是会从舱内被慢慢推举出来,我知道这样会显得更有仪式感,先前也考虑过实现这个功能,但是增加这个功能无疑是会影响到项目的如期交付,后来考虑到我这个项目本身就是为了仪式感而存在的,所以这个功能还是十分重要。我参考了网上一个升降台的视频,把它改造成通过舵机来实现升降,实现也还算简单的,最大的问题还是出在精度上,导致平台升起来后有一边稍微高一点点,但是瑕不掩瑜,还算勉强能用。
通讯
为了优化通讯,上个版本每个消息只发送一个数字(消息内容,不包含主题),Arduino 程序读取 Socket.IO 客户端接受到的文本消息中指定位置的字符(消息内容),使用 int 接收得到字符对应的 ASCII 十进制数字,然后按位读取数字并设置对应的 IO 口,这样通过发送一个数字消息就能够完成大部分操作。但是字符 0-9 对应的 ASCII 码二进制数并不是都刚好能够和使用的 IO 口对应上,所以有些命令只能通过 if 判断替换成别的数,这在使用的 IO 口少,指令少的时候可以这么偷懒,但是指令多的时候一堆 if 判断就不方便维护了。新的版本修改成传输两位数字,Arduino 程序截取消息中数字部分转换成整形后像之前按位读取并设置 IO 口的高低电平。其实还可以通过 WebRTC 来发送消息,这样消息还不需要经过服务端,只是需要花点时间研究下怎么在 NodeMCU 上实现 WebRTC,或者从手机浏览器发消息到 NodeMCU,又或者通过串口通讯,不过这又是下个版本的故事了。
项目上线
那天因为提前知道她晚上要和朋友聚会,所以一下班就往地铁站冲,想要在她回家前把“惊喜”准备好。到家后就马不停蹄地开始组装“惊喜”,像组装火箭一样麻烦的问题还没有解决,所以还是花了一些功夫把它组装好,组装好后就在开始在客厅调试,从哪驶到哪里,执行什么命令,一遍遍彩排,希望她一进门看见地都是最完美的状态。
过了她说要回来的时间了她还是没回来,因为前一天晚上没有充电,刚才一遍遍地调试已经把电量耗得差不多了,我能感觉到它转弯的时候没什么劲了,于是发微信问她几点回,她说十点回,于是赶紧把“惊喜”拆了(电池在最下面),把电池取出来充电,充了半个多小时就又赶紧组装回去,最后又模拟了一遍。
十点过几分,我听到开门的声音,知道是她们回来了,我躲到房间里把机器人开出去,她一眼就看到了,和我女儿说:“快看,爸爸的机器人做好了”,还没等我做其它操作,她鞋都没脱就往洗手间冲,她进了洗手间我赶紧出来把机器人移到她从洗手间一出来就能看到的地方,我女儿走过来开始围观,“爸爸,这是怎么玩的呀”,“咦,十周年?怎么有个十周年”,我说:“等一下你就知道了”,然后马上又躲厨房去了,估计我媳妇有听到我女儿说十周年,等她从洗手间才仔细打量这个小不点,这才发现这是为她准备的。
在此之前她觉得我多少有些“不务正业”,即不是在工作也不是在学习,更没有把时间花在孩子身上,对我应该还是有些怨言的,但自始至终都没有向我发泄一丁点不健康的情绪,当我把机器人驶到她面前向她展示憋了好几天的酸词时,她很感动,才明白我大半年熬夜整的玩意原来是为她准备的,因为要搬家了,当晚她和朋友出去聚会还喝了点酒,话也多了许多,她说这是她这辈子收到最贵重的礼物,我和她说以后还会有的。