2018年1月2日 星期二

Arduino + LoRa 模組測試

這篇是去年 10 月底對 LoRa 模組進行初步測試的紀錄, 後來忙著幫二哥準備 APCS 而暫停下來. 昨天有網友問我空曠處實測距離多少, 才想起這篇還沒完成的草稿, 稍作整理如下備查. 在傳送距離方面, 網友與我的實測距離都約 200~250 米而已, 據說使用 IPEX 天線似乎沒有好到哪裡去, 實在殘念! 我還抱著一絲希望的說.

會接觸 LoRa 是因為去年十月初有另一位網友詢問我有無用過 LoRa, 當時我連買了放在零件箱好久的 nRF24L01 模組都還沒動哩! 為此我除了找出 nRF24L01 先測試一番以產生比較資料外, 還上網對此新興無線射頻技術做了初步研究, 整理了一篇知識摘要, 參見 :

長距離低功耗無線通訊技術 LoRa

接著在露天購買了一對最便宜的 LoRa 模組來測試 (跟 nRF24L01 一樣要成對地買, 一個傳送, 一個接收, 或者互相傳送接收), 此板用的是 SX1278 晶片 (433 MHz)  :

[史塔克實驗室][Arduino/RPi]每個180元2個一組販售SX1278 Lora module 模組433MHz $180

由於這是 2.0mm 腳距的裸板, 所以特地跑去禾樺買了 2.0 mm 的排針與排母, 在焊接前試試看到底要用排針或排母比較適合, 結果發現排針根本不能用, 因為 2.0mm 的排針比較細, 杜邦線母頭插上去鬆鬆的會接觸不良, 應該要用排母才對, 因為 2.0mm 的排母上的洞與一般 2.54mm 者一樣, 插杜邦線沒問題.

我買的這組 LoRa 模組每邊 8 隻腳, 其腳位布局如下 :


 DIO2 GND 
 DIO1 MISO 
 DIO0 MOSI 
 3.3V SCK 
 DIO4 NSS 
 DIO3 RESET 
 GND DIO5 
 ANT GND 


由於 ANT 腳要焊彈簧天線, 因此左邊的排母只要 7 隻腳, 而右邊的則需 8 隻腳, 使用小型電鑽前面裝上鑽石圓盤分別切出 7 支與 8 支腳的排母各一對, 然後用三秒膠少許加以固定後進行焊接. 注意, 三秒膠不可用太多, 否則萬一滲入排母內會讓排針插不下去.


Lora 板子焊好後就可以進行測試了, 我使用 Arduino 當作 MCU 主控, 首先是到下列 GitHub 網站下載 Arduino 的 Lora 函式庫 :

https://github.com/sandeepmistry/arduino-LoRa

按右邊的 "Clone or download" 鈕, 選 "Download ZIP" 下載壓縮檔 arduino-LoRa-master.zip, 將其複製到 Arduino IDE 安裝目錄的 libraries 下解開即可. 重新開啟 IDE 就可存取到此函式庫了. 此函式庫的 API 說明如下 :

https://github.com/sandeepmistry/arduino-LoRa/blob/master/API.md

此函式庫使用 SPI 協定與 LoRa 模組通訊, 預設傳輸速率是 10 MHz. 接下來是硬體接線, 此 LoRa 模組採用 SPI 介面 (也有用 Serial 介面的), Arduino 有特定的 SPI 接腳, 與 LoRa 的預設對應如下 :


不過其中 NSS, RESET, 與 DIO0 這三隻腳不一定要對應到 D10, D9, 與 D2 這三支 Arduino 腳, 可以連接到除 D13, D12, D11 以外的任何 DIO 腳位, 但在程式中要用 LoRa.setPins(NSS, RESET, DIO0) 指令指定.

測試 1 :

傳送端程式 :

#include <SPI.h>
#include <LoRa.h>

int counter=0;  //傳送次數計數器

void setup() {
  Serial.begin(9600);
  while (!Serial);  //等待序列埠起始完畢
  Serial.println("LoRa Sender");
  if (!LoRa.begin(433E6)) {  //起始 433MHz LoRa
    Serial.println("Starting LoRa failed!");
    while (1);
    }
  }

void loop() {
  Serial.print("Sending packet: ");
  Serial.println(counter);
  LoRa.beginPacket();  //封包傳送開始
  LoRa.print("hello ");  //封包內容
  LoRa.print(counter);  //封包內容
  LoRa.endPacket();  //封包傳送結束
  counter++;  //計數器增量 1
  delay(5000);
  }


接收端程式 :

#include <SPI.h>
#include <LoRa.h>

void setup() {
  Serial.begin(9600);
  while (!Serial);  //等待序列埠起始完畢
  Serial.println("LoRa Receiver");
  if (!LoRa.begin(433E6)) { //起始 LoRa
    Serial.println("Starting LoRa failed!");
    while (1);
    }
  }

