ESP32 LoRaWan Gateway + LoRa Node

ในตอนที่ 4 ของ Series ESP8266/ESP32 กับการใช้งาน Painlessmesh เรามีการใช้บอร์ด Heltec ESP32 SX1278 เพื่อใช้งานในการ Bridge Data ระหว่าง Mesh Network กับ LoRa แล้วส่งข้อมูลที่ได้ไปยัง MQTT Server ซึ่งตอนที่ 4 อธิบายรายละเอียดของ LoRa ไว้ค่อนข้างพอสมควร ใครจะเขียน Protocol ขึ้นมาเองรวมถึงเรื่อง Encryption ก็สามารถใช้งาน LoRa ในแบบ Physical Layer กันได้เลย แต่ถ้าต้องการ Encryption ใช้งานแบบเป็นระบบ รวมถึงการเชื่อมต่อ การจัดการอุปกรณ์ ก็ควรมาใช้ LoRaWan กัน

วันนี้ก็เลยเข้าโหมด Script Kiddies เอา Code จากแหล่งอื่นๆมาจับแพะ ชนแกะทดลองใช้งาน LoRaWan กัน ซึ่งรายละเอียดภายใน Code คงต้องศึกษากันเองนะครับ ข้อมูลนี้ก็เป็นเหมือน log จากการทดลองของผมที่เอามาแชร์ข้อมูลเผื่อท่านอื่นๆได้ทดลองต่อ เพราะนี่ก็เป็นครั้งแรกที่เล่นกับ LoRaWan กับ TTN เหมือนกัน ถ้าท่านใดมีส่วนไหนที่จะเสริมข้อมูล อยากให้แก้ไข หรือขยายความก็ยินดีครับ ผมกับท่านอื่นๆที่มาอ่านจะได้ความรู้ไปด้วย

มาเริ่มกันเลยดีกว่าครับ Gateway ของ LoRaWan นั้นมีตั้งแต่ชุด DIY ที่ราคาหลักไม่กี่พันบาทต่อชุด จนไปถึงราคาหลายล้านบาทที่มาพร้อมระบบหลังบ้านหรือพวก OSS (Operation Support System) + BSS (Business Support System) อย่าง Actility ที่มีครบตั้งแต่ต้นน้ำของ Data ที่ไหลเข้ามา จนถึงระบบที่ได้กล่าวไป และยังรวมไปถึงการวิเคราะห์ข้อมูล การออกบิลเก็บเงินลูกค้าด้วย ซึ่งผู้ให้บริการ LoRa ในไทยอย่าง CAT IoT ก็ใช้ Technology ของ Acitility เหมือนกัน (ข่าว Actitlity + CAT)

 

ภาพจาก: Actility ในส่วนของ Technology Overview

มาดูในส่วนของขา DIY หรือ Maker อย่างเราๆกันบ้าง สำหรับ Gateway ที่รองรับการทำงานแบบ Multi Channel อย่างน้อยๆก็ต้องเตรียมเงินไว้ประมาณซัก 100 USD ยังไม่รวมในส่วนของ Raspberry PI ที่จะมาทำอีก ไหนๆก็มี ESP32+SX1276 อยู่หลายบอร์ดทั้ง Heltec กับ TTGO เราก็จะมาทำ LoRa Gateway แบบ Single Channel กันดูด้วยอุปกรณ์ที่ราคาไม่ถึง 1,000 บาท โดยอุปกรณ์ที่จะใช้ในตอนนี้จะประกอบไปด้วย

  • Gateway: Heltec ESP32 LoRa SX1276 OLED
  • Node1: Heltec ESP32 LoRa SX1276 OLED

จากข้อมูลที่ค้นมาในการทำ Single Channel Gateway ก็มีทั้งใช้ Raspberry PI และ MCU หลากหลายตระกูล แต่ที่ดูจะฮิตสุดสำหรับ MCU ก็จะเป็น ESP8266 และได้มีการ Port มาอยู่บน ESP32 แล้วแต่ยังไม่ค่อยสมบูรณ์เท่าไหร่ ซึ่งข้อแตกต่างของทั้งสองเวอร์ชั่นก็จะเหมือนขาดและเติมเต็มส่วนที่หายไปของกันและกัน  ^_^”

