เริ่มต้นศึกษา VSCode และ PlatformIO

Somsak Lima
10 min readMay 16, 2022

--

ลงมือปฎิบัติโดยใช้อุปกรณ์ 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
}

--

--

Somsak Lima
Somsak Lima

Written by Somsak Lima

สนับสนุนและส่งเสริมให้ผู้สนใจสามารถใช้งานเทคโนโลยี LoRa และ LoRaWAN ได้ โดยนำความรู้ที่ได้ไปต่อยอดเพื่อใช้งาน

No responses yet