Pendahuluan
Dokumentasi ini akan menjelaskan kepada anda bagaimana Modul LoRa STM32 dapat terhubung dengan platform Antares. Pada tutorial ini modul atau papan pengembang yang digunakan adalah seri STM32 LoRa Discovery Kit B-L072-LRWAN1, dan IDE yang digunakan adalah Arduino IDE. Untuk penggunaan modul lainnya anda dapat menyesuaikan dengan langkah yang ada pada tutorial ini, bagi anda yang menggunakan STM32CUbe IDE dapat mengikuti tutorial berikut.
Hardware
Untuk mengikuti tutorial pada halaman ini berikut adalah beberapa perangkat yang kita butuhkan:
- Board STM32L072 LoRa Discovery Kit Papan yang digunakan pada tutorial ini adalah STM32 LoRa Discovery Kit B-L072-LRWAN1.
- Kabel Micro USB to USB Untuk menghubungkan papan anda dengan PC anda.
Software
Berikut adalah beberapa software yang dibutuhkan untuk menjalankan contoh-contoh pada dokumentasi ini:
- Arduino IDE Software utama yang akan digunakan untuk memprogram papan STM32.
- Arduino STM32 Arduino IDE tidak mendukung board-board STM32 secara bawaannya, maka dari itu perlu dilakukan instalasi Arduino STM32 melalui Board Manager Arduino IDE. Untuk menambahkan board STM32 anda dapat mengikuti penjelasannya pada tutorial dibawah.
- Library Antares LoRaWAN Instalasi library Antares LoRaWAN dapat dilakukan melalui Library Manager Arduino IDE. Silahkan ikuti Tutorial Instalasi Library Antares.
Download Arduino IDE
Download Arduino STM32
Download Library Antares LoRaWAN AS923
Proses Instalasi dan Konfigurasi Awal
Segmen berikut akan menjelaskan bagaimana langkah-langkah awal instalasi dan konfigurasi untuk anda dapat memulai memrogram papan STM32 anda.Gambar 1. Pilih File->Preferences
Gambar 2. Menambahkan URL board tambahan
Buka Arduino IDE, pilih Files -> Preferences kemudian masukkan URL berikut ke dalam kotak Additional Board Manager URLs kemudian klik OK.
https://raw.githubusercontent.com/stm32duino/BoardManagerFiles/master/STM32/package_stm_index.json
CATATAN: Anda dapat menambahkan beberapa URL dengan menambahkan koma untuk memisahkannya jika diperlukan.
Gambar 3. Pilih Alat->Papan->Boards Manager
Gambar 4. Proses Instalasi board STM32 pada Arduino IDE
Setelah menambahkan URL, langkah selanjutnya adalah instalasi board kita kedalam Arduino IDE. Pilih Alat->Papan->Boards Manager, kemudian anda dapat memasukkan kata kunci "stm32" pada kotak pencarian untuk memudahkan anda. Jika sudah menemukan STM32 Cores by STMicroelectronics, anda dapat memilih versi paling terbaru dan kemudian klik Install.
Gambar 5. Pilih Alat->Papan->STM32 Boards->Discovery.
Sesuai dengan board yang digunakan pada tutorial kali ini, maka anda dapat memilih Discovery.
Gambar 6. Memilih Seri papan pada Tools->Board part number->Discovery L072CZ-LRWAN1
Setelah itu anda diharuskan memilih seri Discovery yang anda gunakan, pada tutorial kali ini kita menggunakan seri Discovery L072CZ-LRWAN1. Setelah itu anda dapat memilih Port sesuai dengan yang anda gunakan. Sekarang papan anda sudah siap digunakan dan di program menggunakan Arduino IDE.
Contoh Kode Program
Setelah mengikuti langkah-langkah diatas, kini anda telah dapat memprogram papan STM32 anda menggunakan Arduino IDE. Berikut adalah beberapa contoh kode program yang dapat anda gunakan untuk menghungungkan papan STM32 anda dengan Antares melalui jaringan LoRa Telkom Indonesia. Sebelumnya anda perlu melakukan registrasi perangkat LoRa anda terlebih dahulu pada Antares, tutorial dapat anda pelajari pada link berikut.
Contoh kode program Kelas A (Uplink)
Kelas A digunakan bagi anda yang tidak memerlukan monitoring tidak realtime dan hemat daya. Proses aktivasi dilakukan dengan cara ABP yang dapat anda pelajari pada tutorial Registrasi Perangkat LoRa.
/**
Example of ABP device
Authors:
Ivan Moreno
Eduardo Contreras
June 2019
This code is beerware; if you see me (or any other collaborator
member) at the local, and you've found our code helpful,
please buy us a round!
Distributed as-is; no warranty is given.
*/
#include
//ABP Credentials
const char *devAddr = "6bd6f664";
const char *nwkSKey = "61be3b3d62c0db200000000000000000";
const char *appSKey = "000000000000000066f9c0f3ff1cf05b";
const unsigned long interval = 10000; // 10 s interval to send message
unsigned long previousMillis = 0; // will store last time message sent
unsigned int counter = 0; // message counter
char myStr[50];
byte outStr[255];
byte recvStatus = 0;
int port, channel, freq;
bool newmessage = false;
const sRFM_pins RFM_pins = {
.CS = PA15,
.RST = PC0,
.DIO0 = PB4,
.DIO1 = PB1,
};
void setup() {
SPI.setMOSI(PA7);
SPI.setMISO(PA6);
SPI.setSCLK(PB3);
SPI.begin();
// Setup loraid access
Serial.begin(115200);
delay(2000);
if (!lora.init()) {
Serial.println("RFM95 not detected");
delay(5000);
return;
}
// Set LoRaWAN Class change CLASS_A or CLASS_C
lora.setDeviceClass(CLASS_A);
// Set Data Rate
lora.setDataRate(SF10BW125);
// Set FramePort Tx
lora.setFramePortTx(5);
// set channel to random
lora.setChannel(MULTI);
// Put ABP Key and DevAddress here
lora.setNwkSKey(nwkSKey);
lora.setAppSKey(appSKey);
lora.setDevAddr(devAddr);
}
void loop() {
// Check interval overflow
if (millis() - previousMillis > interval) {
previousMillis = millis();
byte myByte[] = {0x22, 0x33, 0xFF, 0xDA, 0xDD};
Serial.print("Sending: ");
for (int i = 0; i < sizeof(myByte); i++)
{
Serial.print(myByte[i]); Serial.print(" ");
}
Serial.println();
lora.sendUplinkHex(myByte, sizeof(myByte), 0);
port = lora.getFramePortTx();
channel = lora.getChannel();
freq = lora.getChannelFreq(channel);
Serial.print(F("fport: ")); Serial.print(port); Serial.print(" ");
Serial.print(F("Ch: ")); Serial.print(channel); Serial.print(" ");
Serial.print(F("Freq: ")); Serial.print(freq); Serial.println(" ");
}
// Check Lora RX
lora.update();
recvStatus = lora.readDataByte(outStr);
if (recvStatus) {
newmessage = true;
int counter = 0;
port = lora.getFramePortRx();
channel = lora.getChannelRx();
freq = lora.getChannelRxFreq(channel);
for (int i = 0; i < recvStatus; i++)
{
if (((outStr[i] >= 32) && (outStr[i] <= 126)) || (outStr[i] == 10) || (outStr[i] == 13))
counter++;
}
if (port != 0)
{
if (counter == recvStatus)
{
Serial.print(F("Received String : "));
for (int i = 0; i < recvStatus; i++)
{
Serial.print(char(outStr[i]));
}
}
else
{
Serial.print(F("Received Hex : "));
for (int i = 0; i < recvStatus; i++)
{
Serial.print(outStr[i], HEX); Serial.print(" ");
}
}
Serial.println();
Serial.print(F("fport: ")); Serial.print(port); Serial.print(" ");
Serial.print(F("Ch: ")); Serial.print(channel); Serial.print(" ");
Serial.print(F("Freq: ")); Serial.println(freq); Serial.println(" ");
}
else
{
Serial.print(F("Received Mac Cmd : "));
for (int i = 0; i < recvStatus; i++)
{
Serial.print(outStr[i], HEX); Serial.print(" ");
}
Serial.println();
Serial.print(F("fport: ")); Serial.print(port); Serial.print(" ");
Serial.print(F("Ch: ")); Serial.print(channel); Serial.print(" ");
Serial.print(F("Freq: ")); Serial.println(freq); Serial.println(" ");
}
}
}
Contoh kode program Kelas C (Uplink)
Kelas C digunakan bagi anda yang membutuhkan monitoring secara realtime dan memiliki konsumsi daya paling boros. Proses aktivasi dilakukan dengan cara ABP yang dapat anda pelajari pada tutorial Registrasi Perangkat LoRa.
/**
Example of ABP device
Authors:
Ivan Moreno
Eduardo Contreras
June 2019
This code is beerware; if you see me (or any other collaborator
member) at the local, and you've found our code helpful,
please buy us a round!
Distributed as-is; no warranty is given.
*/
#include
//ABP Credentials
const char *devAddr = "ae5cc78b";
const char *nwkSKey = "e7e349fc2216941a0000000000000000";
const char *appSKey = "00000000000000009d0cf82c25277bdd";
const unsigned long interval = 10000; // 10 s interval to send message
unsigned long previousMillis = 0; // will store last time message sent
unsigned int counter = 0; // message counter
char myStr[50];
byte outStr[255];
byte recvStatus = 0;
int port, channel, freq;
bool newmessage = false;
const sRFM_pins RFM_pins = {
.CS = PA15,
.RST = PC0,
.DIO0 = PB4,
.DIO1 = PB1,
};
void setup() {
SPI.setMOSI(PA7);
SPI.setMISO(PA6);
SPI.setSCLK(PB3);
SPI.begin();
// Setup loraid access
Serial.begin(115200);
delay(2000);
if (!lora.init()) {
Serial.println("RFM95 not detected");
delay(5000);
return;
}
// Set LoRaWAN Class change CLASS_A or CLASS_C
lora.setDeviceClass(CLASS_C);
// Set Data Rate
lora.setDataRate(SF10BW125);
// Set FramePort Tx
lora.setFramePortTx(5);
// set channel to random
lora.setChannel(MULTI);
// Put ABP Key and DevAddress here
lora.setNwkSKey(nwkSKey);
lora.setAppSKey(appSKey);
lora.setDevAddr(devAddr);
}
void loop() {
// Check interval overflow
if (millis() - previousMillis > interval) {
previousMillis = millis();
byte myByte[] = {0x22, 0x33, 0xFF, 0xDA, 0xDD};
Serial.print("Sending: ");
for (int i = 0; i < sizeof(myByte); i++)
{
Serial.print(myByte[i]); Serial.print(" ");
}
Serial.println();
lora.sendUplinkHex(myByte, sizeof(myByte), 0);
port = lora.getFramePortTx();
channel = lora.getChannel();
freq = lora.getChannelFreq(channel);
Serial.print(F("fport: ")); Serial.print(port); Serial.print(" ");
Serial.print(F("Ch: ")); Serial.print(channel); Serial.print(" ");
Serial.print(F("Freq: ")); Serial.print(freq); Serial.println(" ");
}
// Check Lora RX
lora.update();
recvStatus = lora.readDataByte(outStr);
if (recvStatus) {
newmessage = true;
int counter = 0;
port = lora.getFramePortRx();
channel = lora.getChannelRx();
freq = lora.getChannelRxFreq(channel);
for (int i = 0; i < recvStatus; i++)
{
if (((outStr[i] >= 32) && (outStr[i] <= 126)) || (outStr[i] == 10) || (outStr[i] == 13))
counter++;
}
if (port != 0)
{
if (counter == recvStatus)
{
Serial.print(F("Received String : "));
for (int i = 0; i < recvStatus; i++)
{
Serial.print(char(outStr[i]));
}
}
else
{
Serial.print(F("Received Hex : "));
for (int i = 0; i < recvStatus; i++)
{
Serial.print(outStr[i], HEX); Serial.print(" ");
}
}
Serial.println();
Serial.print(F("fport: ")); Serial.print(port); Serial.print(" ");
Serial.print(F("Ch: ")); Serial.print(channel); Serial.print(" ");
Serial.print(F("Freq: ")); Serial.println(freq); Serial.println(" ");
}
else
{
Serial.print(F("Received Mac Cmd : "));
for (int i = 0; i < recvStatus; i++)
{
Serial.print(outStr[i], HEX); Serial.print(" ");
}
Serial.println();
Serial.print(F("fport: ")); Serial.print(port); Serial.print(" ");
Serial.print(F("Ch: ")); Serial.print(channel); Serial.print(" ");
Serial.print(F("Freq: ")); Serial.println(freq); Serial.println(" ");
}
}
}
Tutorial Downlink
Untuk dapat melakukan downlink pada End-Devices, anda dapat menggunakan salah satu perangkat lunak bernama Postman yang dapat anda pelajari pada tutorial berikut. Lalu anda dapat memantaunya pada serial monitor pada arduino IDE.
Tutorial Video
Dibawah ini berikut kami menyertakan sebuah video tutorial untuk memudahkan anda lebih memahami penjelasan kami di atas. Jika membutuhkan informasi lebih lanjut, jangan ragu hubungi kami melalui [email protected]