Başa dön
Arduino ile NRF24L01 Kablosuz Modül Kullanımı

Arduino ile NRF24L01 Kablosuz (RF) Modül Kullanımı

Merhaba arkadaşlar, arduino ile nRF24L01 wireless modül kullanımı makalemiz ile kablosuz veri aktarımı ve iletişim konusunu işleyeceğiz.

İki veya daha fazla Arduino kartının birbirleriyle kablosuz olarak iletişim kurabilmesi, sensör verilerini uzaktan izleme, iletme, haberleşme, robotları kontrol etme, ev otomasyonu gibi birçok işlem nrf24l01 wireless modül ile gerçekleştirilebilmektedir.

nRF24L01 wireless modül en ucuz veri iletişim seçeneklerinden biridir. nRF24L01 modül küçüktür ve her projeye kolaylıkla uygulanabilmektedir. 

nRF24L01 Wireless Modül Satın Al

 

nRF24l01 Wireless Modül Genel Bakış

Radyo Frekansı (RF)

NRF24L01 + alıcı-verici modülü dünya çapında 2.4 GHz ISM frekans bandında çalışacak şekilde tasarlanmıştır ve veri iletimi için GFSK modülasyonunu kullanır. Veri aktarım hızı 250kbps, 1Mbps ve 2Mbps olarak ayarlanabilir.

 

2.4 GHz ISM Bandı Nedir?

2.4 GHz bant, düşük güçlü cihazların kullanımı için uluslararası olarak ayrılmış Endüstriyel, Bilimsel ve Tıbbi (ISM), lisanssız bantlardan biridir. Kablosuz telefonlar, Bluetooth cihazları, yakın alan iletişimi (NFC) cihazları ve kablosuz bilgisayar ağları (WiFi), tümü ISM frekanslarını kullanır.

 

nRF24L01 Modül Güç Tüketimi

Modülün çalışma voltajı 1.9 ila 3.6 V arasındadır. Arduino’ya veya herhangi bir 5V logic mikrodenetleyicisine rahatlıkla bağlayabiliriz.

Modül programlanabilir çıkış gücünü destekler. 0 dBm, -6 dBm, -12 dBm veya -18 dBm’dir ve 0 dBm’de iletim sırasında inanılmaz bir şekilde yaklaşık 12 mA güç tüketir, bu da tek bir LED’den bile daha düşüktür. Ve en iyisi, bekleme modunda 26 µA ve güç kapama modunda 900 nA tüketir. Bu yüzden düşük güç tüketmesi gereken uygulamalar için en ideal kablosuz cihazlardır.

SPI Arayüzü

NRF24L01 wireless modülü, maksimum 10 Mb / sn veri hızı ile 4 pinli Serial Peripheral Interface (SPI) üzerinden iletişim kurar. Frekans kanalı (125 kanal seçilebilir), çıkış gücü (0 dBm, -6 dBm, -12 dBm veya -18 dBm) ve veri hızı (250kbps, 1Mbps veya 2Mbps) gibi tüm parametreler SPI arabirimi üzerinden yapılandırılabilir.

SPI veri yolu bir Master ve Slave kavramını kullanır. Çoğu uygulama da Arduino Master, nRF24L01 wireless alıcı-verici modülü Slave‘dir. I2C veri yolundan farklı olarak, SPI veri yolundaki slave sayısı sınırlıdır. Arduino Uno’da en fazla iki SPI slave kullanabilirsiniz, yani iki nRF24L01 wireless modülü.

 

nRF24L01 Teknik Özellikleri:

Frekans Aralığı2,4 GHz ISM
Max. Veri Hızı2 Mb/s
Modülasyon FormatıGFSK
Maks. Çıkış gücü0 dBm
Çalışma Gerilimi1.9 V ila 3.6 V
Maks. Çalışma Akımı13.5 mA
Min. Akım (Bekleme Modu)26 mA
Logic Pini5V (Toleranslı)
Veri İletim Mesafesi800m+ (Açık Alanda)

 

