Veri İletim Hızı

Sayısal elektronikte veriler temel olarak sadece 0 veya 1 değerlerini alabilen bitler ile ifade edilir. Veri haberleşmesi hızı ise bu bitlerin birim zamanda gönderim veya alım sayısı olarak ifade edilir. Bu tanıma göre, 1 saniye içerisinde 50 adet bitin alıcıdan vericiye gönderilebildiği bir sistemin hızının 50 bps (bit/s) olduğu söylenebilir. Bu sisteme göre gönderim hızı 1000 kat daha fazla bir sistem dikkate alınırsa 50 kbps (kbit/s) hıza ulaşılmış olur. Saniyede 2.000.000 bit transfer edebilen bir sistemin ise 2 Mbps (Mbit/s) hızında olduğu söylenebilir. Bu ölçüler dikkate alındığında aşağıdaki gibi bir tablo oluşturulabilir.

nRF24L01+’nın Haberleşebildiği Üç Farklı Hız

nRF24L01+’nın sahip olduğu üç farklı kablosuz veri transfer hızı vardır. Bunlar 250kbps, 1 Mbps ve 2 Mbps’tır. Bu farklı hızların kullanımı yazılımsal olarak kolayca belirlenebilir. nRF24L01+ için en yüksek seçenek olan 2 Mbps hızı her zaman avantaj olarak değerlendirilemez. Yani hızlı olan her zaman iyidir düşüncesi yanlış olacaktır. Zira 250 kbps hızının da kendisinden daha yüksek hızlara göre avantajlara sahip olduğu durumlar vardır. Mesela, düşük veri hızları ile çalışıldığında daha iyi alıcı hassasiyeti elde etmek mümkündür. Ayrıca daha düşük hızlarda daha küçük bant genişliği kullanılacağı için daha fazla kanal kullanmak mümkündür. Bununla birlikte, yüksek hızlarda ortalama veri hızı aktarımı düşünüldüğünde daha verimli enerji kullanımına sahiptir. Bu durumda hangi koşullar için hangi hızın kullanılacağına uygulama ihtiyaçlarına bakılarak karar verilmesi gerektiği sonucuna varılabilir.

Hızı Düşüren Faktörler

Öncelikle belirtmek gerekir ki, nRF24L01’in sahip olduğu üç farklı hız, modüle edilmiş ve boşluğa elektromanyetik dalga şeklinde sunulmuş veri aktarımının hızıdır. nRF24L01’in veri sayfasında bu durum aşağıdaki gibi ifade edilir.

Peki bu durum uygulamalardaki veri aktarım hızına nasıl yansır. Bu sorunun cevabını verebilmek için hangi unsurların modüle edilme işleminden önce veri aktarım hızına etki edebileceğine dikkat etmemiz gerekir.

  • Mikrokontrolcü içindeki veri paketi gönderme komutları arasındaki gerçekleştirilen işlemler doğrudan veri aktarım hızını etkileyecektir. Paket gönderim komutları arasındaki gecikmeler uzun veri aktarımlarındaki hızı etkileyecektir.
  • nRF24L01 entegresi içerisindeki modülasyondan önce ve demodülasyondan sonra gerçekleşen her tür zorunlu süreç veri aktarım hızını etkileyecektir. Mesela alıcı tarafındaki demodülasyon işleminden sonra CRC yardımı ile hatalı geldiği tespit edilen paket doğrudan yok sayılacaktır. Bu durumda paketin yeniden gönderilmesi gerekir.
  • Ayrıca aşağıdaki şekilde gösterildiği üzere nRF24L01’in sahip olduğu veri paketinin 32 baytlık kısmı yararlı yüktür (payload)

Başlama Öneki (Preamble): Haberleşmede, bir haberleşme dizgesinin başlangıcını alıcıya haber veren iletişim sinyalidir. İletişimin başlamasını işaret eder. İletişimin başlangıcında kullanılan bir sıralı sinyal dizisidir. İletim zamanlamasını senkronize etmek için kullanılan bir sinyaldir. Anlamlı veya anlamsız olabilir ancak verici ve alıcı cihazın ortak kullandığı bir ifade olması zorunludur. Alıcı haberleşmenin başladığını preamble ile anlar ve gelen veri dizgesini ona göre yorumlar. nRF24L01 için preamble 10101010 veya 01010101 olabilir. 1 byte uzunluğundadır.

Adres (Address): Alıcı ve vericinin adres olarak kullandığı maksimum beş baytlık değere sahip bir veri bloğudur. Alıcı ve verici aynı adres değerini kullanmalıdır.

Paket Kontrol Alanı (Packet Control Field): Paket kontrol alanı faydalı yükün veri olarak uzunluğunu, gelen verinin yenilenen bir gönderim olup olmadığını ve alındı damgasının istenip istenmediğinin bilgisini taşıyan bölgedir.

Faydalı Yük (Payload): Esas verinin aktarıldığı alandır. En fazla 32 byte uzunluğunda olabilir. Daha kısa payloadlar da seçilebilir.

Döngüsel Fazlalık Denetimi (Cyclic Redundancy Check: CRC): Gelen verinin doğruluğunu kontrol etmek için kullanılan maksimum 2 byte değerinde bir veri alanıdır. CRC kodu doğrulanamazsa veri yok sayılır.

Böylece göndermek istediğimiz verinin sadece payload kısmında iletildiğini anlıyoruz. Bu da haberleşmenin 250 kbps, 1 Mbps veya 2 Mbps gibi modüle edilmiş sinyal seviyesinde gerçekleşse bile hızın daha düşük olacağını göstermektedir. Ancak pek çok uygulama için 250 kbps hızının bile çok yeterli bir değer olduğu unutulmamalıdır.

