Menu
【Tutorial】用群登LoRa智慧積木自建LoRaWAN網路

 

Posted on 十二月 5, 2017

作者:柯大

 

本文將為大家介紹如何用群登科技(Acsip)的LoRa開發套件來自建LoRaWAN網路,這個開發套件是LoRa Smart Blocks Development Kit ,含LoRa智慧型積木組件及正文 Gemtek Indoor Gateway。

DIGITIMES企劃

群登這套LoRa智慧型積木組件採用通過LoRa Alliance、CLAA、Actility等多重認證的S76S/S78S LoRa模組,透過感測板(Sensor Board)、LoRa板(LoRa Board)及電池板(Battery Board)來組合成一積木式套件,一舉滿足LoRa物聯網應用開發的三大重點:主控板、LoRaWAN及電源需求,進一步降低進入物聯網領域的門檻,協助Maker們快速熟悉LoRa Smart Blocks,輕鬆利用這些軟硬體智慧積木,組合搭配出各式各樣的物聯網應用,讓Maker輕易完成概念性驗證(Proof of Concept),加速物聯網產品上市時程。

LoRa Smart Blocks方案的感測板採用使用者最為熟悉,且軟、硬體整合功能強大的Arduino開發板,讓使用者得以在此開發平台上輕易地與各種Sensor進行整合。LoRa 板則是採用群登號稱全球體積最小的S76S LoRa通訊模組,透過UART介面將感測板的Sensor訊號由LoRa模組傳送至Gateway及雲端平台。積木式套件另提供電池板,可使LoRa開發板自備電源,使得供電方式更為彈性,方便戶外測試更為便利。

LoRa Smart Blocks 套件主要積木組件規格如下:

1.LoRa Board :S76S SemtechSX1276

2. Sensor Board (compliant Arduino UNO)

  • MCU: ATmega328P ,提供GPIO/I2C/ADC/UART
  • 開發環境: Arduino
  • 感測器:內建SHT30高精度溫溼度感測、MC3630 mCube 3軸加速器,二種感測器均為I2C介面,Address分別為0x45、0x6C
  • 程式燒錄:AVR ISP(透過ICSP 連接Arduino UNO SPI介面,Arduino as ISP方式燒錄)

3. Battery Board:Lithium/ 3.7V /300mAh

4. Gemtek LoRa Indoor Gateway Unit:Gemtek indoor 16 channel LoRaWAN Gateway

LoRa Smart Blocks Development Kit ,主要智慧型積木組件接腳圖如下:

程式燒錄透過Sensor Board ICSP 連接Arduino UNO SPI介面,以Arduino as ISP方式燒錄。

Arduino UNO與Sensor Board接腳連接方式如下,詳細燒錄步驟請參考群登科技所提供的文件及範例。

  1. UNO D13 ←→ ICSP SCK (pin 3)    UNO D12 ←→  ICSP MISO (pin 1)
  2. UNO D11 ←→ ICSP MOSI (pin 4)   UNO D10 ←→  ICSP REST (pin 5)
  3. UNO 5V ←→  ICSP +5V (pin 2)    UNO GND ←→  ICSP GND (pin 6)

LoRa Smart Blocks的S76S LoRa通訊模組同時支援Node to Node 的P2P自建LoRa網及LoRaWAN 1.0.2協議LoRa網路架構。Smart Blocks的LoRa Board S76S LoRa Command 指令集類型分為:SIP commands指令集、MAC commands指令集、RF commands指令集等3種指令類型,並依模組的運作模式分為:LoRaWAN 模式指令、Node to Node 模式指令。

UART 連線預設參數為:115200,N,8,1,可利用Serial port control software 來測試。

