2018年3月24日 星期六

快速開發LoRa通訊功能-UART介面篇

作者: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} 。
整個系統架構圖如下:
圖片 10
以UART介面連接LoRa模組傳送、接收(以Ameba為LoRa Gateway )架構圖
傳送端以Arduino Nano MCU與Acsip LoRa 系列EK-AI1276-401H模組利用 UART介面及3.3V連接,接線方式如下:
螢幕快照 2017-01-23 下午4.48.22
螢幕快照 2017-01-23 下午4.51.37
Arduino Nano與LoRa模組介面圖示
接收端以Realtek Ameba RTL8195 MCU與Acsip LoRa 系列EK-AI1276-401H模組利用 UART介面及3.3V連接,接線方式如下:
螢幕快照 2017-01-23 下午5.07.34
螢幕快照 2017-01-23 下午5.11.49
Arduino Nano與LoRa模組介面圖示
本實作的步驟如下:
  1. 以LoRa模組提供之UART分別連接Arduino Nano 及Ameba RTL8195開發板;
  2. 以模組提供的LoRa Command Set 設定Ameba板為MASTER 模式(LoraMode MASTER),Arduino Nano 為SLAVE 模式(LoraMode SLAVE);
  3. 由MASTER自建Acsip 自訂的 AcsipLora-Net 網路協議下,MASTER 裝置邀請 SLAVE 裝置加入私有網(LoraJoinNode slveUUID), MASTER及SLAVE端即可利用  LoraNodeData command 傳送資料給對方;
  4. 由Ameba 當MASTER 接收Arduino Nano SLAVE端定時傳送溫溼度感測器及PM2.5感測值資料,並以JSON格式傳送;
  5. 以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網傳送、接收功能。

圖片 11
GUI 模擬測試工具軟體:LoRa_Terminator

螢幕快照 2017-01-23 下午4.06.20
軟體內建的選單式Command Set

常用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,讓用戶更容易實現各種應用開發。
Acsip LoRa SiP
Acsip以SiP技術開發微型化 LoRa模組,並提供完整的技術支援。(圖片來源:Acsip)

沒有留言:

張貼留言