Veri Hızı Ölçüm Uygulaması

Bu makale için nRF24L01+ ve Arduino Nano’nun kullanıldığı bir veri ölçüm uygulaması geliştirilmiştir. Bu amaçla iki basit devre kurulmuştur. Bu devrelerden ilki aşağıdaki verici devredir.

Bu devre nRF24L01 ile Basit Kablosuz Haberleşme yazımızda yer verdiğimiz devredir. Bağlantıları şemada görüldüğü gibidir. İkinci devremiz 2×16’lık bir LCD ekrana sahip alıcı devredir. Söz konusu LCD ekran I2C protokolü ile Nano’ya bağlanmaktadır. Bağlantı usulü aşağıdaki devre şemasında verilmiştir.

Aynı devre Arkış Mühendisliğin geliştirdiği geliştirme kiti ile daha basit bir şekilde aşağıdaki gibi kurulabilir.

Söz konusu devrede LCD ekranın VCC ve GND uçları Arduino Nano’nun sırasıyla 5V ve GND bacaklarına bağlanmıştır. LCD ekran I2C protokolünü kullandığı için SDA ucu Nano’nun A4 pinine ve SCL ucu A5 pinine bağlanmıştır.

Yazılım

Yukarıdaki verici ve alıcı sistem için birbiri ile uyumlu iki farklı yazılım gerçekleştirilmiştir. Verici programın kodları şu şekildedir:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

const byte kanal[] =  "Arkis";

RF24 kablosuz(9, 10);
byte data[32];

void setup()
{
  kablosuz.begin();
  kablosuz.setAutoAck(false);
  kablosuz.setDataRate(RF24_2MBPS);
  kablosuz.openWritingPipe(kanal);
  randomSeed(analogRead(0));
  
  for(int s=0; s<32; s++) data[s] = (byte) random(256);  
}

void loop()
{
  kablosuz.write(data, sizeof(data));  
}

Program son derece basit bir mantık içerisinde data[] byte dizisi içerisine yerleştirilen 32 byte’lık rasgele veriyi sürekli olarak alıcıya göndermektedir. Program ile alakalı vurgulanması gereken önemli iki husus vardır. Bunlardan ilki herhangi bir beklemeye sebebiyet vermemesi için nRF24L01’in otomatik doğrulama sistemini devre dışı bırakmak için setAutoAck(false) komutu kullanılmıştır. İkinci olarak rasgele veri yerleşimi loop() döngüsünü yavaşlatmamak için sadece bir defa setup() fonksiyonu içerisinde gerçekleştirilmiştir. Bu işlemde 32 adet rasgele byte değeri data[] dizisi içerisine yerleştirilmektedir.

Alıcı programı kısmen daha karmaşıktır. Bunun iki sebebi vardır. Birincisi Alıcı tarafından sonuçları göstermek için bir LCD kullanılmasıdır. İkincisi ise gelen verilerin miktarını ve geçen süreyi dikkate alarak bir hesaplama yapılmasıdır. Alıcı program aşağıda verilmiştir.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 kablosuz(9, 10);

const byte kanal[] =  "Arkis";
long paket_sayisi = 0;
unsigned long toplam_paket_sayisi = 0;
unsigned long baslangic_zamani;
unsigned long test_baslangic_t = millis();
unsigned long test_gecen_t = 0;
unsigned long hiz = 0;
String str_hiz, str_toplam;
byte data[32];

void setup()
{
  kablosuz.begin();
  kablosuz.setAutoAck(false);
  kablosuz.setDataRate(RF24_2MBPS);
  kablosuz.openReadingPipe(1, kanal);
  kablosuz.startListening();

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("HIZ:");
  lcd.setCursor(0, 1);
  lcd.print("TPL:");
}

void loop()
{
  if (kablosuz.available())
  {
    kablosuz.read(data, sizeof(data));
    paket_sayisi++;
  }
  test_gecen_t = millis() - test_baslangic_t;
  if (test_gecen_t > 1000)
  {
    lcd.setCursor(4, 0);
    str_hiz = String(paket_sayisi) + " pk/sn     ";
    lcd.print(str_hiz);

    toplam_paket_sayisi += paket_sayisi;
    lcd.setCursor(4, 1);
    str_toplam = String((toplam_paket_sayisi*32)/1024) + " Kbyte      ";
    lcd.print(str_toplam);

    paket_sayisi = 0;
    test_baslangic_t = millis();
  }
}

loop() döngü fonksiyonumuz içerisinde her bir saniye süresince alıcıya sağlıklı bir şekilde ulaşan paketler sayılarak LCD ekranın ilk satırında saniye başına düşen paket sayısı olarak hızı temsil etmek üzere yazılmaktadır. Alıcıya ulaşan paketlerin uzunluğu 32 byte faydalı yükten oluştuğu için toplam gelen paket sayısını 32 ile çarpıp 1024’e bölerek o vakte kadar alıcıya ulaşan toplam veriyi veri LCD ekranın ikinci satırında gösterilmektedir.

Saha Testi

Saha testi olarak alıcı modül vericiden kontrollü bir şekilde uzaklaştırmak suretiyle sonuçlar değerlendirilmiştir. Böylece hem hız testinin bir saha testi yapılmış hem de klasik bir nRF24L01 modül çiftinin açık alanda uygun kutuplama ile ne kadarlık bir mesafeye kadar haberleşmeyi sağlayabildiği gözlenmiş oldu.