SIP commands:LoRa晶片模組內部指令集

  1. sip factory_reset :恢復參數為出廠設定值
  2. sip get_ver : 讀取firmware version.
  3. sip get_hw_deveui :讀取Get hardware EUI
  4. sip reset :重置模組
  5. sip get_hw_model : 讀取hardware model & firmware version
  6. sip set_echo <Status>:Enable or disable UART echo mode;<Status>: on or off
  7. sip set_log <Log_Level> :<Log_Level> debug: show all logs, info ,顯示log
  8. sip sleep <Time> <Interruptible> :<Time>:設定 sleep time in seconds,2-65536.;<Interruptible> 當sleep mode時可否由UART叫醒,uart_on/uart_off;Example: sip sleep 100 uart_on
  9. sip set_baudrate <baudrate> <password> :<baudrate>:9600,19200, 57600 and 115200.;<password>:password baudrate protection;Example: sip set_baudrate 9600 12345678
  10. sip_get_hw_model_ver:讀取hardware model  

MAC commands:LoRa MAC協議指令集

設定頻段之各Channel頻段預設如下:可用mac set_ch_freq指令更改各Channel頻段

LoRa MAC協議指令集

  1. mac set_band <FreqBand>:設定頻段 <FreqBand>: 470, 868, 902, 915, 923, 922,924.  Example: mac set_band 923
  2. mac tx <Type> <PortNum> <Data> : 傳送資料 <Type>:transmitting message  cnf (confirmed) or ucnf(unconfirmed).;<PortNum>:port number for transmission, 1~223.;<Data>:hexadecimal string data to be transmitted. (e.g. 98ba34fd means “0x98, 0xba, 0x34, 0xfd 4bytes would be sent out”);Example: mac tx ucnf 15 98ba34fd
  3. mac join <Mode> :設定加入LoRaWAN 方式。 <Mode>:LoRaWAN join mode:otaa (over‐the‐air activation) or abp(activation by personalization)
  4. mac save :儲存LoRaWAN 參數值.
  5. mac get_join_status :讀取 LoRaWAN join status
  6. mac set_deveui <DevEUI>:設定Device EU。<DevEUI>:8‐byte hexadecimal Device EUI for LoRaWAN.
  7. mac set_appeui <AppEUI>:設定 Application EUI 。<AppEUI>:8‐byte hexadecimal Application EUI for LoRaWAN.
  8. mac set_appkey <AppKey>:設定 Application Key 。<AppKey>:16‐byte hexadecimal Application Key for LoRaWAN.
  9. mac set_devaddr <DevAddr> :設定Device Address。<DevAddr>:4‐byte hexadecimal Device Address for LoRaWAN.
  10. mac set_nwkskey <NwkSessionKey>:設定Network Session Key。<NwkSessionKey>:16‐byte hexadecimal Network Session Key for LoRaWAN.
  11. mac set_appskey <AppSessionKey>:設定Application Session Key。<AppSessionKey>:16‐byte hexadecimal Application Session Key for LoRaWAN.
  12. mac set_power <Power>:設定transmitting power in dBm。<Power>:non‐915 band:2, 5, 8, 11, 14, 20;915 band:30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10;470 band:17, 16, 14, 12, 10, 7, 5, 2
  13. mac set_dr <Datarate>:設定 data rate。<DataRate>:0 ~ 6
  14. mac set_txretry <RetryCount>:設定重傳次數。<RetryCount>:0 ~255
  15. mac set_rxdelay1 <Delay> :設定接收窗RX#1 間隔時間,<Delay>:0 ~65535 ms. 接收窗RX#2 將被設定 <Delay>+1
  16. mac set_rx2 <DataRate> <Frequency> : 設定接收窗RX#2接收rate及頻段;<DataRate>:868band:0 ~ 7 , 470 band: 0 ~ 5 , 902‐924 band: 0 ~ 15;<Frequency>:862000000 ~  932000000 Hz
  17. mac set_ch_freq <ChannelId> <Frequency>:設定指定Channel 頻段;<ChannelId>:EU868: 0 ~ 15; US902: 0~71;<Frequency>:902‐924 band: 902000000~932000000;470 band : 470000000 ~510000000;other bands :433000000 ~ 932000000
  18. mac set_ch_dr_range <ChannelId> <MinDR> <MaxDR;<ChannelId>: EU868 range : 0 -15; US902: 0 – 71;<MinDR>: minimum data rate, 0 -6;<MaxDR>: maximum data rate, 0 – 6.;Example:mac set_ch_dr_range 0 0 6
  19. mac set_ch_status <ChannelId> <Status>;<ChannelId>: EU868 range : 0 -15; US902: 0 – 71;<Status>: on or off.;Example:mac set_ch_status 0 on
  20. mac get_dc_ctl <on /off> :讀取duty cycle status
  21. mac set_dc_ctl <on /off> :設定duty cycle status
  22. mac get_dc_band <BandID> :讀取<BandID> duty cycle
  23. mac set_upcnt:讀取Uplink計數值
  24. mac set_downcnt:讀取Downlink計數值
  25. mac get_class:讀取 LoRaWANTM class type
  26. mac get_devaddr:讀取devaddr值
  27. mac get_deveui:讀取deveui值
  28. mac get_appeui:讀取appeui值
  29. 29.mac get_nwkskey:讀取network session key值
  30. mac get_appskey:讀取application session key值
  31. mac get_appkey:讀取appkey值
  32. mac get_dr:讀取LoRaWANTM data rate值
  33. mac get_band:讀取頻段值
  34. mac get_power:讀取發射power值
  35. mac get_txretry:讀取重傳次數
  36. mac get_rxdelay:讀取接收窗RX#1 RX#2間隔時間
  37. mac get_rx2:讀取接收窗RX#2接收rate及頻段
  38. mac get_ch_para <ChannelId>:讀取 channel 設定的參數值
  39. mac get_ch_status <ChannelId>:讀取 channel on/off狀態

