Tip! ใช้ Arduino IDE กับ LMIC

Somsak Lima
4 min readApr 15, 2020

--

มีหลายคนที่เพิ่งจะเริ่มใช้งาน Arduino IDE มีเทคนิคที่จะแนะนำเพื่อให้ง่ายต่อการใช้งานดังนี้

  1. Preference

ควรตั้งค่าให้ Show verbose ทั้งเวลา Compile และ Upload

2.หน้าต่าง Output ควรขยายเพื่อให้เห็นข้อความ error สีแดงได้ง่ายขึ้น การ debug ปัญหาให้สังเกตุจากบรรทัดแรกที่เปลี่ยนจากตัวอักษรสีขาวเป็นสีแดง สีขาวคือ info ส่วนสีแดงคือ error

3. เพิ่ม Library

3.1 เพิ่ม Library แบบ Manual ด้วยวิธี Download จาก Github

คลิก Clone or Download จะได้ไฟล์ .zip มา

สามารถ Add Zip ได้ ด้วยเมนู Include Library/ Add .ZIP library

3.2 การเพิ่ม Library โดยใช้เมนู Manage Libraries

คีย์ Library ที่ต้องการในช่องว่าง เมื่อพบแล้ว ให้คลิก Install บางครั้งจะขึ้นมาให้เลือกจากหลายผู้พัฒนา ให้เลือกที่ตรงกับ hardware ของเรา

4. Dir จัดเก็บ Library อยู่ที่ C:\Users\<User name>\Documents\Arduino\libraries

5.ตัวอย่างสามารถลองใช้จากใน Example ได้

6. Error FAILURE radio.c

ให้ดู Pin Mapping ในโปรแกรม เช่น

const lmic_pinmap lmic_pins = {
.nss = 10,
.rxtx = LMIC_UNUSED_PIN,
.rst = LMIC_UNUSED_PIN,
.dio = { 4, 5, 7 },
};

สังเกตุขา NSS, Dio0, Dio1,Dio2 ว่ากำหนดค่าถูกต้องหรือไม่ และให้ดูว่าการเชื่อมต่อของขาแน่น

7. File กำหนดความถี่ LMIC IBM อยู่ที่ File lorabase.h

8.ถ้าเจอ Error ตอน Compile แสดง “‘_FDEV_SETUP_WRITE’ was not declared in this scope.”. ให้เปิดไฟล์ config.h ใน LMIC Library. ใส่ // หน้าบรรทัด #define ตามตัวอย่าง

//#define LMIC_PRINTF_TO Serial