ESP8266 Single Channel LoRa Gateway by Maarten Westenberg
https://github.com/things4u/ESP-1ch-Gateway-v5.0


ESP32 Single Channel LoRa Gateway by Jac Kersing
https://github.com/kersing/ESP-1ch-Gateway-v5.0

ถ้าดูต้นฉบับของคุณ Westenberg ที่พัฒนาสำหรับ ESP8266 แกก็อยากจะทำเพิ่มในส่วนของ ESP32 และอีกหลายๆประเด็น

แต่ในส่วนของคุณ Kersing ที่พอร์ทโค้ดของคะณ Westenberg มาให้ทำงานบน ESP32 แล้วก็จะเจอหลายๆประเด็นที่ทำได้บน ESP8266 เช่น WiFi Manager หรือ OTA แต่ยังไม่ได้ทำบน ESP32 T_T

สำหรับในตอนนี้ เราจะใช้ Code ESP32 Single Channel LoRaWan Gateway ของคุณ Jac Kersing ตามลิงค์นี้เลยครับ (ESP32 LoRaWan SCG by Jac Kersing) แล้ว clone มาทั้งหมดเลย เนื่องจากบอร์ดที่เราจะใช้คือ Heltec ESP32 LoRa sx1276

โดย Step ที่เราจะทำทั้งหมดในตอนนี้มีอยู่ 5 ขั้นตอนหลักด้วยกัน

  1. Config/Upload Heltec LoRa Sx1276 as LoRaWan Gateway (SCG)
  2. Add Gateway on TTN
  3. Add Application on TTN
  4. Add Device to Application on TTN
  5. Config/Upload Heltec LoRa SX1276 as LoRa Node

เรามาเริ่มกันเลยดีกว่าครับไล่กันไปตาม step เลย

 

ขั้นตอนที่ 1: Config/Upload Heltec LoRa Sx1276 as LoRaWan Gateway (SCG)

หลังจาก Clone/Download จาก Github ของคุณ Jac Kersing มาแล้วก็ Unzip ออกมาจะประกอบไปด้วย 2 Folder ด้วยกัน

ซึ่ง folder ESP-sc-gway จะเป็น Code หลักที่เราจะใช้สำหรับ ESP32 LoRa Single Channel Gateway ของเราในส่วนของ folder libraries ก็จะเป็น libraries ปลีกย่อยอื่นๆที่ใช้ประกอบก็ copy ไปวางไว้ใน folder libraries ของ Arduino IDE ได้เลยครับ

มาดูที่โค้ดหลักของเรากันก่อนโดยเข้าไปที่ folder ESP-sc-gway –> แล้วเปิดไฟล์ ESP-sc-gway.ino ขึ้นมาเลยครับจากนั้นก็ลอง Compile แล้วไล่แก้เป็นส่วนๆไป

ส่วนแรกก็จะเป็นการตั้งค่าความถี่ของ Single Channel Gateway ให้ตรงกับที่เราต้องการคือ 923.2MHz โดยแก้ที่ไฟล์ LoraModem.h

 

ในไฟล์ LoRaModem.h มีการกำหนด pinout ในส่วนของ Heltec ESP32 LoRa SX1276 มาให้เรียบร้อยแล้ว

 

จากนั้นก็ comment ในส่วนของ wpa ในบรรทัด 250 ที่ใช้ library wpa แยกออกมา ในไฟล์ ESP-sc-gway.h

 

แก้ไขในส่วนของ TimeZone และรายละเอียดของ Gateway

 

ในส่วนของไฟล์ ESP-sc-gway ก็แก้ตามด้านล่างนี้เลยครับ compile แล้วแก้ไปทีละส่วน

 

แก้ไขในส่วนของ Router ตามค่า config ของ TTN ดังนั้นในไฟล์ ESP-sc-gway.h ค่า Setting ของ router เป็น “router.as2.thethings.network”

ค่า config address router ของ TTN ที่แยกไว้ตาม zone

 

