LORA / LORAWAN 第二十四節之ㄧ
Remote IO
REMOTE I/O
遠端控制輸入輸出接點
- 這是一個最經典的遠端控制應用基本上的方法就是透過LoRaWAN的方式,由遠端接收接點端(Node端)的輸入(Input) High / Low 訊號。
- 另外一部分就是透過LoRaWAN 的方式,由LoRaWAN的Application Server 下行(Downlink) , 一個訊息控制遠端的接點的 High / Low 狀態。
本範例使用的裝置
- Heltec HTCC-AB01 開發板
- LED * 1
- 麵包板 * 1 (Option)
- Raspberry Pi 3A+ Board with Chirpstack LoRaWAN Project
- Li-ion Battery with 1.27 connector
本範例使用LoRaWAN的架構
安裝方式可以參考這篇LORA / LORAWAN 第二十節
本範例使用的線路
這裡我們會使用到兩個GPIO,一個是輸入一個是輸出輸入的話我們使用GPIO4,輸出的話使用GPIO5,輸入 GPIO4 使用一個10K歐姆接地而另外一頭則使用一開關接到3.3V輸出GPIO5,透過 300 ohm 接到LED +,然後LED — 接回到GND。
軟體規格
- 完成 LoRaWAN ver. 1.0.2 Class A 通訊協議
- 由 ChirpStack Project 網頁介面 Downlink Message 控制 GPIO 0 ,藉以開關外部 LED
- 由 Heltec HTCC-AB01 GPIO 5 , 以中斷執行方式通報 ChirpStack 狀態改變
完成 LoRaWAN ver. 1.0.2 Class A 通訊協議
採用 Heltec Cubecell 範例 — LoRaWan_interrupt
開發環境安裝請參考Heltec Arduino教學-下載與安裝Arduino IDE,開始使用 Heltec CubeCell 撰寫我的第一隻Arduino或是這裡
接下來我們將會使用OTAA 的方式,LoRaWAN的系統。 所以等一下我們在Chirpstack LoRaWAN 設定的時候,我們將要取得這三個參數devEui, appEui, appKey, (P.S. “app Eui” 在Chirpstack中沒有使用 ,所以只要 devEui,appKey)
接下來INT_PIN 的定義是等一下用來作為中斷驅動的GPIO定義的Pin腳, 原本範例是使用USERKEY我們這一次會使用GPIO4!
接下來我們定義了兩個Application Port, 目的是讓Application Server 接收到訊息時可以區分他是在什麼狀態下發送來的訊息,
在這裡簡單的區分為兩種一種是中斷觸發後(APPPORT)而發送的訊息,另外一種則是非中斷發生(DEVPORT)而發送的訊息
在這裡的話就是設定這些選項,一樣也可以在Arduino IDE裡設置
- OTAA / ABP : 請參考LORA / LORAWAN 第十六節 https://delorescetleh.medium.com/lora-lorawan-第十六節-a7dbd4661608
- loraWanAdr : 請參考LORA / LORAWAN 第十三節 ,你可以了解什麼是DR 及什麼是 ADR ,https://delorescetleh.medium.com/lora-lorawan-第十三節-3ec09afcd5c8
- keepNet : 這裡讓裝置可以不用每次Reset都重新跟LoRaWAN 要求Join 。
- isTxConfirmed : 這個變數應該可以在實際使用中做相對應的變化調整。 以Class A 的裝置在LoRaWAN的協議中,發出Confirmed 的訊息表示它要求一個ACK的回覆訊息,如果沒有收到它將會重傳該訊息(Retransmissions Back-off),重傳時fCNT不會被增加計數,而且必須使用隨機的間隔時間發出,並在PowerUP/Reset 之後10小時內Transmit Time 不可以超過36秒,第11小時後每隔24小時內不得超過8.4秒。
接下來將初始狀態設為非中斷觸發的狀態
這裡說明當上傳一個有要求ACK回覆的訊息時而沒有收到回覆時,這裡使用LoRaWAN 1.0.2的第18章的傳輸策略. 簡單來說就是節點端認為剛剛的訊息沒有被收到而企圖藉由調整DR下降而增加Link Margin與SNR。而這裡定義起始點為4,也就是說則假設上次的ACK沒收到,DR就減1,下次沒收到就DR就減2,再一次沒收到就DR就維持減2。
接下來進入準備訊息的副程式
然後是
這Setup()部分是則是標準的Arduino設定只會被執行一次,要留意的部分是attachInterrupt這個函數,
第一個變數為觸發的PIN腳
第二個變數為執行的副程式
第三個變數則觸發的方式
typedef enum
{
NONE=0, /*!< Disable GPIO interrupt */
RISING, /*!< GPIO interrupt type: rising edge*/
FALLING,/*!< GPIO interrupt type: falling edge*/
BOTH, /*!< GPIO interrupt type: both rising and falling edge*/
}IrqModes;
這裡我們要將它修改為”BOTH”
終於進入主程式,這裡我們分析一下這個程式
主程式通常是一直循環被執行的,不過因為我們這支程式是因中斷喚醒所以大部分時間他應該是在睡眠狀態。所以這支程式的Main Loop 部分並不會一直執行,直到它被喚醒。所以一進入主程式,就判斷如果是被中斷喚醒的,就取得時間並在Serial Port輸出。
接下來就判端 deviceState狀態,deviceState 中定義了這些狀態
分析程式源碼得知程式的週期循環方法如下
而中斷的部分則如下
然後我們要再到 LoRaWan_downlinkhandle 範例裡面找到這一副程式void downLinkDataHandle(McpsIndication_t *mcpsIndication)將它轉移過來。
然後再修改成這樣,LoRaWAN規定Application Server端Downlink 到node端時都要給個port 。我們這裡就定義成Port = 100 ; 而當收到 ‘A’ 字元時,就開啟LED,不是’A’就關掉。
最後就是Chirpstack Project了! 連上這台Raspberry Pi
建立一個 Application 與 Device 請參考這LORA / LORAWAN 第二十一節
到裝置的頁面上的下行資訊填寫下行資訊到佇列中。(要填BASE64編碼過的資料喔! 到這個網頁可以幫你轉換)
最後切換這個開關就可以上傳資料,而下行資料會在上行資料後時才會被帶回喔。
本篇結束^^
完整程式如下請參考!
下一篇 溫濕度感測器