9. ถ้าเจอ Error ตอน Compile แสดงบรรทัดแรก LMIC-Arduino-AS923-upper-master\lmic\lmic.c.o: In function `calcRxWindow’:

ให้ ไปที่ C:\Users\yourUserName\Documents\Arduino\libraries\arduino-lmic-master\src\lmic
แทนที่ที่ขีดเส้นใต้ด้วย User Name บน PC ที่ใช้อยู่

เปิด ไฟล์ oslmic.h
หาคำ table_get ## postfix; ประมาณบรรทัดที่ 229–230
ใส่ static ด้านหน้า

static inline type table_get ## postfix(const type *table, size_t index) { \

Save ไฟล์และ Complie ใหม่

10.Serial Monitor และข้อความ Debug

บรรทัด TXMODE ค่อนข้างสำคัญจะแสดงความถี่ที่ส่งและ SF ที่ใช้ออกมา ต้องให้ตรงกับความถี่ของตัวอุปกรณ์ LoRaWAN Gateway ที่ใช้รับ

11. กรณีใช้ ESP32 Dev Board หรือ Heltec ESP32 อื่นๆ

เมื่อทำการ Flash โปรแกรม และไม่สามารถ Auto Flash ได้หน้าจอแสดง Error ดังนี้

C:\Users\somsak\AppData\Local\Arduino15\packages\esp32\tools\esptool_py\2.6.1/esptool.exe — chip esp32 — port COM4 — baud 921600 — before default_reset — after hard_reset write_flash -z — flash_mode dio — flash_freq 80m — flash_size detect 0xe000 C:\Users\somsak\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.2/tools/partitions/boot_app0.bin 0x1000 C:\Users\somsak\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.2/tools/sdk/bin/bootloader_dio_80m.bin 0x10000 C:\Users\somsak\AppData\Local\Temp\arduino_build_981274/abp07.ino.bin 0x8000 C:\Users\somsak\AppData\Local\Temp\arduino_build_981274/abp07.ino.partitions.binesptool.py v2.6Serial port COM4Connecting…….._____….._____….._____….._____….._____….._____…..____An error occurred while uploading the sketch_A fatal error occurred: Failed to connect to ESP32: Invalid head of packet (0x53)

ปัญหาเนื่องจากการออกแบบที่มี bug ของ Board บางท่านก็จะใส่ C คล่อมขา EN กับ GND ไว้โดยใช้ C ค่าตั้งแต่ 1–10uF เท่าที่ลองใช้ 2.2uF ก็ได้ผลดีพอควร การ Upload ทำได้เสถียรมากขึ้น

หรืออาจใช้วิธี Manaul ดังนี้

สำหรับ ESP32 Dev Board หลังจอขึ้นคำว่า connecting ให้ กดปุ่ม BOOT ค้างไว้ แล้วกด EN หนึ่งครั้ง แล้วจึงปล่อยปุ่ม BOOT

สำหรับ Heltec ESP32 หลังจอขึ้นคำว่า connecting ให้ กดปุ่ม prg ค้างไว้ แล้วกด rst หนึ่งครั้ง แล้วจึงปล่อยปุ่ม prg

12. ปัญหาการส่งเข้า LoRaWAN Network Server เห็นข้อมูลครั้งแรก ส่งครั้งหลังไม่เห็นข้อมูล

ให้เอาติกตรง Frame Counter Checks ออก ออปชั่นนี้เลือกว่าจะเช็คลำดับของ Packet หรือไม่

หากเราเลือกออปชั่นตรงนี้ กรณีที่ส่งลำดับ Packet ต่ำกว่าลำดับที่นับไปแล้วก็จะไม่แสดงข้อมูล เนื่องจากเป็นการเพิ่มมาตรการความปลอดภัยป้องกัน Node แปลกปลอม

12.ถ้าใช้ LMIC ของ MCCI จะต้องตั้งค่า #define LMIC_DEBUG_LEVEL 1 ใน \libraries\MCCI_LoRaWAN_LMIC_library\project_config\lmic_project_config.h เพื่อให้แสดงบรรทัด TX MODE ออกมาที่ Serial Monitor

13. ถ้าใช้ LMIC ของ MCCI จะต้องตั้งค่าความถี่ใน File lmic_project_config.h
โดยให้แก้ define เป็น as923 แต่จะมีการส่งออกแค่สองความถี่คือ 923.2 และ 923.4
#define CFG_as923 1 โดยสองความถี่นั้นกำหนดไว้ที่ file lorabase_as923.h \Documents\Arduino25\libraries\MCCI_LoRaWAN_LMIC_library\src\lmic

14. กรณีใช้ บางครั้งหากเอาตัวอย่างจาก Lib อื่นมาใช้ กับ MCCI Lib จะเห็น unknown event ซึ่งเป็น event TXSTART สามารถเพิ่ม CASE ev ในโปรแกรมให้แสดงออกมาถูกต้องได้โดยดูจากตัวอย่าง Example ใน Lib MCCI

case EV_TXSTART:
Serial.println(F(“EV_TXSTART”));
break;

15. สำหรับ Node Class A การ Downlink จะเกิดหลัง Event TXCOMPLETE

case EV_TXCOMPLETE:
Serial.println(F("EV_TXCOMPLETE (includes waiting for RX windows)"));
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println(F("Received ack"));
if (LMIC.dataLen) {
// data received in rx slot after tx
Serial.print(F("Received "));
Serial.print(LMIC.dataLen);
Serial.print(F(" bytes for downlink: 0x"));
for (int i = 0; i < LMIC.dataLen; i++) {
if (LMIC.frame[LMIC.dataBeg + i] < 0x10) {
Serial.print(F("0"));
}
Serial.print(LMIC.frame[LMIC.dataBeg + i], HEX);
}
Serial.println();
}

โค้ดส่วนนี้จะแสดงค่าที่ Downlink ออกมาที่หน้า Serial Monitor

16. การตั้งให้ node ส่งแบบ Single Channel บางครั้งสามารถกำหนดได้ด้วยคำสั่ง LMIC_disableChannel

LMIC_setupChannel(0, 923200000, DR_RANGE_MAP(DR_SF12, DR_SF7),  BAND_CENTI);      // g-band
LMIC_setupChannel(1, 923400000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI); // g-band
LMIC_setupChannel(2, 922200000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(3, 922400000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(4, 922600000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(5, 922800000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(6, 923000000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(7, 922000000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-band
LMIC_setupChannel(8, 924800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI); // g2-band
// disable channel 2 — channel 8. ใช้ i=2; i <9
// disable channel 1 — channel 8. ใช้ i=1; i <9 Single Channel
for (int i = 1; i < 9; i++) {
LMIC_disableChannel(i);
}

17.เมื่อ Compile หากเจอ error multiple definition of `hal_init’ แสดงว่า มี Lib Hal ซ้ำกับของ MCCI LMIC

ให้เพิ่ม
#define hal_init LMICHAL_init
ในไฟล์ lmic_project_config.h ใน Dir project_config ในที่เก็บ Libraries

หรือในไฟล์ config.h ใน lmic libraries\LMIC-Arduino-AS923-upper-master\src\lmic

--

--

Somsak Lima
Somsak Lima

Written by Somsak Lima

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

No responses yet