Ruff 官网:https://ruff.io
Ruff 是一个支持 JavaScript 开发应用的物联网操作系统。
Ruff是一款基于JavaScript的物联网开发套件。我来评价的话,就觉得Ruff对新手小白很友好。它对硬件进行了抽象,使用了基于事件驱动、异步 I/O 的模型,使硬件开发变得轻量而且高效。
第一次碰巧撞见Ruff是在2016年10月的复旦大学HACKxFDU创客马拉松。那时候我大概也才Arduino刚刚入门,硬件懂一点点,接线就算了吧,没有教程怎么都搞不懂……但是当时就我和队友两个高中生,有一点懵逼。
不过正因为这个原因,我拿到Ruff的时候就觉得,这个命令简直拯救沧桑:
rap layout --visual
这个等会儿再说,我先说说都做了啥。
但是要实时的数据反馈的话,总不能用数据线连着Arduino装在无人机上面飞来飞去吧……本来都放弃做无人机相关的开发了,不过队长发现Ruff可以很好替代Arduino。板载WiFi热点可以说是相当合我们意。
所以左边这张照片看到的是当时拿到的颜值相当高的Ruff的盒子。作为半吊子设计师来说,我还是相当喜欢的。
然后这右边的就是Ruff的板子了,大概是Arduino的两倍那么大,比树莓派也还稍微大一点,但还是相当方便的,不虚。
跟着官方教程走的话,所有步骤都还是蛮简单的,官方教程的话可以在这里找到:起步走
不过首先要下载Ruff的SDK。在这里可以找到:Ruff SDK 根据自己电脑的版本和OS来选就行了。
然后在命令行里面输入一下这个命令,确保该装的都搞定了:
rap --version
我当时没跟着官方教程做“Hello Ruff”的项目,但感兴趣的可以在上面的教程链接里面找到。
当时用到的是温湿度,光亮,大按钮,和蜂鸣器几个设备,所以最先做的是把几个设备的模块从命令行中加入到自己在做的项目(文件夹)中:
rap device add button rap device add humirature rap device add lightsensor rap device add buzzer
rap是Ruff软件包的一个管理器,所有关于上面用到的几个模块的具体信息都可以在Ruff的软件包仓库里面找到。
选了这些模块的最新版本就可以接着走了。当然也可以跟着官方的一些示例走。
rap
会根据选择自动下载驱动。
有没有相当方便?
啊不过我其实当时相当困惑,接线怎么办?读了代码之后感觉好像有什么东西能让程序只要通过$("DEVICE_NAME")
就能识别并调动板子上面的设备。我就不太懂,那我设备随便接也行?
不过其实还是我智障了,漏看了这一段:
添加完外设后,我们需要重新对硬件进行布局(layout)和连接。在应用目录中执行如下命令:
rap layout
rap
会对外设需要的资源进行自动分配,计算出设备间的连接方式。
然后这个就是拯救沧桑(小白)的命令了:
rap layout --visual
来来来看一眼通过这个命令打开的页面:
照着这个图来接线就差不多可以了,不过也可以自定义接线,在页面上拖拽板子上线条连接的小白点到其他地方连接上就可以了。总之对于当时的我来说真的就是拯救沧桑,不过现在好多了,又打了四场创客马拉松之后现在也有第二名的小成就了,接线姑且还算是过关了吧。
以上差不多就是硬件这边所有的内容了,下面把代码放放。
以下的代码是/src/index.js
的,总体来说是相当简单易懂的:
'use strict'; $.ready(function (error) { if (error) { console.log(error); return; } console.log('Welcome!'); //Get temperature data if available setInterval(function () { $('#humirature').getTemperature(function (error, temperature) { if (error) { console.error(error); return; } console.log('temperature', temperature); }); }, 1000); //Get humidity data if available setInterval(function (){ $('#humirature').getRelativeHumidity(function (error, humidity) { if (error) { console.error(error); return; } console.log('humidity', humidity); }); }, 1000) //Get illuminance data if available setInterval(function (){ $('#lightsensor').getIlluminance(function(err, value){ console.log(value); console.log('LIGHT:' + value); }); }, 1000) //If the button is pressed, make the buzzer beep $('#button').on('push', function (){ beep(); console.log('turned on'); }); //Stop beeping if the button is released $('#button').on('release', function (){ stopBeeping(); console.log('turned off'); }); }); //Beep only once function shortBeep(){ beee(); stopBeee(); } //Start beeping function beep(){ $('#buzzer').turnOn(function (error) { if (error) { console.error(error); return; }}); console.log('Beep'); } //Stop beeping function stopBeeping(){ $('#buzzer').turnOff(function (error) { if (error) { console.error(error); return; }}); console.log('Stop beeping'); }
接下来部署代码,Ruff接上电源之后,在电脑上连上Ruff的热点,连到一个名字为Ruff_[板子序列号]
的热点就行了。接着就用rap deploy -s
就可以部署代码了,不过现在应该是一定要用rap deploy 192.168.78.1
才行了。反正试一次几秒钟的事,两种方法都试试不会错的。接着用以下命令行启动就行了:
rap start
我代码里面用了console.log()
来查看一些传感器的回馈,所以以下命令行很方便:
rap log
左边就是terminal里面一些当时我的传感器的回馈,无视日期就行了,当时我电脑时间有点问题,没有在时间旅行……
不过,如果你会更喜欢一些颜值比较高的用户平台的话,可以试试这个,Ruff另一个用起来我很喜欢的特点,就是这个用户平台。连接到板子的热点之后在浏览器里面输入这个IP就行了192.168.78.1
,然后你就会看到这样一个界面:
点击Start
就能开始程序,下面出现的就是应用日志了。我个人还是比较喜欢用terminal的所以这个界面其实不常用。
这里是我们最后创客马拉松产品的样子。整个项目其实是一个用了无人机来检测并预防早期的森林山火的系统。它用了大疆无人机的摄像头每隔十秒传回一张图片,并用Clarifai的API去识别图内任何和火相关词汇的匹配度。
和其他我们装在无人机上面的传感器和在一起,我们可以比较好地区估计一块区域有火苗/火焰出现的可能性,有的话程序会去通知人类,那么由我们去人工确认山火是否阳性,是的话就借助无人机的机动性四处通知周围人员,如此一来就不用人力监控森林山火,耗时耗力,总体来说是一个便宜不少的解决方案。
无人机也比其他的监测系统来得要灵活的多,比如说卫星,所以在通知周围人员这个例子上,无人机可以很好地在火源周围做广播。而因为森林火灾如果扩大,会在财产以及人员上会造成极大的损失,所以总体我们还是对自己的提出的解决方案挺满意的,而Ruff在我们快速制作产品原型的过程中则是帮了大忙。
不过说到底这是一个创客马拉松的项目,所以还是要提到比赛结果的,我们最后进了决赛成了前九,六十个大学队伍里面唯一的只有两个人的高中队伍,作为第一次创客马拉松,还是不错的成绩,同时我们还获得了大疆企业创新奖,拿了个Osmo,总体还是相当开心的。
关于我们的项目信息,更多的在GitHub上,虽然我不确定你在看到这个的时候我们有没有把这个项目变成Public的,如果你想了解更多或是有疑问的话,我的Email是[email protected]。
Ruff不是所有设备都有驱动的,但是驱动是可以自己写的,官方也有教程。
上手相当简单
容易上瘾
就这次创客马拉松来说我觉得比树莓派方便一点,感觉有一点点像Arduino和树莓派的结合,当然树莓派有其它好处
颜值很高
有两个设备的ID印刷的和软件包仓库里面的不一样,温湿度是DHT11
,但是设备上印刷的是DH11
。大按钮是CK002
,但是设备上印刷的是CK-002
,所以当时花了点时间去确定。
小贴士:以上这个问题可以通过查询软件包仓库来解决。