引言

你在南方的艳阳里大雪纷飞,我在北方的寒夜里四季如春

马頔的这句歌词,道尽南方人过冬的艰辛。在没有暖气的南方,过冬基本靠抖腿和一身正气

我们以高中诗词鉴赏的套路来剖析下词作,“你在南方的艳阳里大雪纷飞"当然不是直白地描述一场太阳雪,艺术要有含蓄美。这句话实际上说的是"你"在南方灯如暖阳的房间里,忘穿秋裤,冻得像雪地里呆呆的兔子(由此可见这个灯是白炽灯而不是节能灯,节能灯如白月光而不似暖阳)

如果你有兴趣深挖,会进一步坚定艳阳指的就是灯。小如洞穴的房间、灯与影子,不由让人想到柏拉图的洞穴理论,作者进而感慨现实世界的不真实性,于是有后边的"穷极一生做不完一场梦”

至于如果题目问"你"指的是谁,你最好不要答前女友,其他随意,以免勾起阅卷老师伤感的回忆,给你个悲伤的分数

在灯如暖阳床如霜的南方夜晚,你刚看完《汇编语言从入门到放弃》,准备起床关灯睡觉,却对被子依依不舍。这时你想:要是对着Siri说一声

嘿siri,宝宝困了帮我关灯么么哒

便可睡觉该是多美的场景

又或者 圣诞夜你和你的小女朋友在被窝里讨论拉普拉斯变换或是傅里叶变换,可窗帘没拉,灯太亮影响发挥。

嘿Siri关灯并闭上眼睛

让我们撸起袖子来实现它

思路

我不建议你给房间换一个智能灯泡,也不打算向你推销一套年底特价智能家居解决方案,我们延续之前的思路(用树莓派给家用电器加上智能),尽量用非入侵的方式来解决问题,不去破坏和替换现有的设备

于是我们就提出这样一个问题:如何在不改变现有灯泡特性、电路结构和开关特性的情况下,来关灯?

能想到的方案似乎只有模拟人手的动作,以机械的方式来按下开关

“舵机"就是我们的首选了

剩下的就是如何躺在床上控制舵机来关灯,与硬件世界打交道,树莓派是我偏好的工具。树莓派控制舵机不成问题,至于如何用手机控制树莓派,我也在此前的文章中论述过

不过本文将采用更酷的方式,你将无需编程,通过拖曳积木化的模块,就可以搭建出关灯机器人,然后通过siri控制这个机器人,如此一来你可以用自然语言的方式给siri发送关灯命令

这个方案拓展开,我们几乎可以控制所有的按键式开关

自然语言处理这部分Siri帮我们做了,之后有机会我们自己来实现,听起来有点像最近怒刷各种技术社区的Jarvis –扎尔伯格用人工智能控制家居的项目

准备工作

硬件部分

硬件部分包括:

  • 树莓派
  • 舵机
  • 长导线
  • 移动电源

组件不多,考虑到电灯开关的位置一般齐胸,而树莓派和移动电源(供电)放在地上,所以你需要三根长导线,而不是普通的杜邦线,和往常一样,长导线这种东西都是从万能的@李老师的万能的实验室里要来的,感谢@李老师一直以来的助攻

下边我们对各个部分做个简单介绍:

树莓派

关于树莓派,可以参考我此前的文章:树莓派折腾笔记之系统安装与配置.入门新手会遇到的问题我基本都列出了

我也翻译了一份树莓派(Raspberry Pi)资源大全中文版

供大家玩耍时参考

舵机

我买的是淘宝上的SG90 9g舵机,价格6块多,关于舵机的控制原理比较麻烦,李老师跟我描述过,我听个大概,不过不影响,去网上抄段程序修修改改,封装为黑盒函数基本能用,有空在细看这块

简单介绍下舵机上的几根线:

  • 红色:电压
  • 粽色:地线
  • 橙色:信号线

我把信号线接到18号引脚(BCM) ,查看gpio图:gpio readall

李老师

顺便也介绍些李老师.

  1. 李老师其实不是我的老师,我毕业后才认识他,我从李老师这边学到很多硬件知识,从传道解惑的角度来说,李老师确是我的老师

  2. 李老师南大博士毕业后,在大学执教,他博士阶段读的是图像识别,但他是个彻头彻尾的硬件黑客

  3. 李老师的实验室黑科技齐全,哆啦A梦口袋一般,有求必应

  4. 李老师常说的话有这样一种模式:“没事没事,xx功能的电子设备买不到也没事,我们自己画,等印刷完,你过来取”. 我们有个有趣的项目,硬件部分都是李老师画的

  5. 迄今 只有一次例外: 有一回李老师在论述分布式节点的连接策略时,我有点开小差,状态类似"一人虽听之 一心以为有鸿鹄将至 思援弓缴而射之”. 我突然想要一个无线开关来控制我那不够智能的油汀,以便于用树莓派控制它。而李老师也和往常一样,一边论述一边离题,岔到其他他感兴趣的话题:这回是关于如何把无线模块画得更小,当他兴致勃勃地分享这个灵光一现时,我不合时宜地提出说我想要一个无线开关,能不能用继电器、开关外壳和无线模块,外加画个板子集成它们,李老师以一种给你糖吃别打岔的样子,说这个淘宝上有卖的,app都自带的,你去买一个,抓包hack它就能编程了。于是李老师继续谈论他画板子的布线方案

  6. 李老师实验室的四轴飞行器,除了飞行器是自己做的,遥控手柄也是自己画的

大家感受一下

让我们想到那句感人的话

情之所钟,虽丑不嫌

感觉哪里不对 ……

组装硬件

硬件部分的组装很容易,直接上效果图

接下来让我们用双面胶把舵机贴到开关边上,舵机转动即可关灯

软件部分

按照一般的套路,此处应该从舵机的驱动程序写起,加上通讯模块,接着写一些胶水程序黏合它们,组成实现完整的功能

软件部分如开篇所说,这次我想试试不通过编程的方式来完成这个工作. 仅仅通过拖拽功能模块,我们就能拼出功能的机器人,这样可以让更多的人参与进来(当然包括哪些在玩王者荣耀的小学生)

我已经完成了积木式的控制平台,硬件驱动全部封装为积木块(让每个人实现一次硬件驱动未免无聊),拖曳即可,支持几乎完备的编程要素,可以实现丰富的功能

我们来拖曳模块完成任务,Siri的请求本身被我封装为模块

完成后,程序为:

至于对原理有兴趣的geek小伙伴,在之后的文章里,我们再来讲解细节实现,实际hack了Siri

效果演示

点击"运行程序",程序就会在树莓派中运行(开机自启),我们做个演示

自然语言

因为Siri本身具有处理自然语言的能力,我们可以用许多说法来关灯

todo

当前的自然语言处理(NLU)用得到了Siri,下一个版本想试试yige.ai,然后把它植入到微信中,这样可以跨平台使用它