作者:柯大
本文將為大家介紹如何用群登科技(Acsip)的LoRa開發套件來自建LoRaWAN網路,這個開發套件是LoRa Smart Blocks Development Kit ,含LoRa智慧型積木組件及正文 Gemtek Indoor Gateway。
群登這套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開發套件(圖片來源:群登Acsip)

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

圖片來源:群登Acsip官網
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方式燒錄)

圖片來源:群登Acsip官網
3. Battery Board:Lithium/ 3.7V /300mAh
4. Gemtek LoRa Indoor Gateway Unit:Gemtek indoor 16 channel LoRaWAN Gateway

圖片來源:正文Gemtek官網
LoRa Smart Blocks Development Kit ,主要智慧型積木組件接腳圖如下:

圖片來源:群登Acsip
程式燒錄透過Sensor Board ICSP 連接Arduino UNO SPI介面,以Arduino as ISP方式燒錄。
Arduino UNO與Sensor Board接腳連接方式如下,詳細燒錄步驟請參考群登科技所提供的文件及範例。
- UNO D13 ←→ ICSP SCK (pin 3) UNO D12 ←→ ICSP MISO (pin 1)
- UNO D11 ←→ ICSP MOSI (pin 4) UNO D10 ←→ ICSP REST (pin 5)
- UNO 5V ←→ ICSP +5V (pin 2) UNO GND ←→ ICSP GND (pin 6)

圖片來源:群登Acsip
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 來測試。

UART 連線(圖片來源:群登 Acsip)
SIP commands:LoRa晶片模組內部指令集
指令集
- sip factory_reset :恢復參數為出廠設定值
- sip get_ver : 讀取firmware version.
- sip get_hw_deveui :讀取Get hardware EUI
- sip reset :重置模組
- sip get_hw_model : 讀取hardware model & firmware version
- sip set_echo <Status>:Enable or disable UART echo mode;<Status>: on or off
- sip set_log <Log_Level> :<Log_Level> debug: show all logs, info ,顯示log
- 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
- sip set_baudrate <baudrate> <password> :<baudrate>:9600,19200, 57600 and 115200.;<password>:password baudrate protection;Example: sip set_baudrate 9600 12345678
- sip_get_hw_model_ver:讀取hardware model
MAC commands:LoRa MAC協議指令集
設定頻段之各Channel頻段預設如下:可用mac set_ch_freq指令更改各Channel頻段

Channel頻段預設(圖片來源:柯大提供)
LoRa MAC協議指令集
- mac set_band <FreqBand>:設定頻段 <FreqBand>: 470, 868, 902, 915, 923, 922,924. Example: mac set_band 923
- 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
- mac join <Mode> :設定加入LoRaWAN 方式。 <Mode>:LoRaWAN join mode:otaa (over‐the‐air activation) or abp(activation by personalization)
- mac save :儲存LoRaWAN 參數值.
- mac get_join_status :讀取 LoRaWAN join status
- mac set_deveui <DevEUI>:設定Device EU。<DevEUI>:8‐byte hexadecimal Device EUI for LoRaWAN.
- mac set_appeui <AppEUI>:設定 Application EUI 。<AppEUI>:8‐byte hexadecimal Application EUI for LoRaWAN.
- mac set_appkey <AppKey>:設定 Application Key 。<AppKey>:16‐byte hexadecimal Application Key for LoRaWAN.
- mac set_devaddr <DevAddr> :設定Device Address。<DevAddr>:4‐byte hexadecimal Device Address for LoRaWAN.
- mac set_nwkskey <NwkSessionKey>:設定Network Session Key。<NwkSessionKey>:16‐byte hexadecimal Network Session Key for LoRaWAN.
- mac set_appskey <AppSessionKey>:設定Application Session Key。<AppSessionKey>:16‐byte hexadecimal Application Session Key for LoRaWAN.
- 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
- mac set_dr <Datarate>:設定 data rate。<DataRate>:0 ~ 6
- mac set_txretry <RetryCount>:設定重傳次數。<RetryCount>:0 ~255
- mac set_rxdelay1 <Delay> :設定接收窗RX#1 間隔時間,<Delay>:0 ~65535 ms. 接收窗RX#2 將被設定 <Delay>+1
- 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
- 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
- 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
- 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
- mac get_dc_ctl <on /off> :讀取duty cycle status
- mac set_dc_ctl <on /off> :設定duty cycle status
- mac get_dc_band <BandID> :讀取<BandID> duty cycle
- mac set_upcnt:讀取Uplink計數值
- mac set_downcnt:讀取Downlink計數值
- mac get_class:讀取 LoRaWANTM class type
- mac get_devaddr:讀取devaddr值
- mac get_deveui:讀取deveui值
- mac get_appeui:讀取appeui值
- 29.mac get_nwkskey:讀取network session key值
- mac get_appskey:讀取application session key值
- mac get_appkey:讀取appkey值
- mac get_dr:讀取LoRaWANTM data rate值
- mac get_band:讀取頻段值
- mac get_power:讀取發射power值
- mac get_txretry:讀取重傳次數
- mac get_rxdelay:讀取接收窗RX#1 RX#2間隔時間
- mac get_rx2:讀取接收窗RX#2接收rate及頻段
- mac get_ch_para <ChannelId>:讀取 channel 設定的參數值
- mac get_ch_status <ChannelId>:讀取 channel on/off狀態
RF commands:LoRa RF發射接收指令集
發射接收指令集
- rf tx <Data>:傳送資料<Data>: hexadecimal string
- rf rx <RxWindowTime> :等待接收資料(0-65535ms),0:等待至收到資料。
- rf set_freq <Frequency>:設定頻段:862000000 to 932000000 (868 to 924 bands);137000000 to 525000000 (433 or 470 band).
- rf set_pwr <Power>:設定發射功率:0-20dBm
- rf set_sf <SpreadingFactor>:設定SF值:7-12
- rf set_bw <BandWidth>:設定頻寛:125, 250, 500
- rf set_cr <CodingRate>:設定code rate:4/5, 4/6, 4/7, 4/8
- rf set_prlen <PreambleLength>:設定preamble length: 0 – 65535
- rf set_crc <State>:設定 CRC on/off
- rf save:Save p2p configuration parameters to EEPROM
- rf get_freq:讀取p2p頻段
- rf get_pwr:讀取power值
- rf get_sf:讀取SF值
- rf get_bw:讀取頻寛值
LoRaWAN command測試
Join ABP mode
測試mode
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
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
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
>> 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轉送資訊封包:

圖片來源:柯大提供

圖片來源:柯大提供
(責任編輯:葉于甄)
- 【開箱評測】MTDuino IOT開發板: MQTT功能實作介紹 - 2023/06/26
- 【開箱評測】MTDuino IOT開發板:NB-IoT及GPS功能介紹 - 2023/05/07
- 用NB-IoT USB Dongle實現MQTT,加快IoT應用開發 - 2019/12/18
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!