ถ้าใคร compile แล้วมีปัญหา interrupt error ให้ลบในส่วนของ  Arduino Core ESP32 แล้วลงใหม่ถ้าเป็นเครื่อง mac ก็จะอยู่ที่ folder Documents–>Arduino–>Hardware–>espressif  ก็ลบ folder espressif นี้แล้วลงใหม่ตามจากขั้นตอนในลิงค์นี้เลยครับ (ESP32 Arduino IDE Installation Instruction) ผมเจอเคสนี้เพราะตอนลองกับเครื่องที่ออฟฟิสกับ Notebook Mac Air ที่บ้านเอา Code เดียวกันมา Compile แล้วไม่ผ่าน แต่นึกได้ว่าเครื่องที่ออฟฟิสเพิ่งจะลงในส่วนของ Arduino Core ESP32 ใหม่ไปไม่นาน

 

เมื่อ Upload Code เรียบร้อยและเปิด Serial Monitor เพื่อดูค่าที่ได้ก็จะแสดงดังรูปด้านล่างนี้ครับ ส่วนตัวบอร์ด Heltec ESP32 ของเราจอ OLED ก็จะแสดงคำว่า Starting แล้วเปลี่ยนเป็น Ready เมื่อ Connect เข้าสู่ Internet ได้ ซึ่งในส่วนของตัว Gateway ID นั้นเดี่ยวเราจะเอาค่าที่ได้ตรงนี้ไป Register ในขั้นตอนถัดไปครับ

 

จาก Code ที่แก้มา อ้าวววว ไม่มี IP แสดงด้วย มาแก้เพิ่มกันดีกว่า นี่อารมณ์แบบทำไป แก้ไป เขียน Blog ไปกันเลย เหอๆ

เพิ่มการแสดง Server IP บน Serial Monitor

 

เพิ่มการแสดง IP บนหน้าจอ OLED

Code สำหรับการแสดง IP บนหน้าจอ OLED ที่แก้ไข

display.clear();
  display.setFont(ArialMT_Plain_16);
  display.drawString(0, 10, "READY");
  
  IPAddress myIP = WiFi.localIP();
  String ipStr = String(myIP[0]) + "." + String(myIP[1]) + "." + String(myIP[2]) + "." + String(myIP[3]);
  display.drawString(0, 30, ipStr);
  
  display.display();

 

จากนั้นก็ Compile และ Upload Code กันใหม่ครับ

LoRaWan Single Channel Gateway ของเราพร้อมใช้งานแล้ว

 

เมื่อเข้าไปที่ Browser ตาม IP ที่ได้มาก็จะได้ผลตามด้านล่างนี้ครับ เมื่อผ่านมาถึงตรงนี้แล้วก็เตรียมนำค่า Gateway ID ไปตั้งค่าใน TTN กันในขั้นตอนต่อไปครับ

 

 

ขั้นตอนที่ 2: Add Gateway on TTN (The Things Network)

TTN คืออะไร ถ้าในนิยามสั้นๆก็ The Things Network is a global open crowdsourced Internet of Things data network. ถ้ายาวขึ้นมาหน่อยก็จะเป็น The Things Network is about enabling low power Devices to use long range Gateways to connect to an open-source, decentralized Network to exchange data with Applications.

คราวนี้เราก็มาเตรียมที่จะใช้งานผ่าน TTN ที่เป็นตัวกลางในการรับข้อมูลจาก Single LoRaWan Gateway ของเรากัน ถ้าใครยังไม่มี Account ก็ลงทะเบียนกันก่อนโดยเข้าไปที่ www.thethingsnetwork.org แล้ว signup เลยครับ ซึ่งการลงทะเบียนก็ง่ายมาก กรอกแค่ username, password และ email เท่านั้น จากนั้นก็จะมี email ส่งไปเพื่อ confirm ก็คลิกตามลิงค์ที่แนบมากับ email แค่นี้ก็ลงทะเบียนใช้งานเรียบร้อยแล้วครับ

เมื่อ login เข้ามาแล้วให้เข้าไปที่หน้า Console ของเราครับจากเมนูด้านขวามือ

 

จากนั้นเราจะมา เพิ่ม Gateway ตัวแรกของเรากัน หลังจากที่เรา Upload Code ของ ESP32 ที่แก้ไขและ Run เรียบร้อยแล้ว โดยค่าที่เราจะใช้ก็คือตัว Gateway ID ที่ได้จากหน้า Serial Monitor

 

