วิธีใช้งานเบื้องต้นและวิธี Flash Firmware Ra-08H Kit

Somsak Lima
6 min readJul 19, 2023

--

วิธีการใช้งานแบบต่อตรงกับ USB-TTL

  1. ต่อ USB-TTL เข้ากับ Kit ตามรูป ดังนี้ 3.3V-VCC ,GND-GND, TX-RX,RX-TX

2. เรียกโปรแกรม Termite

3.คลิก Setting ตั้งค่า Com Port ให้ถูกต้อง Baud Rate 9600, Data bit 8, Stop bits 1, Parity None และอื่นๆ ตามรูป แล้วคลิก OK

4.ช่องคำสั่งล่างสุดให้ป้อนคำสั่ง เช่น AT+CDEVEUI? แล้วกด Enter หากปรกติจะเห็นหน้าจอแสดงค่า DEVEUI ออกมา

5.ลองกดปุ่ม RST 1 ครั้งจะเห็นข้อความเช่น

AT Command ที่ใช้ให้ดูจากเอกสารของ AI Ra-08H หรือ ASR6601 ครับ เช่น คลิก

ตัวอย่างการ Join แบบ ABP หรือ OTAA และการส่งข้อมูล เช่น

อาจจะใช้โปรแกรม SSCOM แทน Termite ก็ได้

ตัวอย่าง คำสั่งส่งข้อมูลหลัง Joined และหากเลือกรูปแบบ Decode เป็น Cayenne.LPP จะเห็นข้อมูลดังนี้

sendATcommand ('AT+DTRX=0,2,36,016701120268950373006406010107032ee0') 
หรือ
AT+DTRX=0,2,36,016701120268950373006406010107032ee0

"decoded_payload": {
"analog_out_7": 120,
"barometric_pressure_3": 10,
"digital_out_6": 1,
"relative_humidity_2": 74.5,
"temperature_1": 27.4
},

วิธีการใช้งานต่อผ่าน ESP32 และตัวอย่างโปรแกรมภาษา C

ใช้ Arduino IDE กับ ESP32 เช่นใช้ DOIT ESP32 DEVKIT V.1

การเชื่อมสายไฟทำตามตัวอย่างดังภาพ เชื่อมเข้า ESP32 ผ่าน UART 2

ESP32 มี Hardware Serial UART อยู่ 3 ports คือ UART0, UART1,UART2 แต่ UART0 ได้ถูกนำไปใช้กับหน้าจอ Monitor หรือ Debug การทำงาน (เชื่อมต่อกับหน้าต่าง REPL หรือ Serial Monitor) ส่วน UART1 ขา RX ก็ถูกนำไปใช้กับ SPI ดังนั้นการใช้งาน LoRaWAN จะต้องใช้กับ UART2

ตั้ง Speed ของ UART เป็น 9600 bps

Board ที่เลือกสามารถเลือกเป็น DOIT ESP32 DEVKIT V1 เป็นต้น

ตัวอย่างที่ 1

#include <CayenneLPP.h>
#include <stdio.h>
#include <string.h>
CayenneLPP lpp(51);
void loop() {
int dlen;
sendCommand("AT+CSTATUS?");
lpp.reset(); // clear the buffer
lpp.addTemperature(2, 31.1);
lpp.addRelativeHumidity(3, 51.2);
dlen = lpp.getSize();
Serial.println(lpp.getSize());
char hex_str[(dlen * 2) + 1];
Serial.println("+++++++++++Show Data++++++++++++");
//Convert STRING Data to HEX
string2hexString((char * ) lpp.getBuffer(), hex_str, dlen); //ascii_str, hex_str
Serial.println(hex_str);
Serial.println("+++++++++++SEND Data++++++++++++");
sendHexData(dlen, hex_str);
delay(10000);
}
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
sendCommand("AT+CJOIN=1,0,10,1");
delay(10000);
}
void sendCommand(String atComm) {
String response;
Serial2.print(atComm + "\r\n");
Serial.println("*******AT Command Sent");
Serial.print(atComm + "\r\n");
delay(300);
while (Serial2.available()) {
char ch = Serial2.read();
response += ch;
}
Serial.println(response);
}


void sendHexData(int type, String data) {
Serial.println("*******HEX Build");
String command = (String)
"AT+DTRX=0,2," + type + "," + data + (String)
"\r\n";
sendCommand(command);
}
void string2hexString(char * input, char * output, int dlen) {
int loop = 0;
int i = 0;
int count = dlen;
Serial.println("count");
Serial.println(count);
while (loop < count) {
sprintf((char * )(output + i), "%02X", input[loop]);
loop += 1;
i += 2;
}
//insert NULL at the end of the output string
output[i++] = '\0';
}

ส่งตัวอย่างข้อมูลคงที่และเป็นการส่งรูปแบบ Cayenne.LLP

หากดูบน Console TTN จะเห็นข้อมูลดังนี้