void loop() {
  int packetSize=LoRa.parsePacket(); //讀取剖析 LoRa 封包大小
  if (packetSize) { //若有封包進來
    Serial.print("Received packet '");
    while (LoRa.available()) { //若接收緩衝器有內容
      Serial.print((char)LoRa.read());  //讀取緩衝器內容並輸出階收到的封包
      } 
    Serial.print("' with RSSI="); //輸出接收封包之 RSSI
    Serial.print(LoRa.packetRssi());  //顯示接收信號強度
    Serial.print(" and SNR="); //輸出接收封包之 SNR (信噪比)
    Serial.println(LoRa.packetSnr());  //顯示接收信號信噪比
    }
  }

序列埠監控視窗輸出結果如下, 收到訊號時會顯示 "Received packet ... RSSI= .... SNR=...." :
.....
irqFlags 0
irqFlags 10
irqFlags 40
Received packet 'hello 29' with RSSI=-39 and SNR=16.00
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 80
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 80
irqFlags 0
.....
irqFlags 10
irqFlags 40
Received packet 'hello 30' with RSSI=-51 and SNR=15.75
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 0
irqFlags 80
irqFlags 0
.....

其中 RSSI (Received Signal Strength Indicator) : 接收信號强度指示.

用彈簧天線於空曠地區實測距離約 250 公尺, 似乎只比 nRF24L01 的 100 公尺長兩倍多而已, 與產品說明中所說的 1 公里相差達 4 倍. 不過信號穿透力可達 2~3 層樓, 在電梯中亦可收到信號, 這就比 nRF24L01 出色多了, nRF24L01 只要 5 公尺外轉個牆角就 GG 了, 參考 :

Arduino 無線傳輸模組 NRF24L01 測試

測試距離方面, 有空我還是會買支 IPEX 或其他廠家的 LoRa 模組來驗證看看.

參考 : 

Arduino Arduino module communication by Lora Sx1278
https://github.com/matthijskooijman/arduino-lmic
【Acsip LoRa實作1】快速開發LoRa通訊功能-SPI介面篇
An Arduino library for sending and receiving data using LoRa radios
LoRa 的 Arduino 函式庫
【Acsip LoRa實作1】快速開發LoRa通訊功能-SPI介面篇
WLK01S78-TH 無線模組 LORA模組 SX1278數傳模組 w7 056 [5059647] $260
# LoRa 測試資料下載  (測試地圖快照) (測試地形圖)
<微控制器科技> Pycom LoPy IoT 三合一開發板 (LoRa+BLE+WiFi) $1350
Pycom LoPy - LoRa+WiFi+Bluetooth MicroPython IoT Platform £32.5
https://github.com/a3rd/lora-inair4
SX1278 LoRa擴頻無線模組 433Mhz $220
大陸模組資料下載
https://drive.google.com/drive/folders/0BywdxdAWyMLcWXpFNF9QVWhHZHc
SX1278 LOra擴頻 電力抄表模組 5km無線收發模組SX1276模組 $200
iFrogLab iL-LORA1272 超遠端15公里LoRa資料傳遞和接收模組 for Arduino 和 樹梅派 $850
iFrogLab iL-LORA1272-A LoRa 資料傳遞和接收模組 韌體全面更新為1.1版 $850
98 Mailbag #8: LoRa, ESP8285, ESP32 in a WiPy Python board, A6C with camera
# LoRa 範例程式下載
Setting Up the Modtronix InAir4 with Arduino

2018-01-03 補充 :

下面這部影片測試 LoRa 的耗電情形 :

#120 LoRa on batteries: How long does it last?



26 則留言 :

匿名 提到...

不好意思問一下
若作想一個 距離公里級 溫度傳輪 到透過wifi 連上網路,再把數據傳到伺服器
伺服器 用Raspberry Pi
在用手機 app 去監看


這樣的功力要學多久??

匿名 提到...



不好意思 初學者,敎請一下基本問題

A.
void setup()
...

Serial.println("LoRa Sender"); <===這一句意思,是輪出LoRa Sender訊號 給LoRa ,LoRa 得到LoRa Sender 訊號 開始工作 是這樣的意思嗎??


b
Serial.print("Sending packet: "); <=一句意思,通知LoRa 要開始寄封包了嗎??
Serial.println(counter); <==這一句意 就不了解 ??


c.
Serial.print <==能指定pin 嗎??

問題 一個uno 配多的 lora ,跟其他設備, 這樣Serial.print怎麼知道輸出去那裡
設備


小狐狸事務所 提到...

A.
Serial.println("LoRa Sender");
表示 Arduino 對串列埠送出顯示字串, 打開 Arduino 的串列埠監控視窗可看到此輸出, 表示 Arduino 有在工作, 開發時除錯用的.

