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