Ameba Arduino: [RTL8195] 使用 Dragino Lora 擴展版

材料準備

  • Ameba x 1
  • Dragino LoRa Shield x 2

範例說明

Dragino Lora擴展板基於開放源碼庫,允許用戶發送數據,能夠達到極長的傳輸範圍,並且在低 data-rates提供超遠距離擴頻通信和高抗干擾性的同時儘量減少電流消耗,而因各個國家有不同的頻段規劃,在購買時請留意LoRa Shield所使用的頻段。

LoRa Library請至下列連結下載:
https://github.com/Ameba8195/Arduino/blob/master/libraries/AmebaLoRa.zip

安裝library的方式請參考Arduino官方網站的教學文章將zip檔的library加入Ameba:
https://www.arduino.cc/en/Guide/Libraries#toc4

Dragino LoRa Shield SPI範例接線說明如下:

Dragino LoRa Shield可以直接嵌合在Ameba板子上,但由於Ameba的CS pin與標準的SPI協議相比有其特殊性,因此Dragino LoRa Shield的CS pin不能直接與Ameba的CS pin相連接,於此在Dragino LoRa Shield上的修改需將CS pin也就是pin 10的腳位往內扳,並且使用杜邦線接至pin 0,如下圖示:

3

而Dragino LoRa Shield的SPI Data是從ICSP的SPI BUS產生的,因此如同以下圖示接至AMEBA的SPI腳位:

3

  • 範例使用說明

本範例中同時使用send及receive程式碼,來作2塊Dragino LoRa Shield的功能驗證,一塊是發送端,另一塊是接收端,我們打開範例 “File” -> “Examples” -> “AmebaLoRa” -> “LoRaSender”及LoRaReceiverCallback, 分別編譯並上傳至Ameba之後按下Reset按鈕,就可以在終端機看到底下的結果:

3

程式碼說明

程式開始時進入setup()會先利用begin() method初始化LoRa class,裡頭帶的參數915E6與其RF的頻率相關,在此不作變更

LoRa.begin(915E6);

LoRaSender發送端:
進入loop()裡,發送端的工作則是先呼叫beginPacket() method,開始進入發送的程序,而使用print(“hello ”) method,則可以讓LoRa送出hello字串的參數,最後再呼叫endPacket() method,即完成發送端的程序

LoRa.beginPacket();
LoRa.print("hello ");
LoRa.print(counter);
LoRa.endPacket();

LoRaReceiverCallback接收端:
本接收端範例使用onReceive callback的方式來接收傳送端送過來的訊息,在setup()裡,作完begin() method後利用onReceive(void * cbfunction) method,來觸發註冊的cbfunction函式

LoRa.onReceive(onReceive);
LoRa.receive();

接著使用receive() method進入LoRa的receive mode
範例中在onReceive裡註冊的callback函式名稱為onReceive,當被觸發時會帶有收到多少字節的packetSize參數

void onReceive(int packetSize) {
  // received a packet
  Serial.print("Received packet '");
  // read packet
  for (int i = 0; i < packetSize; i++) {
    Serial.print((char)LoRa.read());
  }
  // print RSSI of packet
  Serial.print("' with RSSI ");
  Serial.println(LoRa.packetRssi());
}

要讀取收到的字節只要呼叫read() method,範例中使用了迴圈,依收到字節的大小依序印出字串:

  for (int i = 0; i < packetSize; i++) {
    Serial.print((char)LoRa.read());
  }

最後使用packetRssi() method可以得到目前RSSI的數值

Serial.println(LoRa.packetRssi());