Lora Modülünün Temelleri

Bir çok video ve uygulama yaptık ve yavaş yavaş geniş kitlelere ulaşma imkanımız oldu. Daha geniş kesimlere hitap etme adına Lora modülünün temelleri başlıklı bir yazı hazırladım. Burada lora modüllerinden E32 433T20D ve E32 433T30D gibi modellerin bağlantı şemasını, 4 ve üzeri lora modülleri ile nasıl bir ağ oluşturabileceğimiz, veri gönderirken adresleme nasıl yapılmalı bu konular üzerine duracağız.

1.1 Lora Modülü Bağlantı Şeması

E32- 433T20D bağlantı şeması

Bu şema çalışma durumundaki şemadır. Yani M1 ve M0 pinleri GND çekilmiştir. Burada dikkat edilmesi gereken 2 husus bulunmakta. Birincisi RX ve TX pinlerini neye göre arduino üzerinde 11. ve 10. pinlere bağladığımız gerçeği. Bunun sebebi siz kodu nasıl yazarsanız ona göre bağlantıyı yapmalısınız. Software serial kütüphanesini kullandığımız için arduino üzerindeki RX ve TX pinleri kullanmak zorunda değiliz. Kütüphanede biz nasıl tanımlarsak o pinleri kullanabiliyoruz. Yukarıdaki şemadaki arduino içindeki kod yapası şu şekilde başlamalıdır ki, arduino ve lora modülleri haberleşebilsin.

#include "LoRa_E32.h"
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); 

/*
 * Pinler     Arduino Nano    Lora E32 433T20d
 *                11                3
 *                10                4
 */
 
LoRa_E32 e32ttl(&mySerial);

Diğer dikkat edilmesi gereken konu ise neden gerilim bölücü koyduk. Sebep oldukça basit arduino TTL (transistor to transistor logic) seviyesi 0-5V mertebesinden ancak Lora modüllerinin ise 0-3.3V mertebesinde olmaktan kaynaklanıyor. Basit bir gerilim bölücü ile arduinodan gidecek verinin lora modülüne zarar vermemesi için gerilim seviyesini oranladık.

Şemada ufak bir not ekledim. Ancak tekrarlamakta fayda var. Bazı arkadaşlarımızda 5v da devrenin istedikleri gibi çalışmadığı ancak 3.3V de daha iyi çalıştığını bildirdiler. Sizde aynı sorunu yaşıyorsanız gerilim mertebesini değiştirebilirsiniz. Çalışma aralığı 2.7-5.5v arasında olduğu için 2 volt seviyesinde de lora modülü zarar görmeyecektir.

Lora modülünün temelleri

1.2 Lora modülünde Adresleme konusunda kafası karışan arkadaşlar için

Adresleme ve kanal konusunda arkadaşlar çok fazla soru alıyorum. Şimdi konuyu baştan alırsak 2 temel haberleşme çeşidi bulunmakta Lora modüllerinde. Fixed yanı sadece adresi bilinen noktaya veri transferi, birde genel olarak yayın yapıldığı Broadcast modu. Ben genelde veri güvenliği için Fixed modu tercih ediyorum.

fixed mod haberleşme

Bu görselde nelere dikkat etmeliyiz. Birinci kural veri göndereceğimiz noktanın adresini ve kanalı tam olarak bilmeliyiz. Diğer nokta ise fixed modda veriyi gönderen noktanın adresi ve kanalı önemli değildir. Yani fixed modda dilediğiniz adrese ve kanala veri gönderebilirsiniz.

broadcast mod

Broadcast modda ise genel bir yayın yapımı vardır. Araba radyosu mantığı eğer kanalı biliyorsanız o noktaya veri gönderebilirsiniz. burada adres söz konusu değildir sadece kanala veri gönderebilirsiniz. o kanaldaki bütün noktalar veriyi alır. Karşı tarafın adresinin bir önemi yoktur. MQTT yapısını bilen arkadaşlar için abone mantığına benzer.

Şimdi gelelim kafanızı karıştığı noktaya. Usb programlayıcı ile programla yaptığınızda adres decimal yani 10 luk tabanda belirlenmektedir. Ancak Arduino da kullandığımız kütüphanede ise adresleme 16 lık tabanda belirlenmektedir.

