由測(cè)評(píng)者HonestQiao提供
視頻搶先看↓↓↓
這篇分享,內(nèi)容較長(zhǎng),涉及知識(shí)點(diǎn)多,需耐心閱讀,目錄如下:
前言
一、安裝node-red
二、系統(tǒng)命令控制LED
三、LED權(quán)限設(shè)置
四、Node-RED控制系統(tǒng)LED
五、系統(tǒng)命令控制GPIO
六、Node-RED控制GPIO
七、開(kāi)發(fā)板上的S3按鍵使用
八、在Node-RED中使用S3按鍵控制LED
九、Node-RED使用I2C接口讀取SHT30溫濕度傳感器數(shù)據(jù)
十:Node-RED使用儀表盤(pán)顯示溫濕度傳感器數(shù)據(jù)
十一:總結(jié)
前言:
如果有心查看米爾MYC-J1028X核心板及開(kāi)發(fā)板的官方界面:
你會(huì)發(fā)現(xiàn),介紹中透露出濃厚的工業(yè)味兒。工業(yè)!工業(yè)!工業(yè)!
今天,我們就在MYC-J1028X開(kāi)發(fā)板上,搭建Node-RED環(huán)境,將開(kāi)發(fā)板變身為工業(yè)物聯(lián)網(wǎng)控制網(wǎng)關(guān)。
很多人了解或者知道Node-RED,是從智能家居或者小型物聯(lián)網(wǎng)控制開(kāi)始的,有的人認(rèn)為只是一個(gè)類(lèi)似的圖形界面編程的工具。
其實(shí),在工業(yè)互聯(lián)網(wǎng)中,Node-RED可以用于數(shù)據(jù)收集、關(guān)聯(lián)性觸發(fā)控制、儀表呈現(xiàn)等,在低成本投入的情況下,也能獲得較好的效果。
一、安裝node-red
安裝node-red,可以參考官方的文檔:https://nodered.org/docs/getting-started/raspberrypi
雖然這篇文檔,是針對(duì)樹(shù)莓派的,但是對(duì)于Debian系的系統(tǒng),都是可以參考的。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
執(zhí)行上述命令后,將自動(dòng)下載安裝腳本,啟動(dòng)安裝進(jìn)程,安裝過(guò)程中的問(wèn)題,一律選y即可。
安裝過(guò)程可能耗時(shí)比較長(zhǎng),先沏一杯茶或者咖啡,等著吧:
首次安裝,可能會(huì)遇到莫名其妙的Node-RED core沒(méi)裝上,核心都沒(méi)裝上,怎么玩?
不管,再次執(zhí)行安裝命令,就能好了:
如果提示那個(gè)shortcut有問(wèn)題,先不管,不影響使用。
因?yàn)槭鞘状伟惭b,所以執(zhí)行node-red admin init進(jìn)行初始化:
初始化完成后,就可以執(zhí)行 node-red start 啟動(dòng)Node-RED了。
正常啟動(dòng)后,就可以通過(guò)網(wǎng)址 http://開(kāi)發(fā)板IP:1880/ 進(jìn)行訪問(wèn)了:
輸入初始化的時(shí)候設(shè)置的賬戶密碼,登錄后,按照下面的設(shè)置,即可切換到中文界面:
設(shè)置完成后,需要刷新頁(yè)面,才能正式生效。
二、系統(tǒng)命令控制LED
現(xiàn)在,我們就可以開(kāi)始在Node-RED中,開(kāi)始進(jìn)行外設(shè)控制了。
第一個(gè)控制邏輯,還是點(diǎn)燈,能點(diǎn)燈,我們就成功一大半了。
通過(guò)查看官方的手冊(cè),可以了解到:
這個(gè)LED,系統(tǒng)已經(jīng)做好了設(shè)備關(guān)聯(lián),不能通過(guò)GPIO進(jìn)行控制。
我們可以先使用上面的指令,測(cè)試能否控制系統(tǒng)的D22-LED。
echo 0 | sudo tee /sys/class/leds/d22/brightness
echo 1 | sudo tee /sys/class/leds/d22/brightness
三、LED權(quán)限設(shè)置:
通過(guò)查看Node-RED的文檔資料,可以了解到,有一個(gè)Exec Node,可以用于執(zhí)行系統(tǒng)的命令,那我們正好可以使用其來(lái)執(zhí)行上面手冊(cè)中,控制D22的指令。
要使得普通用戶運(yùn)行的Node-RED能夠控制系統(tǒng)LED,需要在udev中,添加對(duì)應(yīng)的權(quán)限處理規(guī)則,否則操作時(shí)將會(huì)提示沒(méi)有權(quán)限。
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"
將上面的最后兩行設(shè)置,添加到/etc/udev/rules.d/99-leds.rules 后,需要重啟系統(tǒng)才能生效。
友情提醒:類(lèi)似在udev中進(jìn)行普通用戶權(quán)限的設(shè)置,后續(xù)還有很多次,一定要仔細(xì)設(shè)置。
重啟后(sudo reboot),可以測(cè)試使用普通用戶權(quán)限,來(lái)操作LED:
echo 0 | tee /sys/class/leds/d22/brightness
echo 1 | tee /sys/class/leds/d22/brightness
四、Node-RED控制系統(tǒng)LED
先在Node-RED界面中,參考下圖,添加兩個(gè)inject node,再添加兩個(gè)Exec Node。
Exec Node的命令部分,參考下圖填寫(xiě),記住一個(gè)為echo 0,一個(gè)為echo 1,對(duì)應(yīng)熄滅和點(diǎn)亮LED
兩個(gè)injection Node的設(shè)置,分別如下:
上面的邏輯表示:
injection 0于第0秒開(kāi)始執(zhí)行,觸發(fā)echo 0對(duì)應(yīng)的Exec,熄滅LED
injection 1于第1秒開(kāi)始執(zhí)行,觸發(fā)echo 1對(duì)應(yīng)的Exec,點(diǎn)亮LED
第2秒,injection 0再次執(zhí)行,熄滅LED
第1+2秒,injection 1再次執(zhí)行,點(diǎn)亮LED
因?yàn)樵O(shè)置了周期執(zhí)行,所以上面兩個(gè)觸發(fā)器,交替執(zhí)行,就實(shí)現(xiàn)了LED的亮滅效果。
五、系統(tǒng)命令控制GPIO:
在官方手冊(cè)上,有說(shuō)明如何操作GPIO:
結(jié)合開(kāi)發(fā)板和原理圖上我們可以了解到,J18是我們可以方便使用的引腳區(qū)域:
J18上可供使用的GPIO對(duì)應(yīng)關(guān)系如下:
J18 - Pin 32 - GPIO3_5:421
J18 - Pin 22 - GPIO3_6:422
J18 - Pin 29 - GPIO3_8:424
J18 - Pin 31 - GPIO3_9:425
J18 - Pin 33 - GPIO3_10:426
J18 - Pin 36 - GPIO3_12:428
類(lèi)似系統(tǒng)LED,如果要在普通用戶下控制GPIO,也需要在udev中進(jìn)行一些設(shè)置,具體設(shè)置如下:
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"
將上述最后三行內(nèi)容寫(xiě)入/etc/udev/rules.d/99-gpio.rules,然后重啟開(kāi)發(fā)板即可生效。
重啟完成后,我們就可以現(xiàn)在命令行下進(jìn)行測(cè)試。
首先按照原理圖,將可以用3.3V驅(qū)動(dòng)的LED,連接到GPIO3_9引腳上。
然后使用下面的命令進(jìn)行測(cè)試:
echo 425 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio425/direction
for i in {1..100};do
echo $((i%2)) > /sys/class/gpio/gpio425/value
sleep 1
done
執(zhí)行完命令后,連接到GPIO3_9引腳上的LED,將每秒閃爍一次。
測(cè)試控制成功后,我們就可以到Node-RED中進(jìn)行控制了。
六、Node-RED控制GPIO
要在Node-Red中控制GPIO,可以安裝OPI-GPIO插件,按照以下步驟安裝即可:
安裝完成后,在右邊組件選擇欄,就會(huì)出現(xiàn)Orange Pi,選擇其中的output pin,然后將之前設(shè)置的injection 0和1連接到新添加的控件上,再按照下面的步驟,設(shè)置對(duì)應(yīng)的GPIO端口號(hào)。
因?yàn)镚PIO3_9對(duì)應(yīng)425,所以pin填寫(xiě)425即可。但Orange Pi在填寫(xiě)后,再次打開(kāi)的時(shí)候,界面會(huì)變成初始狀態(tài),所以務(wù)必仔細(xì)填寫(xiě)。
填寫(xiě)完成,點(diǎn)擊右上角的部署,連接到GPIO3_9上的LED,就會(huì)開(kāi)始閃爍了,和板子上的D22-LED同步。
七、開(kāi)發(fā)板上的S3按鍵使用:
在開(kāi)發(fā)板上,有一個(gè)可供用戶編程使用的按鍵S3:
具體位置如下:
S3按鍵,使用系統(tǒng)/dev/input/event0來(lái)監(jiān)聽(tīng)接收,普通用戶使用,需要做如下設(shè)置:
sudo usermod -a -G input $USER
sudo vim /etc/udev/rules.d/99-event.rules
KERNEL=="event[0-9]*", SUBSYSTEM=="input", TAG+="uaccess"
設(shè)置好以后,重啟才能生效。
重啟后,使用evtest指令測(cè)試:
S3按鍵后,就能夠收到按鍵的消息了。
為了能夠更好的接收到按鍵信息,我們需要使用Python去進(jìn)行檢測(cè),這需要使用到python3-evdev庫(kù),先安裝:
pip3 install evdev
然后,使用下面的python腳本進(jìn)行測(cè)試:
from evdev import InputDevice
from select import select
dev = InputDevice('/dev/input/event0')
while True:
r,w,x=select([dev],[],[])
for event in dev.read():
print(event)
按下S3按鍵然后釋放,就會(huì)收到信息了:
需要注意的是,S3按鍵使用系統(tǒng)Event接收,按下去和釋放,都會(huì)觸發(fā)一次。
按下去對(duì)應(yīng):
event at 1664670749.634839, code 02, type 01, val 01
event at 1664670749.634839, code 00, type 00, val 00
釋放對(duì)應(yīng):
event at 1664670750.350823, code 02, type 01, val 00
event at 1664670750.350823, code 00, type 00, val 00
我們可以將程序完善一下,直接按鍵輸出1,釋放輸出0:
from evdev import InputDevice
from select import select
dev = InputDevice('/dev/input/event0')
while True:
r,w,x=select([dev],[],[])
for event in dev.read():
if event.code == 2 and event.type == 1:
print("value: %d" % event.value)
按下S3按鍵然后釋放,就會(huì)收到下面的信息了:
這樣,我們就準(zhǔn)備好將按鍵值提供給Node-RED使用了。
八、在Node-RED中使用S3按鍵控制LED:
要在Node-RED中,獲取到Python提供的按鍵值,然后控制LED,需要使用下面的邏輯:
在Node-RED中的控制邏輯如下:
下面進(jìn)行詳細(xì)的說(shuō)明。
首先,我們?cè)俅握{(diào)整上面的監(jiān)控腳本,使得監(jiān)控按鍵的邏輯,符合實(shí)際需要,即:
根據(jù)按鍵次數(shù),奇數(shù)次按鍵輸出1(用于點(diǎn)亮LED),偶數(shù)次按鍵輸出0(用于熄滅LED)
默認(rèn)輸出0
注意:這里是根據(jù)按鍵奇偶次數(shù)來(lái)輸出1或者0,而不是根據(jù)按下和釋放來(lái)輸出1或者0
具體代碼如下:
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([dev],[],[])
for event in dev.read():
if event.value == 1:
keypress_times = keypress_times + 1
print(keypress_times % 2)
將上述代碼保存到/home/HonestQiao/Projects/event/evdev_key.py (具體路徑,請(qǐng)根據(jù)你的實(shí)際情況設(shè)定),然后運(yùn)行測(cè)試:
測(cè)試無(wú)誤后,就可以在Node-RED中真正調(diào)用了。
要在Node-RED中,啟動(dòng)運(yùn)行上面的監(jiān)聽(tīng)腳本,需要使用到node-red-node-daemon插件,安裝即可:
然后,按照下面的方式,使用daemon控件并進(jìn)行設(shè)置:
因?yàn)閑vdev_key.py輸出的內(nèi)容,為【0或者1 并附帶回車(chē)】,所以Node-RED收到后,需要進(jìn)行一次轉(zhuǎn)換,才能使用。
按照下面的步驟,添加轉(zhuǎn)換控件,并設(shè)置好轉(zhuǎn)換邏輯即可:
然后,添加GPIO3_10對(duì)應(yīng)426引腳控制,并與轉(zhuǎn)換為數(shù)字控件進(jìn)行關(guān)聯(lián):
忘記說(shuō)了,我在J18的GPIO3_10對(duì)應(yīng)的引腳,連接了第二個(gè)LED:
然后,再添加一個(gè)debug控件,以便能夠查看到中間過(guò)程的數(shù)據(jù)信息:
將S3的三個(gè)輸出、轉(zhuǎn)換數(shù)字控件的輸出,都連接到debug控件。
點(diǎn)擊部署后,在右邊,就能看到調(diào)試輸出信息了。
嘗試一下按鍵,就能夠看到腳本輸出的字符串信息,已經(jīng)轉(zhuǎn)換為數(shù)字信息,并且GPIO3_10連接的黃色LED,也能夠被正??刂屏?。
九、Node-RED使用I2C接口讀取SHT30溫濕度傳感器數(shù)據(jù):
前面的部分,都是LED控制、GPIO控制、按鍵讀取,相對(duì)比較簡(jiǎn)單。
下面,再來(lái)一個(gè)感覺(jué)稍微提高一點(diǎn)點(diǎn)的實(shí)例,就是使用I2C接口讀取SHT30溫濕度傳感器。
在之前看過(guò)的電路原理圖中,J18接口上,就有I2C接口。
將I2C接口的SHT30,連接到J18對(duì)應(yīng)的接口上:
要在普通用戶權(quán)限下,使用i2c接口,我們又需要在udev中做一些設(shè)置:
sudo vim /etc/udev/rules.d/99-i2c.rules
KERNEL=="i2c-[0-9]*", GROUP="i2c"
將這行內(nèi)容,寫(xiě)入到/etc/udev/rules.d/99-i2c.rules,然后重啟生效。
重啟完成后,在命令下下,測(cè)試是否能夠找到SHT30:
先使用 i2cdetect -l 命令查看一下可供使用的i2c接口:
從上面可以看到,i2c-0、i2c-1可供使用。
然后,再使用 i2cdetect -y 0 和 i2cdetect -y 1 查看i2c掛載的設(shè)備:
在i2c-1中,有一個(gè)44的設(shè)備,這個(gè)正是 SHT30的默認(rèn)i2c通訊地址。
可以嘗試,把SHT30連線斷開(kāi),再使用 i2cdetect -y 1 查看,有什么不同。
在Node-RED中,要讀取SHT3X的數(shù)據(jù),可以使用 node-red-contrib-sht 插件:
然后,按照如下步驟,先添加一個(gè)injection控件,用于周期性觸發(fā),再掛一個(gè)SHT3X控件,用于讀取SHT3X的數(shù)據(jù),最后再掛一個(gè)debug模塊,輸出調(diào)試信息:
邏輯設(shè)置完成,點(diǎn)擊右上角的部署后,調(diào)試區(qū)域,就會(huì)打印出來(lái),實(shí)際讀取到的溫濕度信息了。
對(duì)著溫濕度傳感器哈哈氣,就會(huì)發(fā)現(xiàn)讀取到的數(shù)值,發(fā)生了變化。
十:Node-RED使用儀表盤(pán)顯示溫濕度傳感器數(shù)據(jù):
Node-RED還有一個(gè)迷人又強(qiáng)大的地方,那就是它不僅能夠方便你用圖形界面設(shè)計(jì)物聯(lián)網(wǎng)設(shè)備的控制交互流程,還能夠很方便的使用儀表盤(pán),提供數(shù)據(jù)查看界面。
下面,我就在上一步讀取到溫濕度傳感器的基礎(chǔ)上,再做一個(gè),可以在手機(jī)界面上查看訪問(wèn)的儀表盤(pán)。
首先,安裝一個(gè)dashboard儀表盤(pán)控件:
有好多可供選擇的,我直接安裝了第一個(gè)dashboard-evi。其他的,大家也可以嘗試一下。
然后,在SHT3X空間上,掛兩個(gè)change,用于轉(zhuǎn)換溫濕度值:
上述兩個(gè)change,一個(gè)用于將溫度值轉(zhuǎn)換為只有1位小數(shù),一個(gè)將濕度值轉(zhuǎn)換為無(wú)小數(shù)。
而溫濕度值,各掛一個(gè)gauge,用于顯示最終的數(shù)據(jù),其內(nèi)容,參考如下設(shè)置即可:
溫度gauge:
濕度gauge:
注意,務(wù)必需要設(shè)置Range,也就是數(shù)值范圍,否則可能不會(huì)正常顯示。
在第一次設(shè)置gauge的時(shí)候,如上面的溫度gauge,要點(diǎn) (4) 進(jìn)入,設(shè)置group節(jié)點(diǎn)和Tab節(jié)點(diǎn),具體如下:
經(jīng)過(guò)以上設(shè)置,就能夠?qū)貪穸戎?,輸出到儀表盤(pán)上了。
為了效果更好,我再添加一個(gè)當(dāng)前日期時(shí)間轉(zhuǎn)換,并使用文本控件顯示。
先按照下面的步驟,添加一個(gè)function控件,別編寫(xiě)轉(zhuǎn)換代碼:
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 < 10) { m = '0' + m; }
if (d < 10) { d = '0' + d; }
if (h < 10) { h = '0' + h; }
if (i < 10) { i = '0' + i; }
if (s < 10) { s = '0' + s; }
var t = y + '-' + m + '-' + d + ' ' + h + ':' + i + ':' + s;
return t;
}
return { payload: formatDate(msg.payload) };
其中的 formatDate() 函數(shù),就是一個(gè)js中標(biāo)準(zhǔn)的把當(dāng)前時(shí)間戳轉(zhuǎn)換為YYYY-mm-dd HHSS格式的函數(shù)。
這也是Node-RED的一個(gè)強(qiáng)大之處,除了編寫(xiě)好的控件,還可以使用腳本進(jìn)行中間過(guò)程的處理。
設(shè)置好了日期時(shí)間轉(zhuǎn)換,再在其后掛一個(gè)text控件,用作顯示即可:
全部設(shè)計(jì)完成后,點(diǎn)擊右上角的部署,就可以使用手機(jī)進(jìn)行查看了。
在手機(jī)上,訪問(wèn)網(wǎng)址 http://開(kāi)發(fā)板IP:1880/ui ,就能看到如下的界面了:
十一、總結(jié):
這篇分享,基于米爾MYC-J1028X開(kāi)發(fā)板,結(jié)合Node-RED,將其變身為工業(yè)控制網(wǎng)關(guān)。
看到這里,看似分享了不少內(nèi)容,但涉及到Node-RED的部分,只有Node-RED全部功能的萬(wàn)分之一都不到,而且都是非常基礎(chǔ)的使用。
對(duì)于米爾MYC-J1028X開(kāi)發(fā)板的使用,也是用到了實(shí)際功能的百分之一都不到。
Node-RED還有很多很多很多強(qiáng)大的功能,可以方便我們快速的獲取外部設(shè)備的數(shù)據(jù),并編寫(xiě)合適的邏輯處理流程來(lái)規(guī)整數(shù)據(jù),并進(jìn)行數(shù)據(jù)的呈現(xiàn),或者對(duì)外部設(shè)備進(jìn)行控制。
而這一切,并不需要特別專(zhuān)業(yè)的編程技能,就能夠完成。
基于米爾MYC-J1028X開(kāi)發(fā)板強(qiáng)勁的運(yùn)算能力,以及豐富的外設(shè)接口,結(jié)合Node-RED所構(gòu)建的工業(yè)控制網(wǎng)關(guān),完全可以應(yīng)用在實(shí)際場(chǎng)合中,發(fā)揮重大的作用。
將其部署在工業(yè)現(xiàn)場(chǎng),用于收集、存儲(chǔ)、處理和分析網(wǎng)絡(luò)邊緣的數(shù)據(jù),能夠減輕對(duì)云和數(shù)據(jù)中心的壓力。
這套系統(tǒng),可以通過(guò)靈活的I/O簡(jiǎn)化通信和控制,對(duì)數(shù)據(jù)進(jìn)行主動(dòng)采集、解析及過(guò)濾、匯聚,來(lái)可視化現(xiàn)場(chǎng)數(shù)據(jù)和控制邏輯,既能方便預(yù)測(cè)性維護(hù),又能開(kāi)展實(shí)時(shí)數(shù)據(jù)處理與決策。
-
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
4251瀏覽量
50849 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
4895瀏覽量
97057
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論