B.
Serial.print("Sending packet: "); 表示 Arduino 對串列埠送出顯示字串
Serial.println(counter); 表示 Arduino 對串列埠送出顯示全域變數 counter 值

C. Serial.print() 這函數只輸出至序列埠 TX, RX (經電腦之 USB)

LoRa 與 Arduino 通訊是透過上圖的 SPI 介面

Unknown 提到...

老師你好

我又看到你這一篇,我想請問那有辦法不用arduino只利用TX、RX的腳位控制RoLa的控制嗎?

小狐狸事務所 提到...

可以喔! 但要買 LoRa UART 介面的模組, 我買的是 SPI 模組. 參考 :
https://makerpro.cc/2017/01/how-to-build-acsip-lora-with-uart-interface/

小狐狸事務所 提到...

露天有賣, 一片 450 元
http://goods.ruten.com.tw/item/show?21807681215562

Unknown 提到...

感謝老師回答,但是我還是有一些問題

http://wiki.ai-thinker.com/lora

這塊RoLa模組是屬於哪一個介面啊?是不是就是SPI介面?

小狐狸事務所 提到...

是 SPI 沒錯.

Unknown 提到...

老師你好

感謝你的回答,我稍微看你這篇的SPI介面的程式碼

那個arduino部分是不是只有用他的IDE,事實上並沒有接arduino版?

那如果我不用arduino IDE的話,我是不是就要用另一套IDE是 KAIL去做燒錄的動作嗎?

小狐狸事務所 提到...

Arduino 當然要接, IDE 是透過 USB 介面將程式燒錄到 Arduino 內. Arduino 程式透過 spi 介面與 lora 溝通.

猴子 提到...

老師您好:
請教一下 程式看起來沒有針對Lora裝置做認證的動作只要發送資訊所有可接收範圍內的Lora都能接收到
這樣會不會有資訊安全的問題 有方法解決嗎?

小狐狸事務所 提到...

是有安全顧慮, 不過 LoRa 已廣為使用, 應該有安全設定, 我也只是初步測試, 還沒深入研究.

Unknown 提到...

老師你好我是買LORA的擴充板
請問可以使用你的程式碼嗎
然後我想問一下擴充板上有RX TX嗎
因為我一直不知道該如何接

小狐狸事務所 提到...

程式都是分享請放心使用, LoRa 板子主要有 SPI 與 UART 兩種介面, UART 的有 TX/RX 比較方便, 但稍貴一些.

阿秉 提到...

老師你好
如果想單純利用lora
遠離門鎖自動上鎖
需要哪些材料呢

小狐狸事務所 提到...

Sorry, 還沒想過這樣的應用哩, 應該需要一個 Lora 板子, Arduino, 電磁鐵, 電源模組等等.

信常之野望神人 提到...

老師您好
最近專題有要用到Lora
請問這篇的方法適用於915mhz 嗎?

請問可以加賴詢問相關資訊嗎?

小狐狸事務所 提到...

Hi, 您好, 其實我 LoRa 淺嚐即止, 還沒時間多研究, 但頻率差異只是在空中介面, 在邏輯層是一樣的, 主要是看實體層連線介面, 上面是 SPI 介面, 如果買的是 UART 介面的 LoRa 板子, 程式是不一樣的.

匿名 提到...

老是您好
請問您說的能穿透2~3樓是指能穿透水泥嗎??
請問SX1278能多對一嗎??(多個發射,一個接收)

小狐狸事務所 提到...

是的, 可穿透樓層, 在空曠處依據不同型式天線, 距離可達數公里遠. LoRa 基本上是 Star 網路結構, 本質上就是多對一, 能接幾個 nodes 取決於作為 Gateway 那個的最大封包量.

匿名 提到...

老師您好
我想請問一下,我在另一個文章上有看到「Lora 模式中,最大發送或接收的長度是256個字節」,所以這表示做為 Gateway的模組最大接收量就是256個字節,然後根據訊號傳送的損失率往下遞減嗎?
如果要多對一的話,作為 nodes的模組是不是要分開時間發送資料?還是可以同時發送?

小狐狸事務所 提到...

抱歉, 我對 LoRa 尚未進行深入研究, 所以還不清楚.

匿名 提到...

老師您好
最近想嘗試使用LORA傳輸訊息,所以試試看老師提供的程式碼,但在監控視窗卻只看到starting lora failed,常試過其他頻率卻呈現一樣的狀況,想請問老師是不是有什麼要先下載還是要先開通的程式?

小狐狸事務所 提到...

Hi, 真的很抱歉, 我到現在都還沒時間繼續學習 Lora, 所以幫不上忙, Sorry!

匿名 提到...

老師您好! 請問想在接收端的LoRa上使用七段顯示器,去把接收到的資料做加一減一的計數是可行的嗎,還是都要在發送端去使用呢?!

小狐狸事務所 提到...

運算在接收端或傳送端做都可以喔! 這是 Arduino 的事.