nRF24L01 Vs nRF24L01+ PA/LNA (Harici Antenli)

nRF24L01nRF24L01-PA-LNA

nRF24L01  wireless modülünde yerleşik anten kullanılır. Böylelikle kompakt bir yapı elde edilmiş olur. Ancak dahili küçük anten demek, daha düşük bir iletim aralığı anlamına gelir. nRF24L01  wireless modülü ile ortalama 100 metrelik bir mesafe içerisinde iletişim kurabilirsiniz. Tabii ki bu rakamlar açık havada geçerlidir. Kapalı mekandaki menziliniz -duvarlardan ötürü- zayıflayacaktır.

 

İkinci versiyon da (nRF24L01 SMA Antenli) bir SMA konektörü ve bir oynar başlı anten mevcuttur. Normal nRF24l01 ile Antenli versiyonu arasındaki fark, PA, LNA ve gönderme-alma anahtarlama devresi olarak entegre edilen özel bir RFX2401C çipidir. Anten ile birlikte bu menzil genişletici çip, modülün yaklaşık 1000 m’lik daha büyük bir iletim menzili elde etmesine yardımcı olur.

 

PA LNA nedir?

PA, Güç Amplifikatörü anlamına gelir. nRF24L01 yongasından iletilen sinyalin gücünü arttırır. LNA ise, Low-Noise Amplifikatör anlamına gelir. LNA’nın işlevi, antene gelen son derece zayıf ve belirsiz sinyalleri (genellikle mikrovoltlar veya -100 dBm’nin altında) daha kullanışlı bir seviyeye (genellikle yaklaşık 0.5 ila 1V) yükseltir.

LNA ve PA, iki sinyali ayıran ve nispeten güçlü, aşırı yüklenmeyi önleyen bir duplexer aracılığıyla antene bağlanır. Daha fazla bilgi için digikey.com adresindeki bu makaleye göz atın.

 

Not: Bu fark dışında, her iki modül de drop-in uyumludur. Yani, projeniz de istediğiniz nRF modülünü (Antenli veya Antensiz) sistemde herhangi bir değişiklik yapmanıza gerek kalmadan sök tak yaparak kullanabilirsiniz.

 

NRF24L01 Wireless Modülü Nasıl Çalışır?

RF Kanal Frekansı

NRF24L01 wireless modülü, Kanal adı verilen belirli bir frekansta veri iletir ve alır. Ayrıca iki veya daha fazla alıcı-verici modülünün birbirleriyle iletişim kurabilmeleri için aynı kanalda olmaları gerekir. Bu kanal 2.4 GHz ISM bandında herhangi bir frekans olabilir veya daha net rakam vermek gerekirse, 2.400 ila 2.525 GHz (2400 ila 2525 MHz) arasında olabilir.

Her kanal 1MHz’den daha düşük bir bant genişliğine sahiptir. Bu bize 1MHz aralıklı 125 olası kanal verir. Böylece, modül 125 farklı kanalı kullanabilir ve bu da 125 bağımsız kanalı tek bir yerde çalıştırabilir.

 
NOT: Kanal, 250kbps ve 1Mbps hava veri hızında 1MHz’den daha düşük bir bant genişliğine sahiptir. Bununla birlikte, 2Mbps hava veri hızında, 2MHz bant genişliği doldurulur (RF kanalı frekans ayarının çözünürlüğünden daha geniştir). Bu nedenle, üst üste binmeyen kanalları sağlamak ve 2Mbps modunda çapraz konuşmayı azaltmak için iki kanal arasında 2MHz aralık bırakmanız gerekir.

Seçtiğiniz kanalın RF kanalı frekansını aşağıdaki formüle göre ayarlanır:

 

Freq(Selected) = 2400 + CH(Selected)

 

Örneğin, veri iletimi için kanalınız olarak 108‘i seçerseniz, kanalınızın RF kanalı frekansı 2508MHz (2400 + 108) olacaktır.

 

