作者:MakerPRO技術顧問/柯大
對於部份使用者可能較不熟悉SPI控制方式,可選擇群登具有MCU+LoRa晶片的模組,例如EK-AI1276XX或EK-1278XX系列,在本篇的實作測試中,我們將利用Arduino Nano MCU連接DHT11溫溼度感測器,以及PMS5003 PM2.5細懸浮粒子感測器偵測空氣品質;Arduino Nano再與具MCU款的EVK模組 EK-AI1276-401H連接,利用LoRa長距離低功耗的特性來傳送感測值資料,並以JSON格式傳送。
JSON 資料範例: { “PM25″:25,”Temp”:24.00,”Humi”:52} 。
整個系統架構圖如下:
傳送端以Arduino Nano MCU與Acsip LoRa 系列EK-AI1276-401H模組利用 UART介面及3.3V連接,接線方式如下:
接收端以Realtek Ameba RTL8195 MCU與Acsip LoRa 系列EK-AI1276-401H模組利用 UART介面及3.3V連接,接線方式如下:
本實作的步驟如下:
- 以LoRa模組提供之UART分別連接Arduino Nano 及Ameba RTL8195開發板;
- 以模組提供的LoRa Command Set 設定Ameba板為MASTER 模式(LoraMode MASTER),Arduino Nano 為SLAVE 模式(LoraMode SLAVE);
- 由MASTER自建Acsip 自訂的 AcsipLora-Net 網路協議下,MASTER 裝置邀請 SLAVE 裝置加入私有網(LoraJoinNode slveUUID), MASTER及SLAVE端即可利用 LoraNodeData command 傳送資料給對方;
- 由Ameba 當MASTER 接收Arduino Nano SLAVE端定時傳送溫溼度感測器及PM2.5感測值資料,並以JSON格式傳送;
- 以Amebao做為LoRa Gayeway,利用內建WiFi功能將資料再分別以RESTful API或MQTT格式上傳ThingSpeak IoT平台及QNAP NAS MQTT Server ,並可再利用NAS Server 提供的Node-RED container 來接收以儀表板顯示數值及曲數。
GUI 模擬測試工具軟體:LoRa_Terminator
群登EK-AI12xx系列帶MCU的LoRa開發模組為了方便開發者測試LoRa模組,提供了Winows 作業系統下的GUI 模擬測試工具軟體:LoRa_Terminator,可利用此軟體內建的選單式Command Set測試模組及自組LoRa網傳送、接收功能。
常用Command Set 如下:
1. LoraGetSystemMode
詢問目前整體系統運作在哪種模式。
- 參數:(不需帶參數)
- 回傳值:
(成功),InNormal 表運作在一般模式下,InProductVerification 表運作在產測模式,InPingPognTest 表運作在測試模式,InIdle 表運作在閒置模式。inTD
(失敗)ERROR或是UNKNOW。
2. LoraGetMode
詢問目前 Lora 運作在哪種模式。
- 參數:(不需帶參數)
- 回傳值:
(成功),MASTER,表目前 Lora 運作在 MASTER 角色;SLAVE,表目前 Lora 運作在 SLAVE 角色。
(失敗) ERROR或是UNKNOW。
3. LoraGetPara
詢問目前 Lora 的運作參數。
- 參數:(不需帶參數)
- 回傳值:
(成功)例如:
RFFrequency=915000000 BW=8 SF=6 RFOscillator=Crystal
ErrorCoding=1 RFPower=17 FreqHopOn=false HeaderStatus=Implicit CRC=ON
PreambleLength=12 PayloadLength=32 TxPacketTimeout=227 RxPacketTimeout=227,
表示 Lora 的完整運作參數值。
(失敗)ERROR或是UNKNOW。
4. LoraSystemMode
設定整個裝置系統的運作模式。
- 參數:需帶一個參數,有以下四種:inNormal-表示運作在一般模式;inPV-表示運作在生產驗證模式;inTD-表示運作在展示測試模式;inIdle-運作在閒置模式。
- 回傳值:
(成功), OK ;(失敗),ERROR或是UNKNOW。
5. LoraMode
設定 Lora 裝置是運作在 Master 端或是 Slave 端。
- 參數:需帶一個參數,MASTER:表示 Lora 運作在 Master 端,SLAVE:表示 Lora 運作在 Slave 端。
- 回傳值:
(成功), OK;(失敗) ERROR或是UNKNOW。
6. LoraJoinNode
在 Acsip 自訂的 AcsipLora-Net 網路協議下,MASTER 裝置邀請 SLAVE 裝置加入自身網域。
例如:LoraJoinNode 420024,表示邀請 Lora 位址是 420024 的 SLAVE 裝置加入網域。
- 參數:需帶一個參數,此參數為 SLAVE 裝置本身的 Lora 位址。
- 回傳值:
(成功),OK,表示此邀請連結事件建立成功。
(失敗) ERROR或是UNKNOW,表示此邀請連結事件建立失敗。
補充1:參數必須是一個 6 碼長度的位址,字元需為 0~9、A~F、a~f。
補充2:在事件執行完後,MASTER 與 SLAVE 各自都會自動回報是否成功的訊息,如下:
NodeAddr=420024 Join the AcsipLoraNet SUCCESSED!,表示成功加入網域。
若顯示NodeAddr=420024 Join the AcsipLoraNet FAILED!,則表示加入網域失敗。
7. LoraLeaveNode
在 Acsip 自訂的 AcsipLora-Net 網路協議下,MASTER 命令 SLAVE 裝置斷線、離開網域。
例如:LoraLeaveNode 420024,表示命令 Lora 位址是 420024 的 SLAVE 裝置斷線、離開網域。
- 參數:需帶一個參數,此參數為 SLAVE 裝置本身的 Lora 位址。
- 回傳值:
(成功)OK,表示此離線事件建立成功。
(失敗)ERROR或是UNKNOW,表示此離線事件建立失敗。
補充1:參數必須是一個 6 碼長度的位址,字元需為 0~9、A~F、a~f。
補充2:在事件執行完後,MASTER 與 SLAVE 各自都會自動回報是否成功的訊息,如下:
NodeAddr=420024 Leave the AcsipLoraNet SUCCESSED!,表示成功離線。
NodeAddr=420024 Leave the AcsipLoraNet FAILED!,表示離線失敗(一樣連線中)。
8. LoraSetNodePara
在 Acsip 自訂的 AcsipLora-Net 網路協議下,當 SLAVE 裝置連結上 MASTER 後,可以利用此指令
在 MASTER 端設定 SLAVE 的運作參數,設定 SLAVE 端的睡眠時間長度與裝置別名。
- 參數:可以帶一個參數,或帶二個參數,不然就是帶三個參數;在只帶一個參數時,參數一定是 Lora位址:在只帶二個參數時,第一個參數是 Lora 位址,第二個參數可以是睡眠時間長度(單位秒)或是裝置別名;在只帶三個參數時,第一個參數是 Lora 位址,第二個參數是睡眠時間長度(單位秒),第三個參數為裝置別名。
- 回傳值:
(成功)OK,表示此指令運作成功。
(失敗)ERROR或是UNKNOW,表示此指令運作失敗。
補充1:此指令專屬 MASTER 執行。
補充2:裝置別名的資料輸入必須為 Base64 編碼格式。
補充3:裝置別名前後需使用””(雙引號)(只有此參數需使用雙引號)。
補充4:範例說明
Ex1: LoraSetNodePara 300057
Mean : Clear Lora SLAVE Node 300057’s Interval & Aliases.
Ex2: LoraSetNodePara 300057 20
Mean : Set Lora SLAVE Node 300057’s Interval=20.
Ex3: LoraSetNodePara 300057 0
Mean : Set Lora SLAVE Node 300057’s Interval=0.(Clear Interval)
Ex4: LoraSetNodePara 300057 “QAZW”
Mean : Set Lora SLAVE Node 300057’s Aliases= QAZW.
Ex5: LoraSetNodePara 300057 “”
Mean : Clear Lora SLAVE Node 300057’s Aliases.
Ex6: LoraSetNodePara 300057 10 “abcd”
Mean : Set Lora SLAVE Node 300057’s Interval=10 & Aliases= abcd.
9. LoraGetNodePara
在 Acsip 自訂的 AcsipLora-Net 網路協議下,下此指令可以查詢目前連結上 MASTER 端的SLAVE,其運作參數為何。
- 參數:需帶一個參數,參數為 Lora 位址。
- 回傳值:
(成功)最後會回傳 OK,表示此指令運作成功。回傳 OK 前會回傳一串結果,舉例:Node=420024 EVT=GetNode 222 qazwsxed,表示 Lora 位址 420024,其睡眠時間長度(單位秒)為 222 秒,裝置別名為 qazwsxed(Base64 編碼)。
(失敗)ERROR或是UNKNOW,表示此指令運作失敗。
補充1:此指令專屬 MASTER 執行。
補充2:別名的資料為 Base64 編碼格式。
10. LoraNodeData
在 Acsip 自訂的 AcsipLora-Net 網路協議下,MASTER 或 SLAVE 裝置欲傳資料給予對方。
- 參數:
MASTER 裝置,需帶二個參數,一個參數為 Lora 位址,另一參數為欲傳輸的資料。
SLAVE 裝置,只需帶一個參數,為欲傳輸的資料。
- 回傳值:
(成功)OK,表示此資料傳輸事件建立成功。
(失敗)ERROR或是UNKNOW,表示此資料傳輸事件建立失敗。
補充1:欲傳輸的資料輸入必須為 Base64 編碼格式。
補充2:在事件執行完後,MASTER 與 SLAVE 各自都會自動回報是否成功的訊息,且自動回報對方傳過來的資料,此時資料也是 Base64 編碼。
11. LoraListNodes
在 Acsip 自訂的 AcsipLora-Net 網路協議下,MASTER 目前網域連結了多少 SLAVE 裝置節點及其
Lora 位址。
- 參數:(不需帶參數)
- 回傳值:
(成功)如下回傳 Nodes=1 420024 460057,表示目前有二個 SLAVE 節點連結中,且此兩節點的 Lora 位址為 420024 與 460057。
(失敗) ERROR或是UNKNOW,表示裝置目前狀態有誤,例如裝置是執行在 SLAVE 角色模式(此指令只可給 MASTER 角色使用)。
12. LoraGetGateWayAddr
在 Acsip 自訂的 AcsipLora-Net 網路協議下,SLAVE 裝置目前是連結到哪一個 MASTER。
- 參數:(不需帶參數)
- 回傳值:
(成功)如下回傳 LoraGateWayAddr=460057,表示此 SLAVE 裝置連結到一個 Lora 位址為 460057 的 MASTER 裝置。
(失敗) ERROR或是UNKNOW,表示裝置目前狀態有誤,例如裝置是執行在 MASTER 角色模式(此指令只可給 SLAVE 角色使用)。
13. GetUUID
詢問裝置的通用唯一識別碼(UUID)。
- 參數:(不需帶參數)
- 回傳值:
(成功)例如 UUID=464845343133511600460057,以上為裝置的UUID,長度是12位元組。
(失敗)ERROR或是UNKNOW。
14. GetFWVersion
詢問目前韌體的版本。
- 參數:(不需帶參數)
- 回傳值:
(成功)例如 FirmwareVersion=0.5.160411,表目前韌體版本是 0.5.160411。
(失敗)ERROR或是UNKNOW。
15. LoraGetSNR
詢問目前 Lora 的 SNR 值。
- 參數:(不需帶參數)
- 回傳值:
(成功)例如 SNR=0,單位 dB。
(失敗)ERROR或是UNKNOW。
16. LoraGetRSSI
詢問目前 Lora 的 RSSI 值。
- 參數:(不需帶參數)
- 回傳值:
(成功)例如 RSSI=-45,單位 dBm。
(失敗)ERROR或是UNKNOW。
17. FactoryReset
設定裝置回復至出廠預設值。
- 參數:(不需帶參數)
- 回傳值:
(成功)OK。
(失敗)ERROR或是UNKNOW。
18. LoraReset
重置 Lora IC。
- 參數:(不需帶參數)
- 回傳值:
(成功)OK。
(失敗)ERROR或是UNKNOW。
19. LoraPayloadLength
設定 Lora 封包的 Payload 長度。
- 參數:需帶一個參數,1~128,單位是 byte。
- 回傳值:
(成功)OK。
(失敗)ERROR或是UNKNOW。
20. LoraPreambleLength
設定 Lora 封包的 Preamble 長度。
- 參數:需帶一個參數,6~ 65535,單位是 symbol。
- 回傳值:
(成功)OK。
(失敗)ERROR或是UNKNOW。其餘Command Set功能請參閱開發說明。
Arduino UART 控制LoRa 傳送、接收範例:
傳送Command Set :
String sendLoRacmd(String cmd, unsigned int Dutytime){ String response = ""; // 接收LoRa回應值的變數 LoRa.print(cmd); // 送出LoRa命令到LoRa模組 unsigned long timeout = Dutytime + millis(); while (LoRa.available() || millis() < timeout) { while(LoRa.available()) { char c = LoRa.read(); // 接收LoRa傳入的字元 response += c; } } //Serial.print(response); // 顯示LoRa的回應 return (response); }
接收資料 :
String GS_LoRa_Receive(unsigned int Dutytime) { unsigned long timeout = Dutytime + millis(); String response = ""; // 接收LoRa回應值的變數 while (LoRa.available() || millis() < timeout) { while(LoRa.available()) { char c = LoRa.read(); // 接收LoRa傳入的字元 response += c; } } if (response == "") return(""); return(response); // 顯示LoRa的回應 }
四、結論
目前市場上對於LoRa的應用開發可說是需求若渴,而群登所提出用SiP(System in Package)製程製造的LoRa Transceiver/Standalone模組解決方案,不只讓尺寸的微型化往前邁進一大步,並針對所研發的LoRa模組系列提供完整的SDK/HDK套件,且相容於LoRaWAN,讓用戶更容易實現各種應用開發。
沒有留言:
張貼留言