ตัวอย่างที่ 2 (ปรับปรุงจาก example/at-test-lorawan/at-test-lorawan.ino)

#include <stdio.h>
#include <string.h>

#define DEBUG true

//get appeui and appkey from the thing network
#define DEVEUI "1200000000000002"
#define APPEUI "0000000000000000"
#define APPKEY "20000000000000000000000000000001"

bool ModuleState = false;
long int runtime = 20000;

void setup()
{

Serial2.begin(9600);
Serial.begin(9600);

Serial.println("\r\n****************************************");

Serial.println("Now turnning the Lorawan on.Please wait.");
Serial.println("****************************************");


//set DEVEUI
sendData("AT+CDEVEUI?", 3000, DEBUG);
//sendData("AT+CDEVEUI=" + String(DEVEUI), 3000, DEBUG);
sendData("AT+CAPPEUI?", 3000, DEBUG);
sendData("AT+CAPPKEY?", 3000, DEBUG);
//set APPEUI and APPKEY
//sendData("AT+CAPPEUI=" + String(APPEUI), 3000, DEBUG);
//sendData("AT+CAPPKEY=" + String(APPKEY), 3000, DEBUG);

//set join mod "OTAA"
//sendData("AT+CJOINMODE=0", 3000, DEBUG);

//join lorawan
//sendData("AT+CCLASS=0", 30000, DEBUG);

//join lorawan
sendData("AT+CJOIN=1,0,10,1", 30000, DEBUG);
sendData("AT+CSTATUS?", 30000, DEBUG);

//set one message to webgate
//AT+DTRX=1,2,10,4D414B455246414253
//sendData("AT+DTRX=1,2,5,FF 00 88", 3000, DEBUG);
}

void loop()
{
if (runtime - millis() > 10000)
{
int hum=51.1;
int temp=32.2;

char msg[30] = "";
sprintf(msg, "AT+DTRX=1,2,5,%02x%04x", hum, temp);
Serial.println(msg);
sendData((String)msg, 3000, DEBUG);

runtime = millis();
}
while (Serial2.available() > 0)
{
Serial.write(Serial2.read());
yield();
}
while (Serial.available() > 0)
{
Serial2.write(Serial.read());
yield();
}
}


String sendData(String command, const int timeout, boolean debug)
{
String response = "";
Serial2.println(command);
long int time = millis();
while ((time + timeout) > millis())
{
while (Serial2.available())
{
char c = Serial2.read();
response += c;
}
}
if (debug)
{
Serial.print(response);
}
return response;
}

กดปุ่ม EN (Reset) เพื่อให้เริ่ม Boot ESP32 ใหม่

วิธีการใช้งานต่อผ่าน ESP32 และตัวอย่างโปรแกรมภาษา MicroPython

from machine import UART
import time
from time import sleep
uart = UART(2, 9600,timeout=1000)

def sendATcommand(ATcommand):
print("Command: {0}\r\n".format(ATcommand))
uart.write("{0}\r\n".format(ATcommand))
rstr=uart.read().decode('utf-8')
print(rstr)
return (rstr)

sendATcommand ("AT+CDEVEUI?")
sendATcommand ("AT+CAPPKEY?")
sendATcommand ("AT+CAPPEUI?")
sendATcommand ("AT+CJOIN=1,0,8,1")
time.sleep(20.0)

rstr=sendATcommand ('AT+CSTATUS?')
print('++++')
print('Res='+rstr)
print('++++')
while '+CSTATUS:04' not in rstr:
print('Retry OTAA Continue')
sendATcommand ('AT+CJOIN=1,0,8,2')
time.sleep(20.0)
rstr=sendATcommand ('AT+CSTATUS?')
print('################Respond String')
print(rstr)
if '+CSTATUS:04' in rstr:
print('++++OTAA OK+++++')
break


if '+CSTATUS:04' in rstr:
print('++++OTAA OK+++++')

sendATcommand ('AT+DTRX=0,2,36,016701120268950373006406010107032ee0')
sendATcommand ('AT+DTRX=0,2,6,445566')

ต่อกับ Sensor BME280


import machine
import bme280
import time
import ubinascii
from machine import UART, Pin, SoftI2C
from cayennelpp import CayenneLPP


stop = False
motion = 0
led = Pin(2, Pin.OUT)
relay1 = Pin(12, Pin.OUT)
temp = 0
pa = 0
hum = 0
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=10000)
bme = bme280.BME280(i2c=i2c)
uart = UART(2, 9600, timeout=300)


def sendATcommand(ATcommand):
rstr = ""
print("Command: {0}\r\n".format(ATcommand))
uart.write("{0}\r\n".format(ATcommand))
rstr = uart.read().decode('utf-8')
print(rstr)
return (rstr)


mot = machine.Pin(15)
motion = (mot.value())