nRF24L01 Çok Kanallı Ağ – Multiceiver

NRF24L01, “Multiceiver” adlı bir özellik sunar. Multiple ve Receiver kelimelerinin baş ve son kısmının birleştirilmesidir. Her bir RF kanalı Logic olarak Veri Boruları adı verilen 6 paralel veri kanalına ayrılmıştır. Başka bir deyişle, bir veri borusu fiziksel RF Kanalındaki Logic bir kanaldır. Her veri hattının kendi fiziksel adresi (Data Pipe Address) vardır ve yapılandırılabilir. Aşağıda örneğini görebilebilirsiniz.

 

Yukarıdaki diyagramı basitleştirmek için, aynı anda 6 farklı verici kanalından bilgi toplayan bir hub alıcı hayal edin. Hub alıcısı herhangi bir zamanda veri alımını durdurabilir ve verici görevi görür. Ancak bu, bir seferde sadece bir kanal/pipe ile yapılabilir.

 

Geliştirilmiş ShockBurst Protokolü

NRF24L01 wireless modülü, Enhanced ShockBurst olarak bilinen bir paket yapısı kullanır. Bu basit paket yapısı, aşağıda gösterilen 5 farklı alana ayrılmıştır.

Orijinal ShockBurst yapısı yalnızca Başlangıç, Adres, Yük ve Döngüsel Artıklık Kontrolü (CRC) alanlarından oluşuyor idi. Geliştirilmiş ShockBurst, yeni tanıtılan bir Paket Kontrol Alanı (PCF) kullanarak daha gelişmiş iletişim için daha fazla işlevsellik sağlamaktadır.

Bu yeni yapı ilk olarak, bir yük uzunluğu belirleyicisi ile değişken uzunluklu yüklere izin verir, yani yükler 1 ila 32 bayt arasında değişebilir.

İkincisi, gönderilen her pakete, alıcı cihazın bir mesajın yeni olup olmadığını veya yeniden iletilip iletilmediğini (ve böylece göz ardı edilip edilemeyeceğini) belirlemesini sağlayan bir paket kimliği de iletilir.

Son olarak ve en önemlisi, her mesaj alıcı cihaz tarafından alındığında bir bildirim gönderilmesini talep edebilir.

 

nRF24L01 Otomatik Paket İşleme

Bu bölümde iki nRF24L01 wireless modülü’nün birbiriyle nasıl iletişim sağladığını 3 farklı örnek ile daha iyi anlamaya çalışacağız.

Başarılı Veri ve Ack Transferi: Bu olumlu bir senaryo örneğidir. Burada verici, alıcıya bir veri paketi göndererek bir iletişimi başlatır. Tüm paket iletildikten sonra, alındı ​​paketinin (ACK) kesin olarak onaylanmasını bekler (yaklaşık 130 µs). Alıcı paketi aldığında vericiye ACK paketi gönderir. ACK paketini alırken verici, yeni verilerin mevcut olduğunu göstermek için kesme (IRQ) sinyali verir.

Veri Paketi Kaybedilen İşlem: Bu, iletilen paketin kaybı nedeniyle yeniden iletimin gerekli olduğu olumsuz bir senaryodur. Paket iletildikten sonra verici, ACK paketinin alınmasını bekler. Verici, Otomatik Yeniden İletim-Gecikme (ARD) süresi içinde Ack dönüşü alamazsa, paket yeniden iletilir. Yeniden iletilen paket alıcı tarafından alındığında, ACK paketi vericiye iletilir ve bu da işlemin başarı ile gerçekleştiğini gösterir.

ACK(İletildi Mesajı) Kaybedilen İşlem: Bu, yine ACK paketinin kaybedilmesi nedeniyle yeniden iletimin gerekli olduğu olumsuz bir senaryodur. Burada, alıcı ilk denemede paketi alsa bile, ACK paketinin kaybı nedeniyle, verici, alıcının paketi hiç almadığını düşünür. Bu nedenle, Otomatik Yeniden İletme-Gecikme süresi bittikten sonra paketi yeniden iletir. Artık alıcı, öncekiyle aynı paket kimliğini içeren paketi tekrar aldığında, ACK paketini tekrar gönderir. Böylece işlem başarılı bir şekilde tamamlanmış olur.

