入门小脑洞(五):玩点硬的!



  • 前面四篇小脑洞已经让我们对 Node-RED 有了一个大体的了解。
    但是,它设计的初衷根!本!不!是!为了完成前面那些事,这位骚年做着更犀利的梦!
    这一篇就来直指其内心,为什么他们说这是 Internet of Things 世界的新宠?

    先贴上制作好的 app 地址:
    界面:http://public-tutorial.goiot.cc/ui/#/1
    流程:https://goiot.cc/public/tutorial (硬件 标签页)

    1. 硬件,新时代的性感尤物


    如果你是一位 Geek 或是 Maker 亦或是 Hacker,Arduino 对你而言一定不陌生。自数年以前异军突起以来,成长依托于开源硬件和开源软件,现如今已成为叱咤风云,撑起业界半边天的硬件标准和软件框架。
    如果 Go.IoT 携手 Node-RED 跟 Arduino 都能愉快地玩耍起来,那其他硬东西自然不在话下了,当然也包括了你熟知的另外一个硬货 Raspberry Pi (树莓派)

    2. 勾搭尤物,需要一种网络协议


    为了起到抛砖引玉的效果,这里我们只讨论互联网协议,暂不讨论例如蓝牙、ZigBee等等非互联网通信协议,因为当你玩转了其中一种,其它的便可信手拈来,因为前辈们已经帮我们造好了足够多的轮子。
    好了我们来看看现如今主流的应用层协议:

    • HTTP 最常见的客户端<->服务端协议,比如获取一个网页,更新一个状态等等。单向通信。
    • WebSocket 为更高级的交互模式而生,常用于服务器后台和前端的数据同步。实时双向通信。
    • MQTT 最近几年火起来的,也是我认为目前最自由的一种协议。实时群组多向通信。

    当然还有其它很多种协议略去了,这里面没有好坏优劣之分,只有谁更适合谁。
    但我没讲性格不合这一说啊,至多性别不合罢了……

    这一篇小脑洞也使用了 MQTT 这个变态的协议来勾搭硬件尤物们,因为它特别适用于物联网诸多场景。

    3. 让硬件在一起聊天


    那我们为什么把 MQTT 引进到入门小脑洞?因为它真的特别简单,就像开聊天室一样。
    网上找了一圈没找到简单的介绍,来看看这个图吧:

    mqtt-theory

    终端皆用绿色标识,表明他们的角色可以任意调换,谁都可以当发布者,也可以同时当订阅者,既能发布订阅一个话题,也能同时发布订阅多个话题
    这些终端既可以是人,也可以是物,甚至整个聊天室里没有一个活人,全是物。
    怎么样,有点物联网的意思了吧?

    跑题完毕,开聊!

    4. 把 Arduino 的 MQTT 库用起来


    说好的,前辈造好了很多轮子,我们只管用。省去了90%功夫。
    就是这个库了:PubSubClient by Nick O'Leary
    😱 啊,这个作者,竟然和 Node-RED 的作者,是同一个人!
    刹那间感觉被忽悠了,原来他们都是一伙的!

    也罢,事已至此,生米果然已煮成熟饭,只能上车补票了。逃💨

    来看看硬件怎么发布订阅吧。
    简单起见,关于 Arduino 的使用方法种种这里就不再赘述。

    首先你得有能联网的 Arduino,比如以下的都能玩:

    • Arduino Ethernet
    • Arduino Ethernet Shield
    • Arduino YUN
    • Arduino WiFi Shield
    • Sparkfun WiFly Shield – library
    • TI CC3000 WiFi - library
    • Intel Galileo/Edison
    • ESP8266
    • Neurite - 这条是我加的,怎么着也得宣传下自家货不是?实际就是一个 ESP8266 模块没别的东西,运行了支持Arduino库的固件在上面,后面的实际操作也用它来做范例了。

    以ESP8266为例,参考这个示例代码,就可以和服务器那头的隔壁老王通信了。

    硬件部分的MQTT客户端代码很简单,大致如下:
    在连好 WiFi 或者 Ethernet 之后(该过程超出本文讨论范畴因此在这里也不赘述了)

    #include <PubSubClient.h>
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
    const char *mqtt_server = "linkgo.io";
    
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
    

    需要提到的是mqtt_server这里设为了linkgo.io:1883,这是我们的一个开放的MQTT服务器,2015年伊始勤勤恳恳运行至今。如若不嫌弃,便请君试用。
    callback 则是订阅的话题有新消息的时候的回调。

    client.publish("/chatroom", "我虾扯蛋");
    client.subscribe("/bedroom");
    

    这样就发布了我虾扯蛋这条消息到/chatroom这个话题,订阅这个话题的所有人都会收到。
    当然,订阅/#这个特殊话题的隔壁老王也会收到。(#是一个通配符,匹配所有话题

    5. 是时候让 Go.IoT 施展一下了


    这里我们设计两个最简单的场景。

    • 监听一个按钮按下的事件,并关联显示到一个图表上。
    • 用一个滑动条输入,来控制一个舵机(数值范围 60 ~ 120 代表转动角度)。

    这样我们就有了输入输出两种示例,一阴之谓道,构造万物的基本家伙事儿已经齐了。

    5.1 按钮 - 硬件

    它长成这副模样,用一个 cherry 青轴按键加上一个 neurite WiFi 模块做成:

    功能特别简单,按下按键的时候通过 neurite 使用前面提到的MQTT库向话题/neuro/chatroom发布消息egg pain!(字符串)。
    固件代码在这里(neurite-button分支)

    番外:为什么是 egg pain?这里有一个小故事,不感兴趣的童鞋直接跳过。

    linkgo.io 团队在开发 Go.IoT 的时候,攻城狮经常在工作间隙,苦思冥想之际,挠破头皮、敲击桌面,现蛋疼状。
    于是我们就想啊,这可不行,总是这样岂不是因为工作遇阻?我们得定期来集会讨论一下,好互相排忧解难。
    定个什么期呢?
    我们来做一个蛋疼计吧!人手一个按钮,一有蛋疼就噼噼啪啪地按就是了。
    而在服务器上,我们设计了一点简单的计算逻辑,有人按键的时候,就把总次数+1。
    在另一头,挂了一个led灯柱在白板上,实时显示这个数值,由服务器控制。
    当这个灯柱亮满的时候,就是我们应该停下来,聊一聊大家为什么这么蛋疼了。囧 😳
    如此,通过 Node-RED,我们把一票不相干的硬件,通过云端的逻辑关联起来了。

    5.2 按钮 - 流程

    input 类目里的 mqtt 节点拖出来作订阅消息用,填写好配置。
    使用 linkgo.io:1883 作为 MQTT 服务器,订阅 /neuro/chatroom

    这里你看到 debug 节点里有消息出来,正是因为我按下了按钮。
    好的,我们来把流程补全:

    我们首先把mqtt出来消息分流一下,只有包含egg pain的消息才是我们要的按钮事件。
    然后把次数存起来,再送给显示。

    为了更客观地看到操作,我们用手机打开这个UI,这个范例的UI地址是
    http://public-tutorial.goiot.cc/ui
    视频:mqtt-button-press.mp4
    截图

    5.3 舵机 - 硬件

    这就是一只最普通的“剁鸡”,不过有房住,而且连上了 neurite

    同样,它也只做一件事并且争取做到最好,就是订阅话题/neuro/chatroom,过滤出servo: 角度这样的消息,然后依此角度执行动作。
    固件代码在这里(neurite-servo分支)

    5.4 舵机 - 流程

    我们使用:

    • 滑动输入条 - 数值范围 60~120,代表舵机臂的转动角度
    • function节点 - 用于生成消息字符串,格式 servo: 角度
    • 显示当前角度的UI节点
    • output类目中的 mqtt 输出节点,服务器同样配置为 linkgo.io:1883,话题/neuro/chatroom

    配置完成以后点击Deploy完成部署上线。

    这就可以玩起来了 😄
    视频:mqtt-servo-move.mp4
    截图

    6. 板砖扔完了,玉呢?

    好了,连接世界的两个端口都在这里,一个输入(按钮),一个输出(剁鸡),用这1和0就可以实(bai)现(ri)理(zuo)想(meng),完成大业了!

    留一个小小的问题,如果我们想在这个按钮的按下的时候,让舵机去执行动作,应该怎么来设计呢?这两个物件可是毫无关联呢~

    ps: 界面上的滑动条不要随便动哦,我桌上的剁鸡真的会动的!


    上一篇:入门小脑洞(四):我们喜欢的 Markdown - 安装新 node
    下一篇:入门小脑洞(六):?


  • Amateur

    期待这部分的答案



  • @wangxh 本周以内会更新此帖 😊



  • 纯手敲,错别字难免,见谅了 😂



Looks like your connection to NodeBB was lost, please wait while we try to reconnect.