sendATcommand('AT+CADR=0')
sendATcommand('AT+CDATARATE=2')
sendATcommand('AT+CULDLMODE=1')

sendATcommand("AT+CDEVEUI?")
sendATcommand("AT+CAPPKEY?")
sendATcommand("AT+CAPPEUI?")
sendATcommand("AT+CJOIN=1,0,8,1")
time.sleep(20.0)
arstr = ''

arstr = sendATcommand('AT+CSTATUS?')

while '+CSTATUS:04' not in arstr:
print('Retry OTAA Continue')
sendATcommand('AT+CJOIN=1,0,8,2')
time.sleep(20.0)
arstr = ''
arstr = sendATcommand('AT+CSTATUS?')

if '+CSTATUS:04' in arstr:
print('++++OTAA OK+++++')
break

#if '+CSTATUS:04' in arstr:
# print('++++OTAA OK+++++')
# #Send Sample data
# sendATcommand('AT+DTRX=0,2,6,445566')


cnt = 1
while True:
print("----------Wait 10 Second---------")
time.sleep(10.0)
print("\r\n\r\nPacket No #{}".format(cnt))
temp, pa, hum = bme.values
print("*********************")
print("BME280/BMP280 values:")
print("*********************")
temp, pa, hum = bme.values
print('temp:', temp, ' Hum:', hum , 'PA:', pa)

c = CayenneLPP()
c.addTemperature(1, float(temp))
c.addBarometricPressure(2, float(pa))
c.addRelativeHumidity(3, float(hum))
c.addDigitalOutput(8, 1)
c.addAnalogOutput(9, 120.0)

b = (ubinascii.hexlify(c.getBuffer()))
led.value(1)
print('')
print('************ Sending Data Status **************')
sendATcommand('AT+DTRX=0,1,{0},{1}'.format(int(len(b)),(b.decode('utf-8'))))
print('********Finish Sending & Receiving Data Status******')
led.value(0)
cnt = cnt + 1

วิธีการ Flash Firmware

  1. ย้าย Jumper จาก LPRXD ไปที่ RXD0
  2. เสียบสาย USB เข้า PC

3. เรียกโปรแกรม Tremo Programmer เลือก Com Port และ Download Files
4. กด IO2 ค้างไว้ แล้ว กด RST 1 ครั้ง
5.กดปุ่ม Erase All แล้วตามด้วยกด Start หากเห็น Downloaded Files Successfully แสดงว่า Flash Firmware สำเร็จ
6.ย้าย Jumper จากกลับไปที่ LPRXD

การใช้งานต่อ USB to TTL Serial Port เข้ากับขา 3.3V GND และ TX,RX ใช้ความเร็ว 9600 bps 8N1 ในการเชื่อมต่อ

และให้ตั้งค่ากำลังส่ง TX Power (AT+CTXP) เป็นไปตามข้อกำหนดของแต่ละประเทศ เช่น ประเทศไทย อาจจะตั้งไว้ที่ 17 dBm หรือประมาณ 50mW กรณีที่ใช้สายอากาศที่ไม่มีเกณฑ์ขยาย หรือตั้งไว้ที่ 15 dBm กรณีที่ใช้สายอากาศที่มีเกณฑ์ขยาย 2 dฺBm ซึ่งจะจำกัดกำลังส่งออกอากาศให้ไม่เกิน 50mW (eirp) ค่า CTXP สามารถตั้งได้ตั้งแต่ 0–7 ตามตาราง

สามารถใช้ภาษา MicroPython เพื่อช่วยในการตั้งค่าได้ดังนี้ หลังจากการตั้งค่าแล้วสามารถ Save ไว้ใน ASR6601 เพื่อใช้ในคราวต่อไป โดยไม่ต้องเสียเวลามาตั้งอีก

from machine import UART
import time
from time import sleep
uart = UART(2, 9600,timeout=1000)

def sendATcommand(ATcommand):
print("Command: {0}\r\n".format(ATcommand))
uart.write("{0}\r\n".format(ATcommand))
rstr=uart.read().decode('utf-8')
print(rstr)
return (rstr)

#sendATcommand ("AT+CDEVEUI=1200000000000002")
#sendATcommand ('AT+CAPPKEY=20000000000000000000000000000001')
#sendATcommand ('AT+CAPPEUI=0000000000000000')
#sendATcommand ("AT+CTXP=1")
#sendATcommand ('AT+CSAVE')

sendATcommand ("AT+CDEVEUI?")
sendATcommand ("AT+CTXP?")
sendATcommand ("AT+CTXP=0?")
sendATcommand ("AT+CSAVE")
sendATcommand ("AT+CTXP?")

ตัวอย่าง ภาษา C ใช้กับ Arduino
https://github.com/Makerfabs/LoraWAN-Soil-Moisture/blob/main/example/328p_at/328p_at.ino

--

--

Somsak Lima
Somsak Lima

Written by Somsak Lima

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

No responses yet