Bu paketin tamamı, mikro denetleyicinin katılımı olmadan nRF24L01 wireless modülü tarafından otomatik olarak yapılır.

 

nRF24L01 Wireless Modülü Pinout

NRF24L01 wireless modülünün her iki sürümünün (dahili ve harici antenli) pin çıkışına bakalım.

GND Toprak pinidir. Genellikle pin bir kare içine alınmış şekilde işaretlidir. Böylece diğer pinleri tanımlamak için referans olarak kullanılabilir.

VCC Modüle güç sağlar. Bu 1.9 ila 3.9 volt arasında olabilir. Arduino’nuzun 3.3V çıkışına bağlayınız. 5V pinine bağlarsanız, modülünüz büyük ihtimalle 🔥YANACAKTIR🔥

CE (Chip Enable) aktif bir HIGH pinidir. Seçildiğinde, nRF24L01 hangi moda bağlı olduğuna bağlı olarak veri gönderir ya da alır.

CSN (Chip Select Not) aktif bir LOW pinidir ve normalde HIGH tutulur. Bu pin LOW olduğunda nRF24L01, SPI portunu veri alımı moduna geçirir.

SCK (Seri Saat) SPI bus Master tarafından sağlanan saat hareketlerini kabul eder.

MOSI (Master Out Slave In) nRF24L01’e SPI girişi.

MISO (Master In Slave Out) nRF24L01’den SPI çıkışıdır.

IRQ işlenecek yeni veriler olduğunda master’ı uyarabilen bir kesme pinidir.

 

Kablolama – nRF24L01 Wireless Modülü Arduino UNO Bağlantısı

Artık nRF24L01 wireless modülünün nasıl çalıştığını tam olarak anladığımıza göre, onu Arduino’muza bağlamaya başlayabiliriz!

Başlamak için, modül üzerindeki VCC pinini Arduino’daki 3.3V’ye ve GND pinini Ground‘a bağlayın. CSN ve CE pinleri Arduino’daki herhangi bir dijital pine bağlanabilir. Bizde, sırasıyla 8 ve 9 numaralı dijital pinlere bağlıdır.

NRF24L01 wireless modülü çok fazla veri aktardığından, bir mikrodenetleyicideki SPI pinlerine bağlandığında en iyi performansı verecektir. SPI pinleri, çok hızlıdır.

Her Arduino Kartında buna göre bağlanması gereken farklı SPI pinleri olduğunu unutmayın. UNO / Nano V3.0 gibi Arduino kartları için bu pinler dijital 13 (SCK), 12 (MISO) ve 11 (MOSI)’dir.

Mega’nız varsa, pinler farklıdır! Dijital 50 (MISO), 51 (MOSI), 52 (SCK) ve 53 (SS)‘dir. Aşağıdaki tabloya göz atabilirsiniz.

Kart (Board)MOSIMISOSCK
Arduino Uno111213
Arduino Nano111213
Arduino Mega515052

Yukarıda belirtilenden farklı bir Arduino kartı kullanıyorsanız, devam etmeden önce Arduino resmi SPI kütüphanesini kontrol etmeniz önerilir.

 

NRF24L01 Wireless Modülü için RF24 Arduino Kütüphanesi

NRF24L01 wireless modülü ile arabirim oluşturmak oldukça meşakkatli bir iştir. Ancak bu işlemi kolay kılan bir dizi hazır kütüphane mevcuttur. Popüler kütüphanelerden biri RF24. Yeni başlayanlar için kullanımı kolaydır, ileri düzey kullanıcılar için idealdir.,

Kütüphanenin en son sürümünü RF24 GitHub üzerinden indirebilirsiniz veya zip dosyasını indirmek için bu düğmeyi tıklamanız yeterlidir:

 

