nRF24L01 ile Basit Kablosuz Haberleşme
Bu makalede nRF24L01 haberleşme modülü ile en basit şekilde kablosuz veri haberleşmesinin nasıl gerçekleştirilebileceği anlatılmaktadır. nRF24L01’in ayarlarının yapılabilmesi ve veri alışverişi gerçekleştirebilmesi için bir mikrokontrolcüye ihtiyaç duyulur. Bu makalede anlatılan yöntemde Arduino Nano mikrokontrolcü kullanılmıştır.
nRF24L01 Nedir?
Aslında nRF24L01 aşağıdaki şekilde de görüldüğü gibi küçücük bir entegre devredir. Nordic Semiconductor firması tarafından geliştirilmiştir. 2.4GHz ile 2.525GHz frekansları arasında kablosuz haberleşme gerçekleştirebilen çok kullanışlı bir haberleşme modülüdür. Bu frekans aralığı 2.4 GHz ISM bandını (2400-2483.5 MHz) kapsadığı için herhangi bir izin alınmasına gerek yoktur.
Piyasada nRF24L01 haberleşme entegresi kullanılarak geliştirilmiş iki yaygın modül bulunmaktadır. Bunlardan ilki aşağıdaki şekilde fotoğrafı sunulan üründür. Herhangi bir sinyal güçlendirme devresi içermez. Kısa mesafe haberleşmeleri için daha uygundur. Yerleşik mikroşerit bir antene sahiptir.
Yaygın olarak piyasada bulunan bir diğer nRF24L01 haberleşme modülü aşağıdaki şekilde gösterildiği gibi harici bir anten girişine sahip olan üründür. Bu modülün en temel özelliği bir güç yükselticiye sahip olmasıdır. Bu sayede çok daha uzak mesafelerle haberleşilebilmesine imkan tanır.
nRF24L01 Modülü Mikrokontrolcüye Nasıl Bağlanır
Yukarıda kısaca tanıtılan nRF24L01 modül çeşitlerinin her ikisi de aynı harici bağlantı yöntemlerine sahiptirler. Yani biri için yapılan bağlantı diğeri için de geçerli olacaktır. nRF24L01 kendisini kontrol edecek olan mikrokontrolcüye SPI (Serial Peripheral Interface) arabirimini kullanarak bağlanır. Bu makalede nRF24L01 uygulamasında kullanacağımız mikrokontrolcü Arduino Nano olacaktır. Arduino Nano ve nRF24L01 haberleşme modülü arasındaki bağlantı aşağıdaki şekilde gösterildiği gibi gerçekleştirilebilir. Vcc ve Gnd bağlantısı arasına paralel bir kondansatör (mesela 22µF değerinde) yerleştirilmesi nRF24L01’in kararlı bir şekilde çalışması için gerekmektedir.
nRF24L01 Kullanımı İçin Gerekli Arduino Yazılımı
Arduino Nano kullanarak nRF24L01 ile kablosuz haberleşme gerçekleştirebilmek için hem verici hem de alıcı tarafında birbiriyle uyumlu iki program yazmak gerekir. Bu uygulamadaki verici ve alıcı programlar aşağıda şematik olarak gösterilen haberleşme yapısı için tasarlanmıştır.
RF24 Kütüphanesinin Yüklenmesi
Arduino Nano ile nRF24L01’i kullanabilmek için RF24 kütüphanesini yüklememiz gerekiyor. Bunun için “Taslak” menüsündeki “Kütüphaneleri Yönet” alt menüsünü seçerek aşağıdaki şekilde ekran görüntüsü verilen “Kütüphane Yöneticisi” penceresinin açabiliriz. Daha sonra arama yazı kutusuna “RF24” yazıp listenin güncellenmesini beklemeliyiz. Liste güncellendiğinde TMRh20’ye ait RF24 kütüphanesini yükleyebiliriz.
Verici Modülün Kodları
Kütüphaneyi yükledikten sonra artık Arduino Nano için verici ve alıcı modüllere ait programları yazabiliriz. Öncelikle aşağıda bir örneğini görebileceğiniz verici kodunu yazmayı tercih ediyoruz.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 kablosuz(9, 10);
const byte adres[] = "arkis";
void setup() {
kablosuz.begin();
kablosuz.openWritingPipe(adres);
}
char giden[] = "Merhaba Dünya";
void loop() {
kablosuz.write(giden, sizeof(giden));
}
Yazacağımız kodlarda kullanacağımız sınıf ve fonksiyonlar için öncelikle yüklü kütüphanelerden ekleme yapmamız gerekiyor. Bu amaçla #include komutunu kullanıyoruz. İlk olarak nRF24L01 modülü Arduino Nano ile SPI arabirimi aracılığı ile bağlantı kurduğu için standart SPI.h kütüphanesini eklemeyi ihmal etmiyoruz. Aynı yöntemle programımıza dahil etmemiz gereken diğer iki kütüphane ise nRF24L01.h ve RF24.h olacaktır. RF24 sınıfını kullanarak kablosuz isminde bir nesneyi (9, 10) parametreleri ile oluşturuyoruz. Parametrelerin bu şekilde seçilmesinin sebebi bu uygulamada nRF24L01 ve Arduino Nano bacak bağlantılarının CE=D9 ve CSN=D10 şeklinde yapılmasıdır. Eğer başka iki Arduino Nano dijital pini CE ve CSN için belirlendiyse o pinlerin numaraları bu kısımda parametre olarak girilmelidir. Bağlantı adresi olarak “arkis” karakter dizisi seçilmiştir. Bu durumda alıcı kısmında da birazdan göreceğimiz gibi “arkis” karakter dizisi seçilmelidir. Aslında burada hedeflenen 5 bytelık bir adresin oluşturulmasıdır. Okunabilirliği artırabilmek için bu dizi karakter dizisi olarak belirlenmiştir. setup() fonksiyonu içerisinde kullanılan begin() fonksiyonu ile nRF24L01 çalışmaya hazır hale getirilir. Yine setup fonsiyonu içerisinde yer alan openWritingPipe() fonksionu ile daha önce belirledimiz adres üzerinden bir gönderim hattı açılır. Birazdan göreceğimiz üzere alıcı modülün de aynı adres ila alıcı hat açması gerekmektedir. Sürekli tekrar eden loop() standart fonksiyonuna girmeden önce “Merhaba Dünya” içeriğine sahip bir metin dizisi oluşturuyoruz. Bu metni kablosuz olarak alıcıya ulaştırmak bu uygulamadaki temel amacımız. Mesajımızı loop() fonksiyonu içerisindeki write() fonksiyonu ile gönderiyoruz. Bu fonksiyonun kullanılabilmesi için mesajımızın byte olarak uzunluğunun bilinmesi gerekiyor. Bu amaçla write() fonksiyonunun ikinci parametresi olarak sizeof() fonksiyonunun geri dönüş değerini kullanılıyoruz. Bu programı temel ve sade bir nRF24L01 gönderim kodu olarak kabul edebiliriz.
Alıcı Modülün Kodları
Gönderilen mesajın alınabilmesi için bir alıcı programına ihtiyacımız vardır. Bu program nRF24L01 için gerekli ayarları yaptıktan sonra mesajın gelmesini beklemek üzere sonsuz bir döngü içerisine girer. Aşağıdaki kodlar en temel işlevleri ile bu amaçla yazılmış bir programdır.
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 kablosuz(9, 10);
const byte adres[] = "arkis";
void setup() {
kablosuz.begin();
kablosuz.openReadingPipe(0, adres);
kablosuz.startListening();
Serial.begin(9600);
}
char gelen[32];
void loop() {
if (kablosuz.available()) {
kablosuz.read(gelen, sizeof(gelen));
Serial.println(gelen);
}
}
Dikkat edileceği üzere alıcı modül için yazılan program belirli bir satıra kadar verici modül için yazılan program ile aynı kodlara sahiptir. Bu programın alıcı olarak davranmasını istediğimiz için openReadingPipe(0, adres) komutu ile bir alım iletişim hattı açılmalıdır.Adres parametresinden önce “0” olarak belirlediğimiz bir iletişim hattı (pipe) numarası belirlememiz gerekiyor. Bu değer 0 ile 5 arasında altı adet farklı tanımlama için girilebilir. Ancak bu uygulamada sadece iki modül arasında haberleşme olacağı için bu parametrenin “0” olarak girilmesi yeterlidir. nRF24L01 modülümüzün gelen veriler için dinleme moduna geçmesi amacıyla startListening() fonksiyonunu kullanıyoruz. Serial.begin(9600) fonksiyonu USB hattını kullanarak Arduino Nano’dan bilgisayara veri iletebilmek için kullanılan bir komuttur. loop() sonsuz döngüsüne girmeden önce alıcı modüle ulaşan verileri saklayabilmek için kullanacağımız 32 byte’lık bir dizi oluşturuyoruz. available() fonksiyonu alıcı rolündeki nRF24L01’e bir veri yükünün (payload) sağlıklı bir şekilde ulaşıp ulaşmadığını kontrol etmek için kullanılmaktadır. Bu fonksiyon kablosuz modüle yeni bir veri geldiyse true, gelmediyse false değerini döndürmektedir. read() fonksiyonu kullanılarak gelen veri nRF24L01 modülünden okuyup ve tanımlanmış diziye aktarıyoruz. Son olarak da, gelen her veri seri USB portu aracılığı ile Serial Monitor penceresinden aşağıdaki şekildeki gibi izlenebilir.