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 SemtechSX12762. Sensor Board (compliant Arduino UNO)
3. Battery Board:Lithium/ 3.7V /300mAh4. Gemtek LoRa Indoor Gateway Unit:Gemtek indoor 16 channel LoRaWAN GatewayLoRa Smart Blocks Development Kit ,主要智慧型積木組件接腳圖如下: 程式燒錄透過Sensor Board ICSP 連接Arduino UNO SPI介面,以Arduino as ISP方式燒錄。 Arduino UNO與Sensor Board接腳連接方式如下,詳細燒錄步驟請參考群登科技所提供的文件及範例。
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晶片模組內部指令集
MAC commands:LoRa MAC協議指令集設定頻段之各Channel頻段預設如下:可用mac set_ch_freq指令更改各Channel頻段 LoRa MAC協議指令集
RF commands:LoRa RF發射接收指令集發射接收指令集
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測試測試moderf 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) |
上一頁