ให้ใส่ค่าตามด้านล่างนี้ โดยประเด็นหลักเลยก็คือเรื่องของการใช้งานของ ESP32 / SX1276 ของเนื้อหาในตอนนี้จะใช้งานผ่าน Legacy Packet Forwarder ให้คลิกที่ check box ตามรูปก่อนครับแล้วค่อย copy-paste ค่าของ Gateway ID ที่ได้จากหน้า Serial Monitor มา จากนั้นก็ใส่คำอธิบาย Frequency Plan และ router ของเราให้อยู่ใน zone ที่ใกล้กับ Gateway ของเรา

 

จากนั้นก็เลือกตำแหน่งของ Gateway ของเราแล้วกำหนดว่า Gateway ของเราเนี่ยเป็นแบบ Indoor / Outdoor จากนั้นก็กด Register Gateway เพื่อเพิ่ม Gateway ตัวแรกของเรากัน

 

เราก็จะได้ Gateway ตัวแรกของเราที่เข้าไปอยู่ในระบบของ TTN แล้วครับ แต่ในตอนแรกเมื่อเพิ่มเข้ามาจะยังขึ้นเป็น not connect อยู่เพราะยังไม่มี Data ส่งเข้ามา (บางครั้ง restart ใหม่ก็ขึ้น connect ครับ)

 

ขั้นตอนที่ 3: Add Application on TTN

เมื่อ Add Gateway กันไปเรียบร้อยแล้วขั้นต่อไปก็จะเป็นในส่วนของ Application กันละ จากหน้า console ก็คลิกที่ Application จะคลิกจาก icon หรือ menu ด้านขวาบนก็ได้ครับ จากนั้นก็ Add Application เลยครับ ซึ่งข้อมูลที่ได้จากขั้นตอนนี้จะเอาไปใช้ต่อในขั้นตอนต่อๆไปใน LoRa Node ที่ใช้ในการส่งข้อมูลมาที่ Gateway ของเรา

 

ในส่วนของ Application EUI ระบบจะ Gen ให้อัตโนมัติครับ เมื่อใส่ข้อมูลเรียบร้อยแล้วก็คลิก Add Application ได้เลยครับ Handler Registration ก็เลือกโซนให้ถูกครับ (แต่จริงๆจะใช้ zone ไหนก็ได้)

 

ขั้นตอนที่ 4: Add Device to Application on TTN

หลังจากที่ได้ Add Application เพื่อรองรับการส่งข้อมูลผ่าน LoRaWan แล้วก็จะมาถึงการเพิ่ม Device หรือ Node ที่จะส่งข้อมูลเข้ามาที่ Application นี้ ก็คลิกที่ register device เพื่อเข้าสู่หน้า Device List ครับ

 

ในหน้านี้เราก็คลิกที่ register device เพื่อเพิ่ม Node ของเราเข้าไป

 

ในหน้า Register Device ก็ใส่แค่ Device ID ของเราเข้าไปแค่นั้นครับ ส่วนอื่นๆทาง TTN จะ Generate ให้อัตโนมัติ

 

เราก็จะได้ Node ของเราขึ้นมาหนึ่งตัวแล้ว แต่ยังไม่เสร็จครับ สำหรับกรณีของเราต้องเปลี่ยนวิธีการ Activate เป็นแบบ Activation by Personalization (ABP) ก่อน ซึ่งจะเป็นการ Hardcode ข้อมูลลงแต่ละ Node ของเราเพื่อที่จะ verify ว่า Node นี้อนุญาตให้ใช้งานใน app หรือ gateway/network ไหนของเรา แต่ในการใช้งานจริงๆ วิธี Over-the-Air Activation (OTAA) แลดูจะสะดวกกว่า ซึ่งไว้เดี่ยวค่อยหาเวลาศึกษาและมาลองกันอีกทีถ้ามีโอกาส

คลิกที่ Setting เพื่อเปลี่ยน Activation Method เป็นแบบ ABP

 

คลิกเปลี่ยนในส่วนของ Activation Method เป็น ABP แล้วกด Save

 

ถ้าทำถูกต้องจะแสดงข้อมูลตามด้านล่างนี้ครับ จะได้ Device Address, Network Session Key และ App Session Key ซึ่งเราจะใช้ในขั้นตอนถัดไปครับ

 