RF commands:LoRa RF發射接收指令集

發射接收指令集

  1. rf tx <Data>:傳送資料<Data>: hexadecimal string
  2. rf rx <RxWindowTime> :等待接收資料(0-65535ms),0:等待至收到資料。
  3. rf set_freq <Frequency>:設定頻段:862000000 to 932000000 (868 to 924 bands);137000000 to 525000000 (433 or 470 band).
  4. rf set_pwr <Power>:設定發射功率:0-20dBm
  5. rf set_sf <SpreadingFactor>:設定SF值:7-12
  6. rf set_bw <BandWidth>:設定頻寛:125, 250, 500
  7. rf set_cr <CodingRate>:設定code rate:4/5, 4/6, 4/7, 4/8
  8. rf set_prlen <PreambleLength>:設定preamble length: 0 – 65535
  9. rf set_crc <State>:設定 CRC on/off
  10. rf save:Save p2p configuration parameters to EEPROM
  11. rf get_freq:讀取p2p頻段
  12. rf get_pwr:讀取power值
  13. rf get_sf:讀取SF值
  14. rf get_bw:讀取頻寛值  

LoRaWAN command測試

Join ABP mode

測試mode

 // Set channel frequency channel number and frequency depends on server configuration

 

mac set ch_freq 0 926500000

>> Ok

mac set ch_freq 1 926700000

>> Ok

mac set ch_freq 2 926900000

>> Ok

// Set following according to LoRaWAN configuration

mac set_devaddr 00220009

>> Ok

mac set_nwkskey 965F6942F29C9EBE5747E25F07DA5114

>> Ok

mac set_appskey A46847D184323C21C992D8F9EF4B7CE9

>> Ok

// Activation by Personalization

mac join abp

>> Ok

>> accepted

// Send unconfirmed uplink on port 15

mac tx ucnf 15 1234

>> Ok

>> tx_ok

Join OTAA mode

測試mode

 // Set channel frequency channel number and frequency depends on server configuration

 

mac set_ch_freq 0 926500000

>> Ok

mac set_ch_freq 1 926700000

>> Ok

mac set_ch_freq 2 926900000

>> Ok

// Set following according to LoRaWAN configuration

mac set_deveui 9c65f9fffeabcd12

>> Ok

mac set_appeui 70B3D57ED000059E

>> Ok

mac set_appkey C1FE94B0F5F6A50E83015B3C45C933A9

>> Ok

// Over‐the‐Air Activation

mac join otaa

>> Ok

>> accepted

// Send unconfirmed uplink on port 15

