STM32LoRa ตอนที่ 2 เชื่อมต่อกับ LoRa IoT by CAT (โหมด ABP)

<< ตอนที่ 1 : ติดตั้งโปรแกรมที่จำเป็น

หลังจากที่เราได้ติดตั้งโปรแกรมต่าง ๆ ที่จำเป็นกันไปแล้ว ในตอนนี้จะเป็นการเขียนโปรแกรมเพื่อเชื่อมต่ออุปกรณ์ STM32 LoRa Descovery kit (ผมจะเรียกมันว่า “End Device”) เข้ากับเครือข่าย LoRa WAN ของ CAT TELECOM ซึ่งการที่เราจะเชื่อมต่อกับเครือข่าย LoRa WAN ได้นั้น จำเป็นต้องมี Username สำหรับการใช้งานก่อนครับ โดยราคาค่าใช้บริการจะอยู่ที่ปีละ 300 บาท (3 ม.ค. 2562) (คลิ๊กเพื่อดูข้อมูล)

เราจะทำอะไรกันบ้าง ?

เราจะมาเขียนโปรแกรมแสดงการส่งข้อมูลขึ้นสู่เครือข่าย โดยส่งข้อความว่า “Hello World!” ขึ้นไป ผ่านการ Join Network แบบ ABP ในโหมด Class A โดยผมจะแบ่งเป็นหัวข้อย่อย ๆ ดังนี้

  1. Lora และ LoRaWAN คืออะไร?
  2. การเตรียมโปรเจค
  3. การเตรียม Network Server เพื่อเตรียมเชื่อมต่อกับอุปกรณ์ของเรา
  4. การเขียนโปรแกรมเพื่อติดต่อกับ LoRa IoT by CAT
  5. การเขียนโปรแกรมเพื่อส่งข้อความ “Hello World!”

1. LoRa และ LoRaWAN คืออะไร?

เริ่มแรกเราต้องทำความเข้าใจกันก่อนว่า LoRa มันคืออะไร ซึ่งในลิงค์นี้จะอะธิบายถึงหลักการทำงาน, Class ของ End Device และประเภทการ Join Network ของทั้ง OTAA และ ABP ครับ
คลิ๊กลิงค์ -> LoRa, LoRaWAN คืออะไร มารู้จักกันดีกว่า

แล้วมันประยุกค์ใช้ทำอะไรได้บ้างละ
คลิ๊กลิงค์ -> Showcase of LoRaWan IoT

ตัวอย่างของแอพพลิเคชันที่พัฒนาแล้วหรือใช้งานจริงจะมีอยู่ในหลายประเทศ
อินเดีย
* มิเตอร์ของแก๊สและน้ำ
* การควบคุมไฟถนน
* รถห้องเย็น
ออสเตรเลีย
* การตรวจสอบสภาพแวดล้อมทางไกล เช่น ระบบชลประทาน สถานะน้ำเค็ม
* ความชื้นในดิน
ไต้หวัน
* การติดตามรถขนของ
* การจัดการที่จอดรถอัจฉริยะ


2.การเตรียมโปรเจค

Download ไฟล์โปรเจคจากเว็บไซต์ https://www.st.com/en/embedded-software/i-cube-lrwan.html

หรือไฟล์ที่ได้รวมไว้แล้วจาก http://catkm.cattelecom.com/km_resource/IoT/STM32/STM32Software.zip

ทำการแตก zip ไฟล์ en.i-cube_lrwan.zip จะได้ Folder ชื่อ STM32CubeExpansion_LRWAN_V1.2.1 จะเห็นได้ว่าเป็นเวอร์ชั่น 1.2.1 ซึ่ง Folder ที่เราแตก zip มานี้จะเป็น Folder หลักของโปรเจค เราสามารถเปลี่ยนชื่อ Folder ไปเป็นชื่อโปรเจคที่เราต้องการได้ ในที่นี้ผมจะเปลี่ยนชื่อเป็น STM32_LRWAN_CAT_Sender

STM32CubeExpansion_LRWAN_V1.2.1 -> STM32_LRWAN_CAT_Sender

