เริ่มต้นศึกษา VSCode และ PlatformIO
ลงมือปฎิบัติโดยใช้อุปกรณ์ TTGO Tbeam เพื่อทำ Helium Mapper (เขียนขึ้นใหม่จากเวป คลิก)
เกริ่นนำ
ปัญหาหนึ่งสำหรับคนที่ศึกษาการใช้งาน PlatformIO ด้วยตัวเอง แรกๆ ก็จะสับสนได้ง่ายเนื่องจาก มีทางเลือกว่าเราจะเอาไปติดตั้งบนโปรแกรม Atom หรือโปรแกรม VSCode
แรกๆ ผู้เขียนเริ่มพยามใช้ PlatformIO กับโปรแกรม Atom การใช้งานไม่ค่อยประสบความสำเร็จ จึงเปลี่ยนมาใช้บน VSCode ซึ่งหาข้อมูลศึกษาบน Internet ได้ง่ายกว่า
อีกปัญหาคือหลังจากการ Add Plugin PlatformIO บน VSCode แล้วจะเห็นหน้าจอมีเมนูซ้อนกันสองชั้น นอกจากนั้นจะสับสนอีกเนื่องจากมีเมนูทั้งด้านบน ด้านซ้ายและด้านล่าง ซ้อนๆ กันอยู่ซึ่งทำให้มือใหม่อย่างผมสับสนว่าเมนูไหนเป็นของ VSCode หรือเมนูไหนเป็นของ Plugin PlatformIO
ติดตั้ง VSCode
ดาวน์โหลดจากเวปแล้วติดตั้งให้เรียบร้อย
เรียกใช้โปรแกรม VSCode
คลิก Extension หรือกด Ctrl+Shift+X
พิมพ์ PlatformIO ในช่อง Search Extensions in Marketplace
คลิก PlatformIO แล้วคลิก Install
ติดตั้งเสร็จให้เริ่มโปรแกรม VSCode ใหม่
เริ่มต้นใช้ VSCode และ PlatformIO
หากติดตั้งเรียบร้อยจะเห็น TAB Quick Start ดังภาพ ซึ่งเป็นคำสั่งของ VSCode
และจะเห็น logo PlatformIO ตามภาพอยู่ด้านซ้ายเป็นหน้ามนุษย์ต่างดาว
หากคลิกรูปมนุษย์ต่างดาวจะเห็นเมนู PlatformIO Quick Access แทรกตรงกลาง ตามภาพ
หากคลิก PIO HOME/ OPEN จะเห็นหน้าจะ Welcome to PlatformIO
เริ่ม Download โปรแกรม Helium Mapper จาก GITHUB
ให้เลือก Tab Getting Start บน VSCode หรือ (อยู่ที่ Tab Welcome ของ VSCode)แล้ว คลิก Clone Git Repository
เปิด Github https://github.com/Max-Plastix/tbeam-helium-mapper
คลิก Code และ Copy URL
นำ URL มาแปะใน VSCode
กด Enter
เราสามารถเลือกตำแหน่งที่เราจะเก็บไฟล์ได้ กรณีของผมจะสร้างที่เก็บโดยเฉพาะใต้ Folder ชื่อ PlatformIOFile ดังนั้นให้สร้าง Folder ใหม่ชื่อ PlatformIOFile แล้วเลือก Selected Repository Location เป็น PlatformIOFile ตามรูป
จะเจอ Add to Workspace
คลิก Yes เมื่อถูกถามว่าจะไว้ใจข้อมูลที่จะเพิ่มเข้าใน Workspace เราหรือไม่
หน้าจอจะเปลี่ยนเป็น
จะเห็นไฟล์ platformio.ini สองไฟล์ ให้แก้ไฟล์ที่อยู่ใต้ tbeam-helium-mapper
เพิ่มความถี่ เป็น -D CFG_as923=1 และให้ใส่ Comment ; ด้านหน้าบรรทัด us915
มีสอง File ที่ต้องแก้ใน Main คือ credentials.cpp และ configuration.h.
ให้แก้ไฟล์ lmic_project_config.h อยู่ใต้ที่เก็บ library MCCI_LoRaWAN_LMIC_library\project_config\lmic_project_config.h
// project-specific definitions
//#define CFG_eu868 1
//#define CFG_us915 1
//#define CFG_au915 1
#define CFG_as923 1
// #define LMIC_COUNTRY_CODE LMIC_COUNTRY_CODE_JP /* for as923-JP */
//#define CFG_kr920 1
//#define CFG_in866 1
//#define CFG_sx1276_radio 1
#define CFG_sx1262_radio 1
//#define LMIC_USE_INTERRUPTS
#define hal_init LMICHAL_init
#define LMIC_DEBUG_LEVEL 2
เปิด Helium Console
สร้าง Device แล้ว Copy devEUI, appEUI และ appKEY
รูปแบบที่เราจะนำมาใส่ในไฟล์ credentials.cpp จะเป็น Hex (ขึ้นด้วย 0x) โดย
Device EUI ให้เรียงแบบ lsb (มี Hex 8 ตัว)
App EUI ให้เรียงแบบ lsb (มี Hex 8 ตัว)
App Key ให้เรียงแบบ msb (มี Hex 16 ตัว)
วิธีก็คือคลิกเครื่องหมายด้านหน้าให้เปลี่ยนเป็นรูปแบบที่เราต้องการ แล้ว Copy มาแทนที่ใน File credentials.cpp
*Pitfall* การใช้ LoRaWAN ที่เราเลือก Authen ด้วยวิธี OTAA จะต้องใช้คีย์ 3 ชุดและคีย์ทั้งสามมีรูปแบบการเรียงไม่เหมือนกัน ทำให้การป้อนยุ่งยากและมีโอกาศผิดพลาดสูง มือใหม่มักมีปัญหาสับสนตรง Key ดังกล่าว ข้อแนะนำคือตรวจสอบ Key ให้แน่ใจว่าตรงกันทั้งที่ใช้ในโปรแกรมภาษา C++ และที่ลงทะเบียงไว้บนหน้า Console
คลิกที่ File main.cpp กด icon เครื่องหมาย ถูก ด้านล่างจอเพื่อ Build ระหว่าง Build จะมีการติดตั้ง Library ที่จะต้องใช้ เช่นตามภาพ
ถ้า Build สำเร็จจะเห็นข้อความสีเขียว SUCCESS
ลองเสียบ Tbeam แล้วกดเครื่องหมายลูกศรขวาเพื่อ Upload
อาจจะมีการ Compile ใหม่อีกครั้ง
หากเห็น Writing แสดงว่า PlatformIO สามารถเชื่อมต่อและกำลัง Flash โปรแกรม และเมื่อ Flash สำเร็จจะเห็นข้อความ เช่น
Wrote 920272 bytes (546473 compressed) at 0x00010000 in 13.4 seconds (effective 548.2 kbit/s)…
Hash of data verified.Leaving…
Hard resetting via RTS pin…
การเพิ่ม Function บน Helium Console
คลิก + แล้วเลือก Add Funtion
Step 1 ป้อนชื่อในช่องแรก เลือก Type เป็น Decoder เลือก Format เป็น Custom Script
Step 2 ให้ดูใน VSCode ใต้ console-decoders เปิดแฟ้ม unified_decoder.js
แล้ว Copy ทั้งหมดลงมาวางในช่อง ENTER CUSTOM SCRIPT
วางเรียบร้อยให้คลิก Save Function
การเพิ่ม Integration บน Helium Console เพื่อให้ส่งข้อมูลต่อไปยัง Helium Mapper หรือ Cargo
Helium Console ทำหน้าที่แต่การจัดการอุปกรณ์และข้อมูล ยังไม่มีระบบประมวลผลข้อมูลออกเป็นรูปภาพที่เข้าใจง่าย หรือเรียกง่ายๆ ว่าขาดฟังค์ชั่น Visualization เราจะต้องส่งข้อมูลต่อไปยัง Platform อื่น ขั้นตอนการส่งไปต่อ เรียกว่า Integrations
เราจำเป็นต้องเพิ่ม Integration โดยคลิกเครื่องหมาย + สีดำด้านล่างขวาหน้าจอ
ให้เลือก Add Integration
ใน Console ของ Helium มี Integration สองกลุ่มคือ Prebuild กับ Custom
ตัวอย่าง Prebuild ที่มีให้เลือก
ส่วน Custom ก็มี เช่น HTTP, MQTT, AWS IoT Core, Azure Iot Hub เป็นต้น
กรณีจะส่งข้อมูลต่อไปยัง Helium Mapper ให้เลือก HTTP
จะเห็นออปชั่นและฟิลด์ที่ต้องกรอกตามภาพ
ป้อนช่อง Endpoint URL เป็นคำสั่ง Mappers API Ingest ดังนี้
https://mappers.helium.com/api/v1/ingest/uplink
ป้อน Name Your Integration ป้อนเสร็จให้คลิก Add Integration
สร้าง Flow
ต้องสร้าง Flow โดยการเชื่อม Device-Function-Integration ขึ้นมาเพื่อให้ระบบ Integration เริ่มทำงาน
การใช้งานจะคล้าย Software MS Visio คือจับแล้วลากออกจากหน้าต่างเล็กๆด้านซ้ายแล้วมาวางพื้นที่ว่างด้านขวา และเชื่อม Node ด้วย EDGE หรือเส้น
ขั้นแรกให้เลือก Node ที่ต้องการโดยจับลากมาวาง ซึ่ง Node ที่ต้องมีคือ Device Node, Function Node และ Integration Node แล้วจึงค่อยเชื่อมเข้าหากันตามตัวอย่าง
วิธีการใช้งาน
เมื่อ Flash โปรแกรมลง Tbeam เรียบร้อย เมื่อเปิดให้ Tbeam ทำงานจะเห็นการ Joining ถ้า Join สำเร็จจะขึ้น Joined Helium ถ้าไม่สำเร็จอยู่ระหว่าง retry จะขึ้นเครื่องหมาย + ทุกครั้งที่ retry
เมื่อ Join สำเร็จและ Tbeam จับสัญญาณ GPS ได้จะเริ่มส่ง Packet 0
จะมี microswitch เรียงอยู่ 3 ปุ่ม คือปุ่ม PWR / IO38 / RST
PWR เพื่อเลือกเมนู กดซ้ำอีกครั้งเพื่อเลื่อนลงเมนูถัดไป
IO38 คือ OK หรือตกลงทำตามเมนูที่เลือกไว้
RST คือ Reset เริ่ม Boot ใหม่
เมนูที่มีให้เลือก
Send Now
Power Off
Distance + ปรับระยะทางเพิ่มขึ้น 5 เมตร
Distance — ปรับระยะทางลดลง 5 เมตร
Time + เปลี่ยนแปลงรอบเวลาส่งให้มากขึ้น 10 S
Time — เปลี่ยนแปลงรอบเวลาส่งให้น้อยลง 10 S
Change SF
Full Reset
USB GPS
Deadzone here
No Deadzone
Stay On
GPS Reset
Experiment
เมื่อจับสัญญาณ GPS ได้ LED สีแดงใกล้ Chip GPS NEO6M จะกระพริบเป็นระยะ มุมบนขวาจอ OLED จะเห็นจำนวนดาวเทียมที่รับได้ในขณะนั้น ตามภาพคือ 5 ดวง ยิ่งจำนวนที่รับได้มาก คามแม่นยำของตำแหน่งก็จะยิ่งสูง
ขณะ่ที่ Tbeam ส่งสัญญาณ LoRa จะมีไฟสีฟ้าติด ถ้าต้องการให้ส่งในทันทีไม่ต้องรอครบรอบเวลาให้กด microswitch ด้านซ้ายหลายๆ ครั้งให้มาอยู่ตรง Send Now แล้วกด MicroSwitch ตรงกลางครั้งหนึ่งเพื่อยืนยันการส่ง
กรณีเราเปลี่ยน Key OTAA ใหม่และ Flash Firmware ใหม่ให้เลือก Full Reset เพื่อล้างความจำเดิมเช่น ประวัติการ Join , Counter
การทดสอบใกล้บ้าน ดู Hotspot ว่าแถวบ้านเปิดและทำงานอยู่หรือไม่โดยไปที่เวป https://app.hotspotty.net/ ตามภาพ หากเป็นสีแดง แดงว่า offline ไม่ทำงานอยู่
หากหลังชื่อเป็นสีเขียวแสดงว่าพร้อมทำงาน (หน้าข้อมูลของระบบ Helium ไม่ได้แสดงแบบ Real time เนื่องจากการ Update ช้ามาก) การที่เราเห็นเป็นสีเขียว ตัว Hotspot อาจจะปิดอยู่ หรือเราเห็นเป็นแดงตัว Hotspot อาจจะเปิดอยู่
ถ้า Tbeam เราเชื่อมผ่าน Hotspot ได้จะเห็นข้อมูลบนหน้าจอ Console เช่น
จะเห็น Join Request และ Join Accept
หาก Tbeam รับสัญญาณ GPS ได้และเริ่มส่งข้อมูลจะเห็น Uplink ขึ้น Default จะส่งขึ้นทุก 5 นาที
ลองคลิกดู + ที่หน้าบรรทัด จะมีรายละเอียดของแต่ละ Packet ที่ส่งมา
จะแสดงสาม Tab คือ General, Hotspots และ Integration Messages โดย Tab แรก General จะแสดง Payload Size, Port ที่ส่งเข้ามา และ Device Address
Tab ที่สอง Hotspot แสดงข้อมูลที่ส่งว่า Hotspot อะไรรับได้บ้างและข้อมูลสัญญาณ RF ที่รับได้ ค่า RSSI, SNR, Freq, Spreading
Tab ที่สามไว้ดูว่าการทำงาน Integration ที่เราตั้งไว้ทำงานได้ถูกต้องปรกติหรือไม่
ถ้ามีปัญหาสามารถมาดู tab นี้เพื่อดูปัญหาได้ว่าเกิดจากอะไร
หากดู Graph จะเห็นจุด สีของจุดจะมีความคือหากเป็นสีฟ้าแสดงว่าการส่งออกไป integration ปรกติ หากมีปัญหาจะขึ้นเป็นจุดสีเหลืองแสดงว่า ค่า Integration ที่ตั้งไว้ทำงานผิดพลาด ต้องกลับไปหาจุดผิดพลาดแล้วแก้ไขหรือถ้าเป็นสีแดงคือไม่ได้ตั้งค่า integration ไว้
ดูผลที่เวป Helium Mapper
เปิดเวป mappers.helium.com จะเห็นตำแหน่ง hex ที่ส่งข้อมูลถึง Hotspot เป็นสีเขียว
หากคลิกไปที่จุด Hex เล็กๆ จะแสดงชื่อ Hotspot ที่รับสัญญาณ Tbeam ได้จากตำแหน่งนั้น บางจุดอาจจะมี Hotspot รับได้มากกว่า 10 Hotspot
การ เพิ่ม Library ลงใน Project หรือ platformIO.ini
คลิก Libraries ใต้ PIO Home แล้วคลิก Libraies ใน PlatformIO
ในช่อง Search Libraries ให้พิมพ์ชื่อ Library ที่ต้องการใช้ เช่น MCCI LMIC เป็นต้น แล้วกด Enter หรือ Icon แว่นขยาย
จะเห็น MCCI Library ขึ้นมาให้เลือก หากใช่ให้คลิกที่ชื่อ Library
คลิก Add to Project
ให้คลิก Select a project ที่จะเพิ่มเข้าไป
เช่น ของผมจะเลือกเพิ่มเข้าไปใน PlatformIOFile\heltec
หากเปิด File PlatformIO.ini
จะเห็นบรรทัด lib_deps เพิ่มขึ้นมาโดยมีบรรทัด mcci-catana/MCCI LoRaWAN LMIC อีกหนึ่งบรรทัด
และหากดูใช้ Heltec .pio libdeps จะเห็นมีการเพื่ม Library เข้ามาแล้ว
กรณีที่ต้องการเพิ่มด้วยมือ
ให้ Copy Lib ที่ Download ไปลงไว้ใน Directory ดังกล่าว
1.Download โดย กด Ctrl+Clink ตัวอักษร Web สีฟ้า จะเปิดหน้า เช่น
2. Copy ลง Dir ที่ได้จาก Dir ตามรูป
ใน Main ควรตั้งค่า Serial.begin (115200)
ตัวอย่างจาก Adafruit BME280
ไฟล์ bme280test.ino
แก้
1.void setup() {
Serial.begin(115200);
2.ใน PlatformIO
เพิ่มบรรทัด
monitor_speed = 115200
3.ใน Main
status = bme.begin(0x76);
4.ย้าย void loop() ไว้หลัง void Printvalues()
5. ใส่ ; หน้า lib_deps เพราะไม่ได้ใช้
lib_deps =
adafruit/Adafruit BME280 Library@².2.2
; mcci-catena/MCCI LoRaWAN LMIC library@⁴.1.1
6. แก้ Project ให้ตรงที่กำลังจะ Comply
หลังจาก Build แล้วให้คลิก ICON รูปปลั๊กไฟ
จะเปิดหน้าต่าง Serial Monitor หรือ Terminal ดูการทำงานของโปรแกรมที่เรา Flash ไปแล้ว
อ้างอิง
1.วิธีติดตั้งและใช้งาน VSCode และ PlatformIO เบื้องต้น คลิก
2.วิธีเพิ่ม Library ใน Project คลิก
หมายเหตุ การตั้งค่า Gateway uplink port ถ้าเป็น TTN, Chirpstack ใช้ 1700
ถ้า Helium server ใช้ 1680
Note!
1.หากเป็น TTN การดู OTAA Key ทั้งสามค่า
2.กรณีเชื่อมเข้า TTN ใส่ Payload format ตามภาพ
ให้เลือก Custom Javascript formatter แล้ว Copy ข้อมูลทั้งหมดจาก
unified_decoder.js อยู่ใน VSCode ใต้ console-decoders
3.หากใช้ Dragino LG308-AS923-TH-EC25 ซึ่งเป็น Data Only Hotspot
เช็ค Status โดย
ssh เข้า port 2222 หรือ port 22 ถ้าเกาะกับ IP 10.
User Name root
Password dragino
เรียกคำสั่ง helium_gateway info
root@dragino-1d0310:~# helium_gateway info
{
“region”: “AS923_1”,
“fw”: “dragino-1.0.0-alpha.24”,
“gateway”: {
“block_age”: 147,
“height”: 1360106,
“key”: “112EmJPTdcXWkLYUTtfafRrgj4a3B7HP874JRr42nKv39uaDrR1”,
“uri”: “http://174.138.180.58:8080/"
},
“name”: “stable-bubblegum-pig”,
“onboarding”: “14ZJJsZGg4v7KmUraTsRe3oUwLa3rqikbRF49CK3U34V”,
“key”: “14ZJJsZv7KCXmUraTsRe3oUwLa3rqikbRLJa9nK3U34V”
}
แสดงว่า Dragino น่าจะทำงานปรกติ
หรือใช้คำสั่ง Logread
ตัวอย่างข้อมูล GPS แต่ละ Packet
Fri May 20 06:17:48 2022 daemon.info lora_pkt_fwd[18316]: PKT_FWD~ DATA_UNCONF_UP-> {“DevAddr”: “48000006”, “FCtrl”: [“ADR”: 0, “ADRACKReq”: 0, “ACK”: 0, “RFU” : “RFU”, “FOptsLen”: 0], “FCnt”: 11, “FPort”: 2, “MIC”: “C9178163”}
Fri May 20 06:17:48 2022 daemon.info lora_pkt_fwd[18316]: RXTX~ {“rxpk”:[{“tmst”:2438510171,”time”:”2022–05–19T23:17:48.044764Z”,”chan”:1,”rfch”:0,”freq”:923.400000,”stat”:1,”modu”:”LORA”,”datr”:”SF7BW125",”codr”:”4/5",”lsnr”:10.2,”rssi”:-31,”size”:24,”data”:”QAYAAEgACwAC9wqjEInN/WGmQXhjgRfJ”}]}
Fri May 20 06:17:48 2022 daemon.info helium_gateway[2418]: INFO uplink @2438510171 us, 923.40 MHz, Ok(DataRate(SF7, BW125)), snr: 10.2, rssi: -31, len: 24 from A8:40:41:1D:03:10:41:50, module: gateway
Fri May 20 06:17:48 2022 daemon.info lora_pkt_fwd[18316]: INFO~ [up] PUSH_ACK received in 0 ms
logread|grep JOIN เป็นต้น
หมายเหตุ กสทช. อนุญาติให้ทำอุปกรณ์ใช้งานที่ความถี่ 920–925 MHzโดยไม่ต้องขออนุญาติแต่ต้องมีกำลังส่งไม่เกิน 50mW (eirp)
PlatformIO บน Raspbian
สามารถใช้งานได้เช่นเดียวกับบน PC โดยการติดตั้ง VSC ก่อน
ด้วยคำสั่ง
sudo apt update
sudo apt install code
เรียกใช้ VSC แล้วเพิ่ม Plugin PlatformIO แบบเดียวกับวิธีทำบน PC
แล้วต้องเปิดให้ user ที่เราใช้งานสามารถใช้ USB Port ได้ ด้วยคำสั่ง
sudo usermod -a -G dialout USERNAME
หากใช้ Heltec LoRa V.3 ลอง Upload แก้ main.cpp เป็นโปรแกรม Blink ดังนี้
#include <Arduino.h>
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(35, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(35, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(35, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}