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:

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(" ");
           }
         }
       
       }

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.

Gambar 7. Downlink yang dapat dipantau pada serial monitor ArduinoIDE


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 support@antares.id