mac tx ucnf 15 1234

>> Ok

>> tx_ok  

Confirmed Uplink and Downlink

測試mode

 // Send confirmed uplink on port 15

 

mac tx cnf 15 1234 // Send 0x12, 0x34 to server

>> Ok

>> tx_ok

mac tx cnf 15 1234

>> Ok

>> err // Fail to get confirm from server

mac tx cnf 15 1234

>> Ok

>> rx 15 6432 // Receive downlink (0x64, 0x32) from server on port 15 

Node to Node command測試

測試mode

rf set_sync 12 // Set SyncWord to 0x12

 

>> Ok

rf set_freq 926500000 // Set frequency to 926500000Hz

>> Ok

rf set_sf 7 // Set spreading factor to 7

>> Ok

rf set_bw 125 // Set bandwidth to 125KHz

>> Ok

// Send LoRa packet

rf tx 1234567890

>> Ok

>> radio_tx_ok

// Receive LoRa packet

rf rx 10000 // Open an 10s receive window

>> Ok

>> radio_rx 1234567890 ‐90 7.2 // Received data, RSSI and SNR 

自組LoRaWAN實作介紹

可利用LoRa Smart Blocks套件所提供的積木式LoRa Node(結合了Arduino Sensor board內建的SHT30高精度溫溼度感測、MC3630 mCube 3軸加速器感測器),以Arduino 範例連接到Kit所提供的Gemtek Indoor LoRa Gateway 進行實作測試,步驟如下:

1.連線進入Gateway後台,設定LoRa Node 以OTAA方式Join LoRaWAN 之AppEUI、DevEUI、DevAddr、AppKey。

2.設定LoRa Node 以ABP方式Join LoRaWAN 之DevAddr、NwksKey、AppsKey。

3.設定Gemtek Indoor LoRa Gateway Network Server 以及MQTT forward LoRa 封包。

4.查看Gemtek Indoor LoRa Gateway WAN的MAC Address。

5.利用MQTTBox Client 接收LoRa Gateway Network Server forward 的LoRa 封包。

6.查看Gemtek Indoor LoRa Gateway LoRa Module 1,2各channal 設定的頻段

7.LoRa board (S76S) 端連接至LoRa Gateway LoRaWAN ABP方式:

(1)利用Serial port 連線軟體測試

範例程式

mac set_deveui FFFFFFFFFFFFFFFF

mac set_appkey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

mac set_devaddr FFFFFFFF

mac set_appskey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

mac join abp

mac get_deveui

mac get_devaddr

mac get_nwkskey

mac get_appskey

mac get_appkey

//啟動 Channel0-Channel15 配合 Gemtek Indoor 16Channel Gateway

mac set_join_ch 0 on

mac set_join_ch 1 on

mac set_join_ch 2 on

mac set_join_ch 3 on

mac set_join_ch 4 on

mac set_join_ch 5 on

mac set_join_ch 6 on

mac set_join_ch 7 on

mac set_join_ch 8 on

mac set_join_ch 9 on

mac set_join_ch 10 on

mac set_join_ch 11 on

mac set_join_ch 12 on

mac set_join_ch 13 on

mac set_join_ch 14 on

mac set_join_ch 15 on

//設定 Channel0-Channel15 頻段,配合 Gemtek Indoor 16Channel Gateway

mac set ch_freq 0 922625000

mac set ch_freq 1 922875000

mac set ch_freq 2 923125000

mac set ch_freq 3 923375000

mac set ch_freq 4 923625000

mac set ch_freq 5 923875000

mac set ch_freq 6 924125000

mac set ch_freq 7 924375000

mac set ch_freq 8 925125000

mac set ch_freq 9 925375000

mac set ch_freq 10 925625000

mac set ch_freq 11 925875000

mac set ch_freq 12 926125000

mac set ch_freq 13 926375000

mac set ch_freq 14 926625000

mac set ch_freq 15 926875000

mac set_ch_dr_range 0 0 3

mac set_ch_dr_range 1 0 3

mac set_ch_dr_range 2 0 3