Garip bir örnek ile konuyu anlatmaya çalışayım. Misal USB programlayıcıda “5555” adresini atayalım.

şimdi adresi 5555 yaptık peki arduino da adresi nasıl yazacaz çünkü kütüphanede high ve low olarak adresi 2 ye ayırmış.

Bu lora modülünün adresini arduino üzerinde şu şekilde yazmalıyız.

ResponseStatus rs = e32ttl.sendFixedMessage(21, 179, 7, &data, sizeof(Signal));
  

şimdi kafaların iyice karıştığına eminim 🙂 “21” ve “179” nereden geldi diye. Burada kafa karışıklığına sebep veren şey, kütüphanenin kullanmış olduğu şu metod.

ResponseStatus sendFixedMessage(byte ADDL, byte ADDH, byte CHAN, const void *message, const uint8_t size);

ResponseStatus sendBroadcastFixedMessage(byte CHAN, const void *message, const uint8_t size );

Şimdi burada kütüphane ile RF setting programı arasında bir sayısal dönüşüm yapmamız gerekiyor. Biz RF setting adresi 5555 yapınca görsel de kırmızı oklarla gösterdiğim gibi 5555 adresini 16 tabanda 2 ye ayırdı hıgh = 15, low=b3. Kullandığımız kütüphane ise 16 taban yerine 10 luk tabana çevirmemizi istiyor. Yani 16 lık tabanda 15, onluk tabanda 21’i, b3 ise 179’u temsil eder. Sanırım konu anlaşılır oldu.

başka bir örnek yapalım sizde misal şu adresleri Rf setting programı ile deneyin bakalım ne olacak 65535, 65536, 65537

adresi 65534 yapıyorum.

[*] Bu adres ve kanal değerini neden seçtiğimi düşünmenizi istiyorum

Sonuç olarak bu adres ve kanal değerinin arduino tarafındaki kod yapısı şu şekilde olmalıdır.

ResponseStatus rs = e32ttl.sendFixedMessage(255, 254, 31, &data, sizeof(Signal));

Sanırım adresleme konusu tam olarak oturdu.

Son bir hatırlatma yine yapayım USB programlayıcı ile parametre ayarlarını girerken USB stick üzerindeki jumper ları çıkartmanız lazım. Sadece 5v beslemeyi gösteren jumper kalmalıdır. RX ve TX pinleri de kısa devre olarak geldiği için o jumper i de unutmayınız. Örnek Görsel:

Usb programlayıcı sleep mode

1.3 Lora ile ağ yapısı oluşturma ve Ağa bir çok lora modülünü dahil etmek

Bazı arkadaşlardan şu soruyu alıyorum.

Kaç tane lora modülünü bir merkeze bağlayabiliriz?

Sanırım bu adresleme örneklerimiz bu soruya direk cevap olmuştur. Dikkat edilmesi gereken durum Lora modüllerinde internet wifi ağına bağlanmak gibi bağlılık söz konusu değil siz hangi adrese veri gönderirseniz o adrese veri gidecektir. Dolayısıyla kaç tane adrese gidebileceğini yukarıdaki örnekte de göstermiş olduk. Yani kaç tane lora modülünü bağlayabilir biraz da sizin becerinize kalmış oluyor. Ama bu şekilde yüzlerce binlerce lora modülünü ağınıza dahil edebilirsiniz.

Ben genelde tarama usulu kullanarak ağımdaki diğer Lora modülleri ile haberleşiyorum. Şöyle ki, bütün adreslerin kayıt ettiğim bir merkez var. Bunu bir array ile tanımlıyorum. Sonrasında bir for döngüsü ile sırayla bütün adreslere sırayla veriyi yolluyorum. Yaklaşık 3-5sn bekleme atyorum. Cevap gelirse gelen cevabı kayıt ediyorum. Cevap gelmez ise Timeout yapıp diğer modüle geçiyorum.

Kod yapısı şöyle:

//Ağdaki diğer lora modüllerinin adresleri,

const byte Frekanslar[SensorSays] = {1, 2, 3, 4, 5, 6, 7};