จากนั้นเปิดไฟล์ Lora.uvprojx

\STM32_LRWAN_CAT_Sender\Projects\B-L072Z-LRWAN1\Applications\LoRa\End_Node\MDK-ARM\Lora.uvprojx

โปรแกรม Keil uVision5 จะเปิดขึ้นมา ในกล่อง Project ด้านซ้ายมือให้เลือกไปที่ Projects/End_Node แล้ว Double click ไฟล์ main.c

Project: Lora
-mlm32l07x01
-Projects/End_Node
-main.c

จากนั้นทำการ Rebuild

โปรแกรมจะทำการ Compile โปรเจคทั้งหมดใหม่เมื่อเสร็จสิ้นจะพบเครื่องหมาย + หน้าไฟล์ main.c

ให้กดเครื่องหมาย + เพื่อเปิด และ Double click ที่ไฟล์ Commissioning.h ซึ่งไฟล์นี้จะเป็นไฟล์ที่ไว้ Config ค่าการเชื่อมต่อกับเครือข่าย LoRa WAN

เนื่องจากความถี่การใช้งานคลื่น LoRa ในแต่ละประเทศนั้นแตกต่างกัน ดังนั้นเราจึงจำเป็นต้องกำหนดความถี่ให้ตรงกับประเทศที่เราจะใช้งานด้วย โดยในประเทศไทย กสทช. ประกาศให้ใช้ความถี่ที่ 920 -925 MHz ทำได้โดย

เลือกเมนู Options for target… และไปที่แท็บ C/C++ เพื่อทำการเปลี่ยนค่า REGION ของ LoRa WAN เป็น REGION_AS923

เมนู Options for target… -> C/C++ -> แก้ไขค่าเป็น REGION_AS923

และสุดท้ายเป็นการเปิดใช้งาน Reset End Device อัตโนมัติทันทีที่การ Download โปรแกรมลง End Device เสร็จสิ้น โดยที่เราไม่จำเป็นต้องกดปุ่ม Reset สีดำที่อยู่บน End Device ของเรา ทำได้โดย

เมนู Options for target… -> Debug -> Settings -> Flash Download
แล้วติ๊กถูกที่ Reset and Run

เสร็จสิ้นการเตรียมโปรเจคเพื่อพัฒนา LoRa แล้วครับ


3. การเตรียม Network Server เพื่อเตรียมเชื่อมต่อกับอุปกรณ์ของเรา

เข้าเว็บไซต์ https://loraiot.cattelecom.com/portal 
แล้วทำการ Login เข้าสู่ระบบ

3.1 สร้าง Routing Profile

เลือกเมนู Routing Profile แล้วกดปุ่ม Create New ใส่ชื่อ Routing Name ที่เราต้องการ

Routing Profile คือ URL ของ Application Server ที่เราจะใช้รับข้อมูลที่ส่งมาจาก Network Server

ในที่นี้เราจะยังไม่มีการส่งข้อมูลออกจาก Network Server ไปให้ใครจึงยังไม่จำเป็นต้อง Add URL ปลายทางปล่อยว่างไว้

3.2 เพิ่มอุปกรณ์ที่จะเชื่อมต่อกับ LoRa IoT by CAT

เลือกเมนู Device Management แล้วกดปุ่ม New Device กรอกข้อมูลต่าง ๆ
- Name : ชื่อที่เราจะอ้างถึง Device นี้
- Activation Type : เลือกเป็น ABP
- Device EUI, Device Address, Network Session Key และ Application Session Key : ใส่ตามที่ได้มาจาก CAT
- Payload Format : เลือกเป็น Raw
- Routing Profile : ให้เลือกตามที่เราได้สร้างไว้ (3.1)
- Device Profiles : เลือกเป็น Class A
- Connectivity Instances : เลือกตามที่มี

เสร็จสิ้นการเตรียม Network Server เพื่อรองรับการส่งข้อมูลจาก End Device ของเรา


4. การเขียนโปรแกรมเพื่อติดต่อกับ LoRa IoT by CAT

ในโปรแกรม Keil uVision5 ไปที่ไฟล์ main.c แก้ไข Code ตามนี้

