This article also has an English version.
继续发存货。
在实验室养了三只仓鼠,琢磨着搞点有意思的事情。想到可以每日统计一下仓鼠跑轮的转动量和时间分布,然后推到微博上,应该还算有趣。
方案设计
想过几种方案:
光学摄像头:处理太耗CPU
在轮子上挖个洞,洞的两侧安装发射器和接收器:太麻烦且需对准
轮子上装微动开关:容易被仓鼠破坏且不好更换
后来搜传感器的时候看到了避障传感器,虽说是避障用的,但原理想想应该是依靠红外反射。而所有光学反射的强弱不仅和距离有关,还和反射面的性质有关。所以只需要检测转轮的面周期性变化就能拿到转动数据。
DIY
淘宝花了2块钱买了一个 3.7V 的避障传感器,用于接在树莓派上。
找了张银色的塑料纸贴上去,的确 work。但是贴纸不够光滑,在棱角处会导致信号有毛刺。
后来找了支黑色的白板笔,涂上一块。因为黑白对比度是要高于白色银色对比度的,所以可以得到较为稳定的数据。当传感器对准黑色部分时输出低电平,对准白色部分时输出高电平。一次高到低的跳变或低到高的跳变即对应转轮的一圈。
软件部分只需要检测传感器的输出端对应的 GPIO 口的电平。这里为了不拖累树莓派使用 Golang 编写,使用 GoBot 库简化信号处理。
当传感器信号传入时将其丢至带 buffer 的 channel ,避免长时间阻塞影响下一次信号传入。同时,在另一个 goroutine 中收集 channel 中的数据,并以一定时间间隔将收集到的数据写入数据库。
这里数据库使用对时间序列友好的 influxdb 。
可视化
到这里,轮子每转动一圈都会在数据库中写入一条时间戳。
而数据需要可视化和发布,才能友好地呈现出来。
这里使用 matplotlib 来做数据可视化,并在可视化后保存图片然后调用微博接口发布。
欢迎关注我的仓鼠们: https://weibo.com/cangshucangshu
完整代码见: https://github.com/ihciah/HamsterRunning
不幸的消息(2018/10/24):