Yüklemek için Arduino IDE’yi açın, Taslak> Library Ekle> .ZIP Kitaplığı Ekle‘ye gidin ve daha sonra indirdiğiniz RF24-master dosyasını seçin. Arduino ya kitaplık yükleme hakkında daha fazla bilgiye ihtiyacınız varsa, bu Arduino Kütüphanesi Kurma eğitimini ziyaret edin.

 

Arduino Kodu – Verici İçin

Deneyimizde, vericiden alıcıya standart bir ‘ Merhaba Dünya ‘ mesajı göndereceğiz.

Vericimiz için kullanacağımız kod:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  radio.begin();
  
  //set the address
  radio.openWritingPipe(address);
  
  //Set module as transmitter
  radio.stopListening();
}
void loop()
{
  //Send message to receiver
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  
  delay(1000);
}

Eskiz kütüphaneleri ekleyerek başlar. SPI.h kütüphanesi SPI iletişimini yönetirken, nRF24L01.h ve RF24.h modülü kontrol eder.

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

Ardından, bir RF24 nesnesi oluşturmamız gerekiyor. Nesne, CSN ve CE sinyallerinin bağlı olduğu parametreler olarak iki pin numarası alır.

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

Daha sonra, iki nRF24L01 + modülünün iletişim kurduğu pipe adresini temsil edecek bir bayt dizisi oluşturmamız gerekiyor.

//address through which two modules communicate.
const byte address[6] = "00001";

Bu adresin değerini “node1” gibi 5 harfli bir dizeyle değiştirebiliriz. Bir ağ da birkaç modül varsa adres gereklidir. Adres sayesinde iletişim kurmak istediğiniz belirli bir modülü seçebilirsiniz. Biz de hem verici hem de alıcı için aynı adrese sahip olacağız.

Sonraki kurulum fonksiyonunda: Vericinin adresini ayarladığımız fonksiyonu kullanarak radio.begin() radyo nesnesini başlatmamız gerekir radio.openWritingPipe()

//set the address
radio.openWritingPipe(address);

Son olarak modülü verici olarak ayarlayan radio.stopListening() işlevini kullanacağız.

//Set module as transmitter
radio.stopListening();

Döngü bölümünde: “Merhaba Dünya” mesajını atadığımız bir karakter dizisi oluşturuyoruz. radio.write() fonksiyonunu kullanarak bu mesajı alıcıya göndeririz. Buradaki ilk argüman göndermek istediğimiz mesajdır. İkinci argüman, bu mesajda bulunan bayt sayısıdır.

const char text[] = "Hello World";
radio.write(&text, sizeof(text));

Bu yöntemle, bir kerede 32 bayta kadar gönderebilirsiniz. Çünkü nRF24L01 + ‘ın tek bir paketinin maksimum boyutu bu kadardır. Alıcının veri aldığını doğrulamanız gerekiyorsa, radio.write() bir boll değer gönderir. TRUE değeri dönerse, veriler alıcıya ulaştı. FALSE döndürürse veriler kaybolur.

 

NOT: radio.write() işlevi, onayı alana kadar veya tüm yeniden iletim denemeleri bitene kadar programı engeller.

 

Arduino Kodu – Alıcı için

İşte bizim alıcı için kullanacağımız kod:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  while (!Serial);
    Serial.begin(9600);
  
  radio.begin();
  
  //set the address
  radio.openReadingPipe(0, address);
  
  //Set module as receiver
  radio.startListening();
}

void loop()
{
  //Read the data if available in buffer
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

Bu kod, bazı değişiklikler dışında vericinin programına oldukça benzemektedir.

Kurulum işlevinin başında seri iletişimi başlatırız. Daha sonra radio.setReadingPipe() fonksiyonu kullanarak verici ile aynı adresi ayarladık ve bu şekilde verici ve alıcı arasındaki iletişimi sağlıyoruz.

  //set the address
  radio