//ไฟล์ main.c
....
#define APP_TX_DUTYCYCLE 30000
....
#define LORAWAN_DEFAULT_CLASS CLASS_A

APP_TX_DUTYCYCLE : เป็นรอบการส่งสัญญาณเข้าสู่เครือข่าย LoRa มีหน่วยเป็น Milliseconds เนื่องจากเครือข่าย LoRa เป็นเครือข่ายสาธารณะดังนั้น กสทช. จึงจำเป็นต้องมีการกำหนด Traffic ของข้อมูลที่วิ่งในเครือข่ายให้ไม่มากเกินไปและไม่เกิดการถือครองทรัพยากรณ์ไว้นาน ซึ่งการสื่อสารภายใน LoRa WAN จะเป็นแบบ Time Slot ที่ควบคุม Duty Cycle แบบ Programable ดังนั้นเพื่อไม่ให้เกินค่าที่ กสทช. กำหนดผมจึงตั้ง Duty Cycle ไว้ที่ 30 วินาที (ถ้าส่งถี่ยิบมันผิดกฏหมายนะครับ)

LORAWAN_DEFAULT_CLASS : เลือกเป็น Class A

ต่อมาเราจะทำการ Config ค่าการเชื่อมต่อ End Device กับ LoRa WAN โดยแก้ไขไฟล์ Commissioning.h ใส่ค่า Device EUI, Device Address, Network Session Key Application Session Key และค่าอื่น ๆ ตามที่ได้มาจาก CAT ให้ตรงกับที่เราไปลงทะเบียนไว้ในข้อ 3 ดังนี้

//ไฟล์ Commissioning.h
OVER_THE_AIR_ACTIVATION : โหมด ABP ตั้งค่าเป็น 0 (โหมด OTAA ตั้งค่าเป็น 1)
STATIC_DEVICE_EUI : ตั้งค่าเป็น 1

ข้อมูลที่เราจะได้จาก CAT TELECOM ที่ใช้สำหรับการเชื่อมต่อจะเป็นเลขฐาน 16 ประกอบด้วยข้อมูลหลัก ๆ ดังนี้

Device EUI : 123D001234567890
Device Address : 12345678
Network Session Key : 123456789ABCDEF123456789ABCDEF00
Application Session Key : FEDCBA987654321FEDCBA98765432100

สำหรับ Device EUI, Network Session Key และ Application Session Key จะต้องทำการแบ่งข้อมูลทีละ 2 หลักไปอยู่ในรูปแบบ Format ของเลขฐาน 16 ในภาษา C ดังภาพ

ในส่วนของค่า Device Address สามารถใช้ในรูปแบบ Format ฐาน 16 ได้เลย

//ไฟล์ Commissioning.h
IEEE_OUI : 0x12, 0x3D, 0x00
LORAWAN_DEVICE_EUI : { IEEE_OUI, 0x12, 0x34, 0x56, 0x78, 0x90 }
STATIC_DEVICE_ADDRESS : ตั้งค่าเป็น 1
LORAWAN_DEVICE_ADDRESS : ( uint32_t )0x12345678
LORAWAN_F_NWK_S_INT_KEY : 
{ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF1, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x00 }
LORAWAN_S_NWK_S_INT_KEY : 
{ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF1, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x00 }
LORAWAN_NWK_S_ENC_KEY : 
{ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF1, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x00 }
LORAWAN_APP_S_KEY : 
{ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x1F, 0xED, 0xCB, 0xA9, 0x87, 0x65, 0x43, 0x21, 0x00 }

เมื่อแก้ไขโค๊ดเสร็จเรียบให้ทำการ Build (กด F7) ถ้าไม่พบ Error ให้ทำการ Run โปรแกรม (กด F8)

เปิดโปรแกรม Tera Term ตั้งค่า Baud rate เป็น 115200 แล้วกดปุ่ม Reset บน End Device จะปรากฏค่าการ Config ของ LoRa WAN บนหน้าจอ ซึ่งค่านี้จะต้องตรงกับที่เราลงทะเบียนไว้บนเว็บไซต์

ทำการตรวจสอบข้อมูลที่ส่งไปยัง LoRa WAN ได้ที่เว็บไซต์ https://loraiot.cattelecom.com/portal/home/logger


5. การเขียนโปรแกรมเพื่อส่งข้อความ “Hello World!”

จาก Logger Data จะเห็นได้ว่าข้อมูลใน Payload มันมีการส่งค่าบางอย่างไป ซึ่งฟังชั่นที่ใช้สำหรับส่งค่า Payload นี้อยู่ที่ไฟล์ main.c ชื่อฟังชั่น static void Send( void* context ) จากการอ่านโคดพบว่าเป็นการส่งค่าอุณหภูมิ ความชื้น ละติจูด และ ลองติจูด ขึ้นไปยัง Network Server

เราจะทำการเปลี่ยนข้อมูลที่ส่งเป็นข้อความ “Hello World!” ขึ้นไปแทน เราจะมีวิธีการยังไงไปดูกันเลย

ไปที่ไฟล์ main.c แล้วแก้ไขฟังชั่น static void Send( void* context ) เป็นดังนี้

//ไฟล์ main.c
static void Send( void* context )
{
/* USER CODE BEGIN 3 */
if ( LORA_JoinStatus () != LORA_SET)
{
/*Not joined, try again later*/
LORA_Join();
return;
}

char message[] = "Hello World!";

//set message to AppData.Buff
sprintf((char*)AppData.Buff,"%s",message);

//show in Tera Term
PRINTF((char*)AppData.Buff);

//set size and port
AppData.BuffSize = strlen((char*)AppData.Buff);
AppData.Port = LORAWAN_APP_PORT;

//Send to LoRaWAN
LORA_send( &AppData, LORAWAN_DEFAULT_CONFIRM_MSG_STATE);

/* USER CODE END 3 */
}

ทำการ Build (F7) และ Run (F8) โปรแกรม

เปิดดูข้อมูลจาก Logger ในเว็บไซต์ และในโปรแกรม Tera Term

จะเห็นได้ว่าใน Tera Term จะแสดงคำว่า Hello World! แต่ใน Logger Data จะแสดงเป็น 48656c6c6f20576f726c6421 ทำไมมันเป็นเช่นนั้น ?

โดยปกติแล้ว Payload ของ LoRaWAN จะรับค่าข้อมูลเป็น Hex หรือเลขฐาน 16 เท่านั้น ดังนั้นข้อความ “Hello World!” ซึ่งมีชนิดข้อมูลเป็น char จะต้องถูกแปลงให้อยู่ในรูปแบบของเลขฐาน 16 ด้วย ซึ่งทำได้โดยเข้ารหัสข้อความด้วยรหัส ASCII ก่อนที่จะทำการส่ง ดังนั้น คำว่า “Hello World!” จึงมีค่าเท่ากับ 48656c6c6f20576f726c6421 ในรหัส ASCII

การแปลงข้อความเป็น Hex
การแปลง Hex เป็นข้อความ

เว็บไซต์แปลงข้อมูล http://www.unit-conversion.info/texttools/hexadecimal/#data


จบแล้วครับสำหรับในตอนที่ 2 จะเห็นว่าการส่งข้อมูลขึ้นไปยังเครือข่าย LoRa WAN นั้นจะไม่สามารถส่งข้อมูลเป็นตัวอักษรที่เราต้องการขึ้นไปได้โดย เพราะการส่งข้อมูลไปบนเครือข่าย LoRa WAN นั้นจำเป็นต้องส่งเป็นเลขฐาน 16 เท่านั้น ดังนั้นการส่งข้อความเป็นตัวอักษร (char) ขึ้นไปบนเครือข่ายนั้นจำเป็นต้องแปลงให้อยู่ในรูปแบบของเลขฐาน 16 ก่อน แต่ถ้าข้อมูลของเรามีชนิดเป็น int เราจะสามารถส่งขึ้นไปได้เลยครับ

ในตอนหน้าจะเป็นการ Forward ข้อความ Hello World! ที่เราส่งจาก End Device ไป Network Server นี้ขึ้นไปเก็บบน Application Server ที่เราได้สร้างขึ้น สวัสดีครับ…