mac set_ch_dr_range 3 0 3

mac set_ch_dr_range 4 0 3

mac set_ch_dr_range 5 0 3

mac set_ch_dr_range 6 0 3

mac set_ch_dr_range 7 0 3

mac set_ch_dr_range 8 0 3

mac set_ch_dr_range 9 0 3

mac set_ch_dr_range 10 0 3

mac set_ch_dr_range 11 0 3

mac set_ch_dr_range 12 0 3

mac set_ch_dr_range 13 0 3

mac set_ch_dr_range 14 0 3

mac set_ch_dr_range 15 0 3

mac set_dc_ctl on

mac save

// Test

mac tx ucnf 2 123456F1    //Hex value 

(2)利用Arduino 測試Sample

範例程式

#include <Wire.h>

#include <MC3630.h>

//20170818 By CM =================================

//1. Change LED driver pin to PIN 13 (From Pin 4)

//2. Fix Downlink Bug

#define VERSION    1.1.4

//=================================================

//CM, DL control

#define CMD_NONE 0

#define CMD_HIGH 1

#define CMD_LOW 2

#define CMD_TOGGLE 3

uint8_t     data[8], i;

uint8_t     LED_PIN = 13;   //CM, Change to LED driver PIN 13 (PB5)

uint8_t     gDL_return_val=0;

MC3630      MC3630_acc = MC3630();

void setup() {

MC3630_acc.start();

Wire.begin();

//pinMode(10, OUTPUT);  //PB2

pinMode(4, OUTPUT);   //PD4

pinMode(LED_PIN, OUTPUT);   //PB5

digitalWrite(LED_PIN, HIGH);

//digitalWrite(4, HIGH);

Serial.begin(115200);

delay(1000);

/*

* you can setting LoRaWAN parameter by Ardurion, or saving parameter into EEPROM first.

*/

//Serial.print(“mac set_deveui FFFFFFFFFFFFFFFF”);

delay(100);

//Serial.print(“mac set_appkey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”);

delay(100);

//Serial.print(“mac set_devaddr FFFFFFFF”);

delay(100);

//Serial.print(“mac set_nwkskey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”);

delay(100);

//Serial.print(“mac set_appskey FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF”);

delay(100);

/*

*  joining by otaa (or abp), you should be get a accepted message.

*/

Serial.print(“mac join abp”);

delay(5000);

}

/*

* Send a ASCII packet by command “mac tx”

*/

void LoRaPackageTx(String keyword, float data)

{

String  str1, str2;

char    test[64];

int   i;

str1 = keyword+ data;

for(i=0; i<str1.length(); i++)

{

test[(i<<1)] = str1[i]>>4;

test[(i<<1)+1] = str1[i]&0xF;

if(test[(i<<1)]<0xA)  test[(i<<1)] = test[(i<<1)] +0x30;

else                  test[(i<<1)] = test[(i<<1)] +0x57;

if(test[(i<<1)+1]<0xA)  test[(i<<1)+1] = test[(i<<1)+1] +0x30;

else                  test[(i<<1)+1] = test[(i<<1)+1] +0x57;

}

test[(i<<1)] =  0x00;

str2 = test;

str1 = “mac tx ucnf 2 ” + str2;

Serial.print(str1);

//digitalWrite(4, HIGH);  //CM, For Debug

//digitalWrite(13, HIGH);

return;

}

/*

* Wait for 10 seconds, Breaking when if got “tx_ok”

*/

void WaitTxAck()

{

uint8_t     test[64], len, count, i;

for(count=0; count<50; count++)

{

len = Serial.available();

if(len>0)

{

Serial.readBytes(test, len);

for(i=0; i<len; i++)

{

if (test[i]==’m’)

{

if((test[i+1]==’a’)&&(test[i+2]==’c’)&&(test[i+3]==’ ‘)&&(test[i+4]==’r’)&&(test[i+5]==’x’))

{

if(test[i+10]==’0′)

{

gDL_return_val = CMD_LOW;

}

else if(test[i+10]==’1′)

gDL_return_val = CMD_HIGH;

else

gDL_return_val = CMD_TOGGLE;

len = 0;

}

}

else if (test[i]==’t’)

{

if((test[i+1]==’x’)&&(test[i+2]==’_’)&&(test[i+3]==’o’)&&(test[i+4]==’k’))

{

len = 0;  //CM, Uplink done.

//digitalWrite(4, LOW);  //CM, Debug

}

}

}

if(len==0)

{

count = 51;

//digitalWrite(4, LOW);  //CM, test “tx_ok” receiving

}

}

delay(200);

}

}