ขั้นตอนที่ 5: Config/Upload Heltec LoRa SX1276 as LoRa Node

มาถึงขั้นตอนนี้เราจะเริ่มส่งข้อมูลไปยัง LoRaWan Gateway ที่เราทำรอไว้ช่วงต้นๆแล้วครับโดยขั้นตอนแรกเริ่มจากติดตั้ง Library LMIC กันก่อน เข้าไปที่ Sketch –> Include Library –> Manage Libraries แล้วค้นหาคำว่า lmic เลยครับ โดย Install  ตัวที่เป็น Vesion 1.5.0+Arduino-2 นะครับ

 

จากนั้นก็เปิดตัวอย่างของ IBM LMIC ที่เป็น ABP ตามรูปด้านล่างนี้เลยครับ

 

แก้ไขโค้ดในส่วนของ network session key, application session key และ end-device address (DevAddr) โดยค่านี้นำมาจากในส่วนของขั้นที่ตอนที่ผ่านมาครับ

 

จากนั้นแก้ไขในส่วนของ Pin Mapping สำหรับบอร์ดของ Heltec ESP32 sx1276 และกำหนดในส่วนของความถี่กันครับ

 

เมื่อแก้ไข Code ตามข้างต้นและ Upload เรียบร้อยแล้ว ทำการ reboot /กด reset บอร์ด Heltec ของเรา Node ก็จะส่งค่า Hello, Word! ออกไป โดยผลที่ได้ก็จะเป็นดังนี้ครับ

ตัว Single Channel LoRaWan Gateway ของเราจะได้รับข้อความ ซึ่งก็จะแสดงเวลาที่ได้รับแล้วก็ Address ของ Node ที่ส่งค่ามา

 

เมื่อเข้าไปที่หน้า web ของ Gateway ก็จะมีข้อมูลว่ารับส่งข้อมูลไปเท่าไหร่แล้ว มาจาก Node ไหนบ้าง ซึ่งระหว่างที่ทดลองนี้ก็ดูเหมือนจะมี Node อื่นที่ใช้ความถี่ 923.3MHz ส่งข้อมูลมาด้วยเหมือนกัน

 

คราวนี้เราจะมาดู Data ที่ส่งผ่าน Gateway มายัง TTN กันครับ ให้เข้าไปที่หน้า Application ของเราแล้วคลิกที่ tab Data ก็จะเห็นข้อมูลที่วิ่งเข้ามา ซึ่งข้อมูลที่แสดงอยู่บนหน้า TTN ในส่วนนี้ก็จะเป็นเลขฐาน 16 ครับ

 

ลองเอาเลขฐาน 16 48656C6C6F2C20776F726C6421แปลงไปเป็น ascii กัน ซึ่งโปรแกรม hex to ascii นั้นก็สามารถหาจากเนตได้ทั่วไปครับ ส่วนผมก็ใช้จากลิงค์นี้ครับ (tomeko hex to ascii decoder) ก็จะได้ออกมาเป็นคำว่า Hello, world!

 

เมื่อข้อมูลของเราส่งผ่าน TTN โดยใช้ LoRaWan แล้ว คราวนี้เราจะเอาข้อมูลไปใช้งานต่อก็สามารถที่จะใช้งานผ่าน Integrator ต่างๆได้เพียบเลย ใช้งานผ่าน IFTTT ก็ได้ หรือจะเชื่อต่อกับ nodered ก็ได้ครับ

TTN & 3rd Party Integration

 

แต่ที่สนุกกว่านั้นก็คือเราสามารถที่จะ Subscribe Topic ของ TTN ผ่าน MQTT ได้ด้วยครับ ซึ่งตรงนี้จะทำให้เราใช้งานง่ายขึ้นไปอีกในการเอา Data ไปใช้งาน รายละเอียดของการใช้งาน MQTT บน TTN ก็ตามลิงค์นี้เลยครับ (TTN Data API MQTT)

ลองมาใช้งาน TTN ในส่วนของ MQTT Api กัน ซึ่งค่าต่างๆที่ใช้ก็สามารถนำไปใช้กับ MQTT Client ได้เลยครับ

 