void loop() {

  for (MevcutMakina = 0; MevcutMakina < SensorSays ; MevcutMakina++) {
    int deger1 = MevcutMakina + 1;
    String text1 = ". Sensörün değerleri alınıyor...";
    String sum1 =  deger1 + text1;
    Serial.println(sum1);
    Durt(MevcutMakina);
}

Bu kod sayesinde mevcut sensor sayısı (yani ağımdaki Lora sayısı) kadar bir for döngüsü sürekli kendini yenileyip. Durt metodu ile bir tane adrese mesaj gönderip gelen cevabı işleyecek. Durt metodu da şu şekilde:

 void Durt(byte i) {
    ResponseStatus rs = e32ttl.sendFixedMessage(0, Frekanslar[i], 4, &kalibre, sizeof(Kalibre));
    Serial.println(rs.getResponseDescription());
    mesajgeldi = true;
    sure = millis();

    while (mesajgeldi) {

      if (millis() > sure + bekleme) {
        sure = millis();
        int deger1 = i + 1;
        String text1 = ". Sensor için Süre Doldu";
        String sum1 =  deger1 + text1;
        Serial.println(sum1);
        mesajgeldi = false;

      } else {

        while (e32ttl.available()  > 1) {
          ResponseStructContainer rsc = e32ttl.receiveMessage(sizeof(Kalibre));
.... 
//şeklinde mesaj gelirse onu artık nasıl işleyeceğiniz size kalmış

Evet arkadaşlar benim Lora modülünün temelleri yazımda anlatacaklarım bu kadar yine aklınıza takılan bir şey olursa sitemizdeki Soru&Cevap kısmından bize ulaşabilirsiniz. Bir sonraki videonun konusunu belirlemekte yardımcıda olmuş olursunuz.

N11 üzerinden alış veriş yapmak ve yeni ürünlerimizi görmek için dükkanımızı ziyaret etmeyi unutmayın. Olumlu yorumlarınızı bekliyorum.

Saygılarımla

Lora Modülünün Temelleri” ile ilgili 4 görüş

  1. Kemal

    Merhabalar,
    RF setting v3.50 uygulamasında LoRa’mın bulundugu portu sectıkten sonra open port’a tıklayınca var olmayan bır aygıt belirtildi hatası alıyorum.
    Bu konuda yardımcı olabılır mısınız acaba?

    Yanıtla
  2. Sezgin Korkmaz

    merhaba; yukarıda paylaştıgınız koda gore iki adet lorayı tarıyorum.her hangi bir sorun yok . Ancak arduino bir sure sonra donuyor bu yuzden watcdog timer kullanmak zorunda kalıyorum. sizde de donma sorunu oldumu .donma sorunu ne olabilir teşekkurler . aşagıya kodun ozetini paylaşıyorum.

    #include “Arduino.h”
    #include “LoRa_E32.h”
    #include
    #include
    SoftwareSerial mySerial(52, 51); // using Arduino Nano
    LoRa_E32 e32ttl(&mySerial);
    void printParameters(struct Configuration configuration);
    void printModuleInformation(struct ModuleInformation moduleInformation);

    void setup()
    {
    wdt_enable(WDTO_8S);
    Serial.begin(9600);
    delay(50);
    Serial1.begin(9600);
    delay(50);
    e32ttl.begin();
    delay(50);

    Serial.println(“start!!!!!!!!!!!!”);

    }

    struct Message {
    char message[8];
    byte temperature[4];
    } ;
    struct MessageHumidity {
    char message[8];
    byte humidity;
    } ;
    byte Sensor = 0;
    int delayy = 3500;

    int times;
    boolean message_coming;
    boolean trig = 0;
    const byte Address[2] = {1, 3};

    void loop() {

    // delay(100);

    for (Sensor = 0; Sensor times + delayy) {

    times = millis();

    message_coming = false;

    }
    else
    {

    if (e32ttl.available() > 1) {

    char type[5];
    ResponseContainer rs = e32ttl.receiveInitialMessage(sizeof(type));
    String typeStr = rs.data;

    }
    }
    }
    }

    Yanıtla
  3. Mehmet Yazının yazarı

    Seçkin hocam soruyu sorucevap sayfamıza yazar mısınız? ilk gördüğüm kodda bir kaç hata var zaten arduino ide derleme hatası verecektir.
    birde şu kodu gördümnano mu kullanıyorsunuz Mega mı?
    SoftwareSerial mySerial(52, 51); // using Arduino Nano

    Yanıtla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir