HonestQiao 发表于 2022-10-1 10:13

【米尔MYC-J1028X开发板试用】应用Node-RED将MYC-J1028X开发板变身为工业控制网关

本帖最后由 HonestQiao 于 2022-10-2 10:59 编辑

<p>这篇分享,内容较长,且涉及到的知识点较多,需要耐心阅读,下面为具体内容的目录:</p>

<ul>
        <li><strong>零:前言</strong></li>
        <li><strong>一、安装node-red</strong></li>
        <li><strong>二、系统命令控制LED</strong></li>
        <li><strong>三、LED权限设置</strong></li>
        <li><strong>四、Node-RED控制系统LED</strong></li>
        <li><strong>五、系统命令控制GPIO</strong></li>
        <li><strong>六、Node-RED控制GPIO</strong></li>
        <li><strong>七、开发板上的S3按键使用</strong></li>
        <li><strong>八、在Node-RED中使用S3按键控制LED</strong></li>
        <li><strong>九、Node-RED使用I2C接口读取SHT30温湿度传感器数据</strong></li>
        <li><strong>十:Node-RED使用仪表盘显示温湿度传感器数据</strong></li>
        <li><strong>十一:总结</strong></li>
</ul>

<p>&nbsp;</p>

<p><strong>零、前言:</strong></p>

<p>如果有心查看米尔MYC-J1028X核心板及开发板的官方界面:</p>

<p>&nbsp;你会发现,介绍中透漏出浓厚的工业味儿。工业!工业!工业!</p>

<p>&nbsp;</p>

<p>今天,我们就在MYC-J1028X开发板上,搭建Node-RED环境,将开发板变身为工业物联网控制网关。</p>

<p>很多人了解或者知道Node-RED,是从智能家居或者小型物联网控制开始的,有的人认为只是一个类似的图形界面编程的工具。</p>

<p>其实,在工业互联网中,Node-RED可以用于数据收集、关联性触发控制、仪表呈现等,在低成本投入的情况下,也能获得较好的效果。</p>

<p>&nbsp;</p>

<p><strong>一、安装node-red</strong></p>

<p>安装node-red,可以参考官方的文档:<a href="https://nodered.org/docs/getting-started/raspberrypi" target="_blank">https://nodered.org/docs/getting-started/raspberrypi</a></p>

<p>虽然这篇文档,是针对树莓派的,但是对于Debian系的系统,都是可以参考的。</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code>bash &lt;(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)</code></pre>
</div>

<p>执行上述命令后,将自动下载安装脚本,启动安装进程,安装过程中的问题,一律选y即可。</p>

<p> &nbsp;</p>

<p>安装过程可能耗时比较长,先沏一杯茶或者咖啡,等着吧:</p>

<p></p>

<p>首次安装,可能会遇到莫名其妙的Node-RED core没装上,核心都没装上,怎么玩?</p>

<p>不管,再次执行安装命令,就能好了:</p>

<p> &nbsp;</p>

<p>如果提示那个shortcut有问题,先不管,不影响使用。</p>

<p>因为是首次安装,所以执行 <strong>node-red admin init&nbsp;</strong>进行初始化:</p>

<p> &nbsp;</p>

<p>初始化完成后,就可以执行&nbsp;node-red start 启动Node-RED了。</p>

<p> &nbsp;</p>

<p>正常启动后,就可以通过网址 http://开发板IP:1880/ 进行访问了:</p>

<p></p>

<p>&nbsp;输入初始化的时候设置的账户密码,登录后,按照下面的设置,即可切换到中文界面:</p>

<p></p>

<p>设置完成后,需要刷新页面,才能正式生效。</p>

<p>&nbsp;</p>

<p><strong>二、系统命令控制LED</strong></p>

<p>现在,我们就可以开始在Node-RED中,开始进行外设控制了。</p>

<p>第一个控制逻辑,还是点灯,能点灯,我们就成功一大半了。</p>

<p>通过查看官方的手册,可以了解到:</p>

<p>&nbsp;这个LED,系统已经做好了设备关联,不能通过GPIO进行控制。</p>

<p> &nbsp;</p>

<p>我们可以先使用上面的指令,测试能否控制系统的D22-LED。</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code>echo 0 | sudo tee /sys/class/leds/d22/brightness
echo 1 | sudo tee /sys/class/leds/d22/brightness</code></pre>
</div>

<p> &nbsp;</p>

<p><strong>三、LED权限设置:</strong></p>

<p>通过查看Node-RED的文档资料,可以了解到,有一个Exec Node,可以用于执行系统的命令,那我们正好可以使用其来执行上面手册中,控制D22的指令。</p>

<p>要使得普通用户运行的Node-RED能够控制系统LED,需要在udev中,添加对应的权限处理规则,否则操作时将会提示没有权限。</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code class="language-bash">sudo groupadd -f -r leds
sudo usermod -a -G leds $USER

sudo vim /etc/udev/rules.d/99-leds.rules

SUBSYSTEM=="leds", ACTION=="add", RUN+="/bin/chgrp -R leds /sys%p", RUN+="/bin/chmod -R g=u /sys%p"
SUBSYSTEM=="leds", ACTION=="change", ENV{TRIGGER}!="none", RUN+="/bin/chgrp -R leds /sys%p", RUN+="/bin/chmod -R g=u /sys%p"</code></pre>
</div>

<p>将上面的最后两行设置,添加到&nbsp;/etc/udev/rules.d/99-leds.rules 后,需要重启系统才能生效。</p>

<p><span style="color:#e74c3c;"><strong>友情提醒:类似在udev中进行普通用户权限的设置,后续还有很多次,一定要仔细设置。</strong></span></p>

<p>&nbsp;</p>

<p>重启后(sudo reboot),可以测试使用普通用户权限,来操作LED:</p>

<pre style="background:#555; padding:10px; color:#ddd !important;">
<code>echo 0 | tee /sys/class/leds/d22/brightness
echo 1 | tee /sys/class/leds/d22/brightness</code></pre>

<p>&nbsp;</p>

<p><strong>四、Node-RED控制系统LED</strong></p>

<p>先在Node-RED界面中,参考下图,添加两个inject node,再添加两个Exec Node。</p>

<p> &nbsp;</p>

<p>Exec Node的命令部分,参考下图填写,记住一个为echo 0,一个为echo 1,对应熄灭和点亮LED</p>

<p> &nbsp;</p>

<p>两个injection Node的设置,分别如下:</p>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p>上面的逻辑表示:</p>

<ol>
        <li>injection 0于第0秒开始执行,触发echo 0对应的Exec,熄灭LED</li>
        <li>injection 1于第1秒开始执行,触发echo 1对应的Exec,点亮LED</li>
        <li>第2秒,injection 0再次执行,熄灭LED</li>
        <li>第1+2秒,injection 1再次执行,点亮LED</li>
        <li>因为设置了周期执行,所以上面两个触发器,交替执行,就实现了LED的亮灭效果。</li>
</ol>

<p><strong>五、系统命令控制GPIO:</strong></p>

<p>在官方手册上,有说明如何操作GPIO:</p>

<p> &nbsp;</p>

<p>结合开发板和原理图上我们可以了解到,J18是我们可以方便使用的引脚区域:</p>

<p></p>

<p></p>

<p>J18上可供使用的GPIO对应关系如下:</p>

<ul>
        <li>J18 - Pin 32 - GPIO3_5:421</li>
        <li>J18 - Pin 22 - GPIO3_6:422</li>
        <li>J18 - Pin 29 - GPIO3_8:424</li>
        <li>J18 - Pin 31 - GPIO3_9:425</li>
        <li>J18 - Pin 33 - GPIO3_10:426</li>
        <li>J18 - Pin 36 - GPIO3_12:428</li>