เลื่อนลงมาด้านล่างจะเจอกับ Access Keys

เรามาทดลองกัน โดยใช้ค่า Config ของ TTN กับ MQTT.fx ดังนี้

  • Server: <Region>.thethings.network โดยที่ Region จะเป็นค่าต่อท้าย ttn-handler- ซึ่งของผมก็จะเป็น asia-se
  • User: <AppID>
  • Password: <Access keys>

 

เราก็จะตั้งค่าบน MQTT.fx ได้ดังรูปด้านล่างนี้ครับ

 

ในส่วนของ Topic ที่ใช้ในการ Subscribe เราสามารถที่จะ subscribe ที่ Topic นี้ครับ '+/devices/+/up' เมื่อเรากด reset node ของเราเพื่อส่งค่าใหม่ MQTT.fx ก็จะได้รับค่าเช่นเดียวกับที่แสดงบน TTN

 

ซึ่งค่าที่ได้จะอยู่ในรูปแบบของ json และ data ที่ได้รับมาจะอยู่ในส่วนของ payload_raw ซึ่ง encode ไว้ด้วย base64 เราจะลองนำค่า SGVsbG8sIHdvcmxkIQ==ที่ได้นี้ไป decode กันครับ เหมือนในส่วนของ hex to ascii สามารถหาเครื่องมือในการ decode ได้ตาม internet เลย ซึ่งผมใช้จากลิงค์นี้ครับ (base64 decoder toolur)

 

สรุปท้ายตอน

บทความนี้ก็ใช้เวลาเขียนประมาณ 3 วัน โดยหาข้อมูลจาก Internet แล้วมาสรุปไว้ในแบบ Script Kiddies คือเอาโค้ดที่ท่านอื่นๆพัฒนาเอาไว้แล้วมาปรับเปลี่ยนเพื่อทดลอง ซึ่ง Single Channel LoRaWan Gateway ที่ทำในตอนนี้ก็ลงทุนไม่เกิน 1,000 บาท เล็กและใช้งานได้ มีระบบ Manage ของ TTN ในการ Authentication Node และ Manage Application / Node

รวมถึงรองรับ Data Integration แบบ MQTT ซึ่งเข้าใจว่า backend ของ TTN ก็เป็น MQTT เหมือนกัน และยังสามารถ Integration กับ Service อื่นๆเช่น IFTTT หรือ Cayenne iot ก็ได้

ในส่วนของ TTN ที่เป็น Public Network นั้นก็ Opensource  ในส่วนของ TTN Stack  ไว้ด้วยเผื่อใครอยากจะใช้งานเป็นลักษณะของ private network ก็สามารถดูรายละเอียดได้จากลิงค์นี้ครับ (TTN Stack V2)

 

ข้อมูลเพิ่มเติมนอกเหนือจากเวปของ TTN ซึ่งเป็นแหล่งข้อมูลที่ผมค้นมาเพื่อมาทำเนื้อหาในตอนนี้ครับ

Author: Joe D.S.
Just a man on earth

6 thoughts on “ESP32 LoRaWan Gateway + LoRa Node

  1. ผมอยากแก้ data ที่ส่งไปให้เป็น การอ่านค่าจาก sensor ต้องทำยังไงครับ

    1. ถ้าอ่านค่าจาก Sensor ได้ ก็ใช้ค่าจาก sensor ส่งไปเองแค่นั้นครับ

  2. พอจะมีสอนใช้ หรือปรับแก้ เพื่อให้ใช้ lib wifiManager มั้ยอะครับ พอดีหาข้อมูลมา พบว่า esp32 ใช้ได้แล้ว แต่ผมไม่รู้จะต้องแก้ไข หรือแทรกโค๊ตเข้าไปที่ส่วนไหนบ้างหน่ะครับ

    1. ลองศึกษาเป็น Autoconnect Lib นะครับ น่าจะใช้งานได้ดีกว่าบน ESP32

  3. พี่พอจะสอนวิธีใช้ lib WifiManager มั้ยครับ พอดีผมลองทำแล้ว แต่ผมไม่รู้ว่าจะต้องคอมเม้นโค๊ตตัวไหนบ้าง หรือ เขียนตัวไหนเพิ่มในตำแหน่งไหนหน่ะครับ

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.