uint8_t WaitRxAck()

{

uint8_t test[64], len, count, i;

for(count=0; count<20; count++)

{

len = Serial.available();

if(len>0)

{

Serial.readBytes(test, len);

for(i=0; i<len; i++)

{

if(test[i]==’m’)

{

if((test[i+1]==’a’)&&(test[i+2]==’c’)&&(test[i+3]==’ ‘)&&(test[i+4]==’r’)&&(test[i+5]==’x’))

{

if(test[i+10]==’0′)

return CMD_LOW;

else if(test[i+10]==’1′)

return CMD_HIGH;

else

return CMD_TOGGLE;

}

}

}

}

delay(200);

}

return false;

}

/*

* How to operate with Sensor SHT30

*/

#define SHT30_ADDRESS       0x44

#define SHT30_ORDER_CATCH   0x24

#define SHT30_ORDER_PARA    0x00

#define TEMPERATURE_PARA    374.49

#define TEMPERATURE_PARA2   45

#define HUMIDITY_PARA       655.35

void SensorSHT30()

{

float       temp_data, humi_data;

uint32_t    buff_data;

 

Wire.beginTransmission(SHT30_ADDRESS);

data[7] = Wire.endTransmission();

if(data[7]==0)

{

data[0] = SHT30_ORDER_CATCH;

data[1] = SHT30_ORDER_PARA;

Wire.beginTransmission(SHT30_ADDRESS);

Wire.write(data, 2);

Wire.endTransmission();

delay(100);           //catch sensor data need sometime.

Wire.requestFrom(SHT30_ADDRESS, 6);

while(Wire.available() == 0);

for(i=0; i<6; i++)  data[2+i] = Wire.read();

buff_data = ((data[2]<<8)|data[3])&0xFFFF;

temp_data = (buff_data/TEMPERATURE_PARA)-TEMPERATURE_PARA2;

LoRaPackageTx(“TP:”, temp_data);

WaitTxAck();

buff_data = ((data[5]<<8)|data[6])&0xFFFF;

humi_data = (buff_data/HUMIDITY_PARA);

LoRaPackageTx(“HU:”, humi_data);

WaitTxAck();

}

return;

}

/*

* How to operate with Sensor MC3630

*/

#define MC3630_ADDRESS      0x6C

void SensorMC3630()

{

Wire.beginTransmission(MC3630_ADDRESS);

data[7] = Wire.endTransmission();

if(data[7]==0)

{

MC3630_acc_t rawAccel = MC3630_acc.readRawAccel();

LoRaPackageTx(“GX:”, rawAccel.XAxis_g);

WaitTxAck();

LoRaPackageTx(“GY:”, rawAccel.YAxis_g);

WaitTxAck();

LoRaPackageTx(“GZ:”, rawAccel.ZAxis_g);

WaitTxAck();

}

return;

}

void loop() {

static bool pin_status = false;

SensorSHT30();

SensorMC3630();

switch(gDL_return_val)

{

case CMD_HIGH:

pin_status=true;

digitalWrite(LED_PIN, HIGH);

break;

case CMD_LOW:

pin_status=false;

digitalWrite(LED_PIN, LOW);

break;

case CMD_TOGGLE:

{

if(pin_status)

digitalWrite(LED_PIN, LOW);

else

digitalWrite(LED_PIN, HIGH);

pin_status=!pin_status;

break;

}

default: break;

}

8.MQTTbox 接收Gateway轉送資訊封包:

 

*以上資料來源 (Makerpro)

 

上一頁
Top