</ul>

<p>&nbsp; &nbsp;</p>

<p>类似系统LED,如果要在普通用户下控制GPIO,也需要在udev中进行一些设置,具体设置如下:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code>sudo groupadd -f -r gpio
sudo usermod -a -G gpio $USER

sudo vim /etc/udev/rules.d/99-gpio.rules

SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", RUN+="/bin/chgrp -R gpio /sys/class/gpio/export /sys/class/gpio/unexport", RUN+="/bin/chmod -R g=u /sys/class/gpio/export /sys/class/gpio/unexport"
SUBSYSTEM=="gpio*", KERNEL=="gpio*", ACTION=="add", RUN+="/bin/chgrp -R gpio /sys%p", RUN+="/bin/chmod -R g=u /sys%p"
SUBSYSTEM=="gpio*", KERNEL=="gpio*", ACTION=="change", ENV{TRIGGER}!="none", RUN+="/bin/chgrp -R gpio /sys%p", RUN+="/bin/chmod -R g=u /sys%p"</code></pre>
</div>

<p>将上述最后三行内容写入/etc/udev/rules.d/99-gpio.rules,然后重启开发板即可生效。</p>

<p>&nbsp;</p>

<p>重启完成后,我们就可以现在命令行下进行测试。</p>

<p>首先按照原理图,将可以用3.3V驱动的LED,连接到GPIO3_9引脚上。</p>

<p>然后使用下面的命令进行测试:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code class="language-bash">echo 425 &gt; /sys/class/gpio/export
echo out &gt; /sys/class/gpio/gpio425/direction

for i in {1..100};do
    echo $((i%2)) &gt; /sys/class/gpio/gpio425/value
    sleep 1
done</code></pre>
</div>

<p>执行完命令后,连接到GPIO3_9引脚上的LED,将每秒闪烁一次。</p>

<p> &nbsp;</p>

<p>测试控制成功后,我们就可以到Node-RED中进行控制了。</p>

<p>&nbsp;</p>

<p><strong>六、Node-RED控制GPIO</strong></p>

<p>要在Node-Red中控制GPIO,可以安装OPI-GPIO插件,按照以下步骤安装即可:</p>

<p> &nbsp;</p>

<p>安装完成后,在右边组件选择栏,就会出现Orange Pi,选择其中的output pin,然后将之前设置的injection 0和1连接到新添加的控件上,再按照下面的步骤,设置对应的GPIO端口号。</p>

<p></p>

<p>&nbsp;&nbsp; 因为GPIO3_9对应425,所以pin填写425即可。但Orange Pi在填写后,再次打开的时候,界面会变成初始状态,所以务必仔细填写。</p>

<p>&nbsp; &nbsp;填写完成,点击右上角的部署,连接到GPIO3_9上的LED,就会开始闪烁了,和板子上的D22-LED同步。</p>

<p>&nbsp;&nbsp;</p>

<p><strong>七、开发板上的S3按键使用:</strong></p>

<p>在开发板上,有一个可供用户编程使用的按键S3:</p>

<p>&nbsp;具体位置如下:</p>

<p> &nbsp;</p>

<p>S3按键,使用系统/dev/input/event0来监听接收,普通用户使用,需要做如下设置:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code class="language-bash">sudo usermod -a -G input $USER

sudo vim /etc/udev/rules.d/99-event.rules

KERNEL=="event*", SUBSYSTEM=="input", TAG+="uaccess"</code></pre>
</div>

<p>设置好以后,重启才能生效。</p>

<p>&nbsp;</p>

<p>重启后,使用evtest指令测试:</p>

<p> &nbsp;</p>

<p>S3按键后,就能够收到按键的消息了。</p>

<p>为了能够更好的接收到按键信息,我们需要使用Python去进行检测,这需要使用到python3-evdev库,先安装:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code>pip3 install evdev</code></pre>
</div>

<p>&nbsp;</p>

<p>然后,使用下面的python脚本进行测试:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code class="language-python">from evdev import InputDevice
from select import select
dev = InputDevice('/dev/input/event0')
while True:
    r,w,x=select(,[],[])
    for event in dev.read():
      print(event)</code></pre>
</div>

<p>&nbsp;</p>

<p>按下S3按键然后释放,就会收到信息了:</p>

<p></p>

<p>&nbsp;需要注意的是,S3按键使用系统Event接收,按下去和释放,都会触发一次。</p>

<p>按下去对应:</p>

<ul>
        <li>event at 1664670749.634839, code 02, type 01, val 01</li>
        <li>event at 1664670749.634839, code 00, type 00, val 00</li>
</ul>

<p>释放对应:</p>

<ul>
        <li>event at 1664670750.350823, code 02, type 01, val 00</li>
        <li>event at 1664670750.350823, code 00, type 00, val 00</li>
</ul>

<p>我们可以将程序完善一下,直接按键输出1,释放输出0:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code class="language-python">from evdev import InputDevice
from select import select
dev = InputDevice('/dev/input/event0')
while True:
    r,w,x=select(,[],[])
    for event in dev.read():
      if event.code == 2 and event.type == 1:
            print("value: %d" % event.value)
</code></pre>
</div>

<p>&nbsp;</p>

<p>按下S3按键然后释放,就会收到下面的信息了:</p>

<p> &nbsp;</p>

<p>这样,我们就准备好将按键值提供给Node-RED使用了。</p>

<p>&nbsp;</p>

<p><strong>八、在Node-RED中使用S3按键控制LED:</strong></p>

<p>要在Node-RED中,获取到Python提供的按键值,然后控制LED,需要使用下面的逻辑:</p>

<p> &nbsp;<br />
&nbsp;</p>

<p>在Node-RED中的控制逻辑如下:</p>

<p></p>

<p>&nbsp;下面进行详细的说明。</p>

<p>首先,我们再次调整上面的监控脚本,使得监控按键的逻辑,符合实际需要,即:</p>

<ul>
        <li>根据按键次数,奇数次按键输出1(用于点亮LED),偶数次按键输出0(用于熄灭LED)</li>
        <li>默认输出0</li>
        <li>注意:这里是根据按键奇偶次数来输出1或者0,而不是根据按下和释放来输出1或者0</li>
</ul>

<p>具体代码如下:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code class="language-python">from evdev import InputDevice
from select import select
dev = InputDevice('/dev/input/event0')
keypress_times = 0
print(keypress_times % 2)
while True:
    r,w,x=select(,[],[])
    for event in dev.read():
      if event.value == 1:
            keypress_times = keypress_times + 1
            print(keypress_times % 2)

</code></pre>
</div>

<p>将上述代码保存到&nbsp;/home/HonestQiao/Projects/event/evdev_key.py (具体路径,请根据你的实际情况设定),然后运行测试:</p>

<p>&nbsp;测试无误后,就可以在Node-RED中真正调用了。</p>

<p>&nbsp;</p>

<p>要在Node-RED中,启动运行上面的监听脚本,需要使用到node-red-node-daemon插件,安装即可:</p>

<p>&nbsp;按后,按照下面的方式,使用daemon控件并进行设置:</p>

<p> &nbsp;</p>

<p>因为evdev_key.py输出的内容,为【0或者1 并附带回车】,所以Node-RED收到后,需要进行一次转换,才能使用。</p>

<p>按照下面的步骤,添加转换控件,并设置好转换逻辑即可:</p>

<p> &nbsp;</p>

<p>然后,添加GPIO3_10对应426引脚控制,并与转换为数字控件进行关联:</p>

<p>&nbsp;忘记说了,我在J18的GPIO3_10对应的引脚,连接了第二个LED:</p>

<p> &nbsp;</p>

<p>然后,在添加一个debug控件,以便能够查看到中间过程的数据信息:</p>

<p> &nbsp;<br />
&nbsp;将S3的三个输出、转换数字控件的输出,都连接到debug控件。</p>

<p>点击部署后,在右边,就能看到调试输出信息了。</p>

<p>尝试一下按键,就能够看到脚本输出的字符串信息,已经转换为数字好的信息,并且GPIO3_10连接的黄色LED,也能够被正常控制了。</p>

<p>&nbsp;</p>

<p><strong>九、Node-RED使用I2C接口读取SHT30温湿度传感器数据:</strong></p>

<p>前面的部分,都是LED控制、GPIO控制、按键读取,相对比较简单。</p>

<p>下面,再来一个感觉稍微提高一点点的实例,就是使用I2C接口读取SHT30温湿度传感器。</p>

<p>在之前看过的电路原理图中,J18接口上,就有I2C接口。</p>

<p></p>

<p>将I2C接口的SHT30,连接到J18对应的接口上:</p>

<p> &nbsp;</p>

<p>要在普通用户权限下,使用i2c接口,我们又需要在udev中做一些设置:</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code>sudo vim /etc/udev/rules.d/99-i2c.rules

KERNEL=="i2c-*", GROUP="i2c"</code></pre>
</div>

<p>将这行内容,写入到/etc/udev/rules.d/99-i2c.rules,然后重启生效。</p>

<p>&nbsp;</p>

<p>重启完成后,在命令下下,测试是否能够找到SHT30:</p>

<p>先使用 i2cdetect -l 命令查看一下可供使用的i2c接口:</p>

<p> &nbsp;</p>

<p>从上面可以看到,i2c-0、i2c-1可供使用。</p>

<p>然后,在使用&nbsp;i2cdetect -y 0 和 i2cdetect&nbsp;-y 1 查看i2c挂载的设备: &nbsp;</p>

<p>在i2c-1中,有一个44的设备,这个正是 SHT30的默认i2c通讯地址。</p>

<p>可以尝试,把SHT30连线断开,再使用 i2cdetect&nbsp;-y 1 查看,有什么不同。</p>

<p>&nbsp;</p>

<p>在Node-RED中,要读取SHT3X的数据,可以使用&nbsp;node-red-contrib-sht 插件:</p>

<p>&nbsp;然后,按照如下步骤,先添加一个injection控件,用于周期性触发,再挂一个SHT3X控件,用于读取SHT3X的数据,最后再挂一个debug模块,输出调试信息:</p>

<p> &nbsp;</p>

<p>逻辑设置完成,点击右上角的部署后,调试区域,就会打印出来,实际读取到的温湿度信息了。</p>

<p>对着温湿度传感器哈哈气,就会发现读取到的数值,发生了变化。</p>

<p>&nbsp;</p>

<p><strong>十:Node-RED使用仪表盘显示温湿度传感器数据:</strong></p>

<p>Node-RED还有一个迷人又强大的地方,那就是它不仅能够方便你用图形界面设计物联网设备的控制交互流程,还能够很方便的使用仪表盘,提供数据查看界面。</p>

<p>下面,我就在上一步读取到温湿度传感器的基础上,再做一个,可以在手机界面上查看访问的仪表盘。</p>

<p>&nbsp;</p>

<p>首先,安装一个dashboard仪表盘控件:</p>

<p>&nbsp;有好多可供选择的,我直接安装了第一个dashboard-evi。其他的,大家也可以尝试一下。</p>

<p>&nbsp;</p>

<p>然后,在SHT3X空间上,挂两个change,用于转换温湿度值:</p>

<p></p>

<p> &nbsp;&nbsp;上述两个change,一个用于将温度值转换为只有1位小数,一个将湿度值转换为无小数。</p>

<p>&nbsp;</p>

<p>而温湿度值,各挂一个gauge,用于显示最终的数据,其内容,参考如下设置即可:</p>

<p>温度gauge:</p>

<p>&nbsp;湿度gauge:</p>

<p><span style="color:#e74c3c;"><strong>&nbsp;注意,务必需要设置Range,也就是数值范围,否则可能不会正常显示。</strong></span></p>

<p>&nbsp;</p>

<p>在第一次设置gauge的时候,如上面的温度gauge,要点 (4) 进入,设置group节点和Tab节点,具体如下:</p>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p>经过以上设置,就能够将温湿度值,输出到仪表盘上了。</p>

<p>&nbsp;</p>

<p>为了效果更好,我再添加一个当前日期时间转换,并使用文本控件显示。</p>

<p>先按照下面的步骤,添加一个function控件,别编写转换代码:</p>

<p> &nbsp;</p>

<div class="parsedown-markdown">
<pre style="background:#555; padding:10px; color:#ddd !important;">
<code class="language-javascript">function formatDate(value) {
    var date = new Date(value);
    var y = date.getFullYear(),
      m = date.getMonth() + 1,
      d = date.getDate(),
      h = date.getHours(),
      i = date.getMinutes(),
      s = date.getSeconds();
    if (m &lt; 10) { m = '0' + m; }
    if (d &lt; 10) { d = '0' + d; }
    if (h &lt; 10) { h = '0' + h; }
    if (i &lt; 10) { i = '0' + i; }
    if (s &lt; 10) { s = '0' + s; }
    var t = y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;
    return t;
}

return { payload: formatDate(msg.payload) };</code></pre>
</div>

<p>其中的&nbsp;formatDate() 函数,就是一个js中标准的把当前时间戳转换为YYYY-mm-dd HH:MM:SS格式的函数。</p>

<p>这也是Node-RED的一个强大之处,除了编写好的控件,还可以使用脚本进行中间过程的处理。</p>

<p>&nbsp;</p>

<p>设置好了日期时间转换,再在其后挂一个text控件,用作显示即可:</p>

<p> &nbsp;</p>

<p>全部设计完成后,点击右上角的部署,就可以使用手机进行查看了。</p>

<p>在手机上,访问网址&nbsp; http://开发板IP:1880/ui ,就能看到如下的界面了:</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p><strong>十一、总结:</strong></p>

<p>这篇分享,基于米尔MYC-J1028X开发板,结合Node-RED,将其变身为工业控制网关。</p>

<p>看到这里,看似分享了不少内容,但涉及到Node-RED的部分,只有Node-RED全部功能的万分之一都不到,而且都是非常基础的使用。</p>

<p>对于米尔MYC-J1028X开发板的使用,也是用到了实际功能的百分之一都不到。</p>

<p>&nbsp;</p>

<p>Node-RED还有很多很多很多强大的功能,可以方便我们快速的获取外部设备的数据,并编写合适的逻辑处理流程来规整数据,并进行数据的呈现,或者对外部设备进行控制。</p>

<p>而这一切,并不需要特别专业的编程技能,就能够完成。</p>

<p>&nbsp;</p>

<p>基于米尔MYC-J1028X开发板强劲的运算能力,以及丰富的外设接口,结合Node-RED所构建的工业控制网关,完全可以应用在实际场合中,发挥重大的作用。</p>

<p>将其部署在工业现场,用于收集、存储、处理和分析网络边缘的数据,能够减轻对云和数据中心的压力。</p>

<p>这套系统,可以通过灵活的I/O简化通信和控制,对数据进行主动采集、解析及过滤、汇聚,来可视化现场数据和控制逻辑,既能方便预测性维护,又能开展实时数据处理与决策。</p>

<p>&nbsp;</p>

lugl4313820 发表于 2022-10-7 13:57

<p>你会发现,介绍中透漏出浓厚的工业味儿。工业!工业!工业!</p>

<p>看乔老师的帖子,那就是欣赏美文,偿受!</p>
页: [1]
查看完整版本: 【米尔MYC-J1028X开发板试用】应用Node-RED将MYC-J1028X开发板变身为工业控制网关