nRF24L01+ (nRF) alıcı olarak çalıştığı zaman kendisine ulaşan bir paketin gerçekten kendisine ait olup olmadığına paketteki tanımlanmış olan adrese bakarak karar verir. Eğer adres kendisine aitse paketi alır, kendisine ait değilse paketi yok sayar. Bu yüzden sağlıklı bir nRF haberleşmesi için aşağıdaki şekilde olduğu gibi hem vericiye hem de alıcıya aynı değere sahip bir adres tanımlamak gerekir.
Adres en az 3 en fazla 5 byte uzunluğunda olabilir. 5 byte tanımlama tekniği yaygın şekilde kullanılmaktadır. 5 byte’lık dizinin aşağıdaki kod parçasında olduğu gibi farklı tanımlama şekilleri vardır:
byte adres[] = “limon”; // Yazı şekline
byte adres[] = {108, 105, 109, 111, 110}; // Onlu sayı sistemi
byte adres[] = {0x6C, 0x69, 0x6D, 0x6F, 0x6E}; // Onaltılı sayı sistemi
Adres tanımlaması için her ne kadar herhangi bir 5 byte uzunluğundaki dizi kullanılabilse de, nRF’in veri sayfasında (datasheet) iki farklı adres kullanımından uzak durulması tavsiye edilmektedir. Bu iki tür adresi ve bahsi geçen problemi anlayabilmek için adres değerlerini ikili (binary) sistem üzerinden değerlendirmek gerekir. 5 byte 40 adet bit içerir (5×8=40). Bu 40 adet bit aşağıdaki durumlardan herhangi birisine karşılık geliyorsa kullanılmaması tavsiye edilmektedir.
1. Lojik seviye değişiminin sadece bir defa olduğu adresler
Örnek:
0000000000000000000000011111111111111111
veya
1111111111000000000000000000000000000000
Bu tür adreslerin gürültüye karşı olumsuz anlamda daha duyarlı olduğu belirtilmektedir. Bu yüzden kaçınılmalıdır.
2. Lojik seviye değişiminin 1 ve 0 (veya 0 ve 1) arasında sürekli anahtarlama (toggle) yapıyor olması
Örnek:
1010101010101010101010101010101010101010
(Bu ikili dizinin onaltılık sayı sistemi karşılığı {0xAA, 0xAA, 0xAA, 0xAA, 0xAA} şeklinde olur.)
veya
0101010101010101010101010101010101010101
(Bu ikili dizinin yazı (text) sistemi karşılığı “UUUUU” şeklinde olur.)
Bu tür adreslerin senkronizasyon başlangıç verisinin (preamble’ın) devamı olarak algılanması da hata olasılığını artırmaktadır. Bu desenlere sahip adres değerleri alıcı tarafında bir algılama zorluğuna yol açarak hatalı paket olasılığını artırmaktadır.
Söz konusu istenmeyen adres tanımlamalarının sebep olduğu olumsuz sonucu test edebilmek amacıyla aşağıdaki videoda ayrıntıları tarif edilen deney yapılmıştır. Deney sonunda “limon” ve “kavun” olarak tanımlanan gelişigüzel adresler yaklaşık 2190 paket/saniye hızında veri transferi gerçekleştirilebilirken, yukarıda tanımlanması yapıldığı gibi {0xAA, 0xAA, 0xAA, 0xAA, 0xAA} ve “UUUUU” mahzurlu adresler kullanıldığında veri aktarım hızının yaklaşık 200 paket/saniyeye düştüğü görülmüştür.
Verici kodları
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
byte adres[] = "limon"; // 01101100 01101001 01101101 01101111 01101110
//byte adres[] = "UUUUU"; // 01010101 01010101 01010101 01010101 01010101
//byte adres[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA}; // 10101010 10101010 10101010 10101010 10101010
//byte adres[] = "kavun"; // 01101011 01100001 01110110 01110101 01101110
RF24 kablosuz(9, 10);
byte data[32];
void setup()
{
kablosuz.begin();
kablosuz.setAutoAck(false);
kablosuz.setDataRate(RF24_2MBPS);
kablosuz.openWritingPipe(adres);
randomSeed(analogRead(0));
for(int s=0; s<32; s++) data[s] = (byte) random(256);
}
void loop()
{
kablosuz.write(data, sizeof(data));
}
Alıcı kodları
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
RF24 kablosuz(9, 10);
byte adres[] = "limon"; // 01101100 01101001 01101101 01101111 01101110
//byte adres[] = "UUUUU"; // 01010101 01010101 01010101 01010101 01010101
//byte adres[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA}; // 10101010 10101010 10101010 10101010 10101010
//byte adres[] = "kavun"; // 01101011 01100001 01110110 01110101 01101110
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, adres);
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();
}
}
Belirlenen adreslerin aktarım hızı açısından gerçek verimini görebilmek için belki de en iyi yöntem yukarıdaki gibi alıcı-verici kodları ile veri hızı testi yapmaktır.