nrf24l01 haberleşme ve stabilite sorunları

Swandy_82

Yeni Üye
Katılım
6 Mart 2026
Mesajlar
11
Merhaba, uzun bir süredir elimdeki NRF modüllerini Arduino kartlarım ile kullanmaya çalışıyorum fakat bir türlü başaramadım. Öncelikle iki adet SMA antenli NRF24L01 kullanarak kartlar arası haberleşme devresi ve örnek bir kod kullandım ama başarılı olamadım. Biraz araştırma ile filtre kapasitörü kullanarak devrenin süzülmesi gerektiğini gördüm; 100µF bir kapasitör lehimledim fakat sonuç değişmedi. Modüllerim 10 cm'den sonra haberleşmeyi kesiyordu. Bugün NRF modülleri için özel olan aparatlardan ve deneme yapmak için PCB antenli NRF modüllerinden temin ettim. Bunları da denediğimde değişen bir durum olmadı; veri aktarımı konusunda problem yaşadım. Çözüm olarak kartları bağımsız pil kaynakları ile beslemeyi, ortak GND yapmayı ve yüksek frekans için mercimek kapasitör eklemeyi denedim fakat haberleşmede bir iyileşme olmadı. Eğer bu konuda bir fikriniz veya tecrübeniz varsa beni aydınlatırsanız çok memnun kalırım.
 
NRF24L01 modüler çok ucuz ve o kadarda sorunlu modüler.
İlk denemeler için 50 adet sipariş vermişdik. Bina içinde bile 50m sorunsuz çalışıyordu.
Bunun üzerine 500 adet daha aldık. Sorun yoktu. Bir sonraki 500 adet direk çöpe gitti. EBYTE ile denedik (aynı nRF24 gibi) ama çok tatmin olmadık.
RFM95 kullanmaya başladık ve 3 (belkide 4) yıldır tek bir problem yaşamadık.
100µF iç direnci yüksel olabilir. Onun yerine 10µF/X7R en az 25V ile dene.
Birde bazı aldığımız antenler sadece görsel olarak anten idi: plastik çubuğu kırdığımızda içi boş çıkmıştı. Birinde basit bir tel vardı.
 
Paraziti ayrı, beslemesi ayrı, yazılımı ayrı; gerçekten dertli kartlar. Bildiğim kadarıyla Ebyte olan model de aynı silikonu (nRF24L01+) kullanıyor; fakat dışı parazite karşı kaplamalı ve amplifikatör katının gücü yüksek. Neyse, konuya dönecek olursak: 10µF kapasitörler ile PCB antenli modelleri NRF için olan adaptörlere yerleştirip tekrar denedim fakat haberleşmiyorlar. Acaba üzerindeki kristallerde mi bir sorun var diye düşünüp onların lehimlerini de tazeledim ama durumda bir değişiklik yok.
 
nrf ilk çıktığında alıp çalıştırdım, bir problem yaşamadım. Sonrasında kenara kaldırdım Aradan 3-5 yıl geçtikten sonra kaldırdığım modülleri tekrar kullanmam gerekti, netten hazır kodları denedim ve çalıştıramadım. Sonrasında kendi kodlarımı bulup çalıştırmıştım.

Bence nrflerin beslemesi hassas ama asıl problemi daha çok kod tarafında. Piyasadaki hazır Nrf modülleri kullanan ve binlerce adetlik üretim yapan 2 adet yerli firmayı biliyorum. Gerçi nrf teminini nereden yapıyorlar onu bilmiyorum, piyasa da kötü üretimleri mutlaka vardır.
 
Beslemeyi nereden veriyorsunuz? Arduino 3.3V pininden ise bu güç yetmeyebilir. Kopma sorunlarınız belki bu yüzdendir.
F34CE724-CF7E-4AE8-8AD9-7F87E54A6C68-215974.jpg



Üstteki NRF24L01 Çevirici Ara Modül (voltaj regülatörü) 5V besleme ile çalışır ve NRF24L01 modülünün ihtiyacı olan stabil 3.3V sağlar.
 
Beslemeyi nereden veriyorsunuz? Arduino 3.3V pininden ise bu güç yetmeyebilir. Kopma sorunlarınız belki bu yüzdendir.
47142 eklentisine bak


Üstteki NRF24L01 Çevirici Ara Modül (voltaj regülatörü) 5V besleme ile çalışır ve NRF24L01 modülünün ihtiyacı olan stabil 3.3V sağlar.
Besleme için birçok seçenek denedim; Arduino'nun kendi 3.3V çıkışı ile beslediğimde çalışmıyordu. Onun üzerine paylaştığınız ara modülden satın aldım ve 5V üzerinden besleme yaptım fakat yine haberleşme sorunumu çözmedi. NRF24L01 modülünün + ve - pinleri arasına 10µF bir elektrolit kapasitör koymam da işe yaramadı.
 
Verici ve alıcı kodunuzu paylaşın.
Deneme yapmak için yapay zekaya kod yazdırmıştım, bunları kullandım.

Verici

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

RF24 radio(9, 10);
const byte adres[6] = "00001";

void setup() {
  Serial.begin(9600);
 
  if (!radio.begin()) {
    Serial.println("HATA: NRF24 donanımı bulunamadı! Bağlantıları kontrol et.");
    while (1); // Modül yoksa burada dur
  }

  if (!radio.isChipConnected()) {
    Serial.println("HATA: NRF24 çipiyle iletişim kurulamıyor!");
    while (1);
  }

  radio.openWritingPipe(adres);
  radio.setPALevel(RF24_PA_LOW);
  radio.stopListening();
  Serial.println("Verici hazır, veri gönderiliyor...");
}

void loop() {
  const char metin[] = "deneme";
 
  // write() fonksiyonu bool döner: true ise paket ulaştı, false ise ulaşmadı
  bool durum = radio.write(&metin, sizeof(metin));

  if (durum) {
    Serial.println("Mesaj başarıyla iletildi.");
  } else {
    Serial.println("Haberleşme başarısız! Alıcı kapsama alanı dışında veya kapalı.");
  }
 
  delay(2000);
}

Alıcı

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

RF24 radio(9, 53);
const byte adres[6] = "00001";
unsigned long sonVeriZamani = 0;
const unsigned long zamanAsimi = 3000; // 3 saniye veri gelmezse uyarı ver

void setup() {
  Serial.begin(9600);
 
  if (!radio.begin()) {
    Serial.println("HATA: NRF24 Mega üzerinde bulunamadı!");
    while (1);
  }

  radio.openReadingPipe(0, adres);
  radio.setPALevel(RF24_PA_LOW);
  radio.startListening();
  Serial.println("Alıcı dinlemede...");
}

void loop() {
  if (radio.available()) {
    char metin[32] = "";
    radio.read(&metin, sizeof(metin));
   
    Serial.print("Gelen Veri: ");
    Serial.println(metin);
   
    sonVeriZamani = millis(); // Veri geldiği an zamanı güncelle
  }

  // Zaman aşımı kontrolü
  if (millis() - sonVeriZamani > zamanAsimi) {
    Serial.println("UYARI: Haberleşme yapılamıyor, veri akışı kesildi...");
    delay(1000); // Seri portu çok hızlı kirletmemek için
  }
}
 
Beslemeyi harici bir kaynaktan yapmaya çalışın.
Test esnasında modüller alandaki zıt köşelere yerleştirin.


Bu kodları deneyin Kanal 115 ve 250Kbps ayarları menzili daha çok artırır

Verici tarafı:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <printf.h>

RF24 telsiz(9, 10);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  printf_begin();
  Serial.println("Verici  Başlatılıyor");

  if (!telsiz.begin()) {
    Serial.println("Donanım algılanamadı");
    while (1);
  }

  telsiz.openWritingPipe(iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.setRetries(15, 15);
  telsiz.stopListening();
  telsiz.printDetails();
}

void loop() {
  const char mesaj[] = "Merhaba";
  Serial.print("Gönderiliyor: ");
  Serial.print(mesaj);

  bool gonderimDurumu = telsiz.write(&mesaj, sizeof(mesaj));

  if (gonderimDurumu) {
    Serial.println(" = Başarılı Mesaj ulaştı");
  } else {
    Serial.println(" = Hata Mesaj ulaşmadı");
  }

  delay(1000);
}




Alıcı tarafı:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <printf.h>

RF24 telsiz(9, 53);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  printf_begin();
  Serial.println("Alıcı  Başlatılıyor");

  if (!telsiz.begin()) {
    Serial.println("NRF24 modülü algılanamadı");
    while (1);
  }

  telsiz.openReadingPipe(1, iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.startListening();
  telsiz.printDetails();
}

void loop() {
  if (telsiz.available()) {
    char gelenVeri[32] = "";
    telsiz.read(&gelenVeri, sizeof(gelenVeri));
    Serial.print("Gelen mesaj:");
    Serial.println(gelenVeri);
  }
}
 
Son düzenleme:
Beslemeyi harici bir kaynaktan yapmaya çalışın.
Test esnasında modüller alandaki zıt köşelere yerleştirin.


Bu kodları deneyin Kanal 115 ve 250Kbps ayarları menzili daha çok artırır

Verici tarafı:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <printf.h>

RF24 telsiz(9, 10);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  printf_begin();
  Serial.println("Verici  Başlatılıyor");

  if (!telsiz.begin()) {
    Serial.println("Donanım algılanamadı");
    while (1);
  }

  telsiz.openWritingPipe(iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.setRetries(15, 15);
  telsiz.stopListening();
  telsiz.printDetails();
}

void loop() {
  const char mesaj[] = "Merhaba";
  Serial.print("Gönderiliyor: ");
  Serial.print(mesaj);

  bool gonderimDurumu = telsiz.write(&mesaj, sizeof(mesaj));

  if (gonderimDurumu) {
    Serial.println(" = Başarılı Mesaj ulaştı");
  } else {
    Serial.println(" = Hata Mesaj ulaşmadı");
  }

  delay(1000);
}




Alıcı tarafı:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <printf.h>

RF24 telsiz(9, 53);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  printf_begin();
  Serial.println("Alıcı  Başlatılıyor");

  if (!telsiz.begin()) {
    Serial.println("NRF24 modülü algılanamadı");
    while (1);
  }

  telsiz.openReadingPipe(1, iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.startListening();
  telsiz.printDetails();
}

void loop() {
  if (telsiz.available()) {
    char gelenVeri[32] = "";
    telsiz.read(&gelenVeri, sizeof(gelenVeri));
    Serial.print("Gelen mesaj:");
    Serial.println(gelenVeri);
  }
}
Kod için teşekkür ederim; kodları Arduino kartlarına yükledim ve bilgisayardan besleyerek test etmek istedim fakat hem alıcı hem verici tarafta "modül algılanamadı" hatası alıyorum.
 
C++:
#include <SPI.h>
#include <RF24.h>

//Mega için (9, 53) Uno için (9, 10) deneyelim
RF24 telsiz(9, 53);

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Haberlesme Testi");

  // SPI pin yapısı Mega için
  pinMode(50, INPUT);  //MISO
  pinMode(51, OUTPUT); // MOSI
  pinMode(52, OUTPUT); // SCK
  pinMode(53, OUTPUT); //CSN

  if (telsiz.begin()) {
    Serial.println("nrf24 Modulu Baglantisi basarili");
  } else {
    Serial.println("nrf24 modulune ulasılamadi");
  }
}

void loop() {}

Üstteki kodları hem uno da hem megada deneyin.
Hala hata alırsnaız Mega da ki CSN pinini 53 yerine 10 a takıp kodda RF24 telsiz(9, 10); olarak güncelleyip deneyin.
 
C++:
#include <SPI.h>
#include <RF24.h>

//Mega için (9, 53) Uno için (9, 10) deneyelim
RF24 telsiz(9, 53);

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println("Haberlesme Testi");

  // SPI pin yapısı Mega için
  pinMode(50, INPUT);  //MISO
  pinMode(51, OUTPUT); // MOSI
  pinMode(52, OUTPUT); // SCK
  pinMode(53, OUTPUT); //CSN

  if (telsiz.begin()) {
    Serial.println("nrf24 Modulu Baglantisi basarili");
  } else {
    Serial.println("nrf24 modulune ulasılamadi");
  }
}

void loop() {}

Üstteki kodları hem uno da hem megada deneyin.
Hala hata alırsnaız Mega da ki CSN pinini 53 yerine 10 a takıp kodda RF24 telsiz(9, 10); olarak güncelleyip deneyin.
Vakit ayırdığınız için teşekkür ederim; paylaştığınız kodu denedim. İlk denememde bağlantı başarısız oldu; daha sonra aradaki 5V gerilimi 3.3V seviyesine düşüren modülü çıkartıp NRF kartımı 3.3V üzerinden besleyince başarılı bir bağlantı aldım. Daha sonra yapay zekadan kartın dökümünü sunması için bir kod yazmasını istedim; şu şekilde bir sonuç aldım:

Kod:
--- MODUL OZELLIKLERI ---
SPI Speedz    = 10 Mhz
STATUS        = 0x0e RX_DR=0 TX_DS=0 TX_DF=0 RX_PIPE=7 TX_FULL=0
RX_ADDR_P0-1    = 0xe7e7e7e7e7 0xc2c2c2c2c2
RX_ADDR_P2-5    = 0xc3 0xc4 0xc5 0xc6
TX_ADDR        = 0xe7e7e7e7e7
RX_PW_P0-6    = 0x20 0x20 0x20 0x20 0x20 0x20
EN_AA        = 0x3f
EN_RXADDR    = 0x03
RF_CH        = 0x4c
RF_SETUP    = 0x07
CONFIG        = 0x0e
DYNPD/FEATURE    = 0x00 0x00
Data Rate    = 1 MBPS
Model        = nRF24L01+
CRC Length    = 16 bits
PA Power    = PA_MAX
ARC        = 0
------------------------------------------
Data Rate (Veri Hizi): 0
PA Level (Guc Seviyesi): 3
Kanal: 76
 
Çıktı aldığınıza göre pin bağlantıları doğru olduğunu gösteriyor. Şimdi aşağıdaki kodları deneyin


Verici kodu:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 telsiz(9, 10);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  telsiz.begin();
  telsiz.openWritingPipe(iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.stopListening();
  Serial.println("Verici hazir");
}

void loop() {
  const char mesaj[] = "Test mesaji";
  bool durum = telsiz.write(&mesaj, sizeof(mesaj));

  if (durum) {
    Serial.println("Mesaj gonderildi");
  } else {
    Serial.println("gonderme basarisiz");
  }
  delay(1000);
}



Alıcı kodu:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 telsiz(9, 53);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  telsiz.begin();
  telsiz.openReadingPipe(1, iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.startListening();
  Serial.println("Alıcı dinliyor");
}

void loop() {
  if (telsiz.available()) {
    char gelenVeri[32] = "";
    telsiz.read(&gelenVeri, sizeof(gelenVeri));
    Serial.print("Gelen:");
    Serial.println(gelenVeri);
  }
}
 
Çıktı aldığınıza göre pin bağlantıları doğru olduğunu gösteriyor. Şimdi aşağıdaki kodları deneyin


Verici kodu:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 telsiz(9, 10);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  telsiz.begin();
  telsiz.openWritingPipe(iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.stopListening();
  Serial.println("Verici hazir");
}

void loop() {
  const char mesaj[] = "Test mesaji";
  bool durum = telsiz.write(&mesaj, sizeof(mesaj));

  if (durum) {
    Serial.println("Mesaj gonderildi");
  } else {
    Serial.println("gonderme basarisiz");
  }
  delay(1000);
}



Alıcı kodu:
C++:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 telsiz(9, 53);
const byte iletisimAdresi[6] = "00001";

void setup() {
  Serial.begin(9600);
  telsiz.begin();
  telsiz.openReadingPipe(1, iletisimAdresi);
  telsiz.setPALevel(RF24_PA_LOW);
  telsiz.setDataRate(RF24_250KBPS);
  telsiz.setChannel(115);
  telsiz.startListening();
  Serial.println("Alıcı dinliyor");
}

void loop() {
  if (telsiz.available()) {
    char gelenVeri[32] = "";
    telsiz.read(&gelenVeri, sizeof(gelenVeri));
    Serial.print("Gelen:");
    Serial.println(gelenVeri);
  }
}
Bu kod ile antensiz modelleri kullanarak deneme yaptım fakat menzil yine oldukça kısa kaldı; 4-5 metreden sonra, bağlantı kesiliyor.
 
Antensiz açık alanda 50-100 metre arası, kapalı alanda 15-20 metre civarı olması gerekir.,
Ara modülü geri takın, adaptörün VCC girişini Arduino'nun 5V pinine bağlayın. Bağlantının çalıştığından emin olduğumuza göre gücü artırabiliriz, kodda:

şu satırı
C++:
radio.setPALevel(RF24_PA_LOW);

şöyle yapın.
C++:
telsiz.setPALevel(RF24_PA_MAX);

koddaki 110 olarak ayarlanan kanalı 100 ile 125 arası başka bir kanalı çekin, ortamdaki wifi sinyalleri de işi bozuyor olabilir.
C++:
telsiz.setChannel(110);
 
Son düzenleme:
elindeki chipler clone ise ne yaparsan yap sıkıntı çıkacaktır. nrf24 serisi chiplerin onlarca çinli clonu var. adafruit veya olimex gibi bir üreticiden modül ya da digikey-mouser gibi bir firmadan chip almadığın sürece orjinal nrf24 denk gelme olasılığın pek yok.

elinde bir sdr alıcı var sinyal gücüne ve frekansına bakabilirsin ya da bazı wifi kartlar low level erişim ile nrf paketlerini yakalayıp decode edebiliyor.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
8,980
Mesajlar
145,666
Üyeler
3,626
Son üye
crea

Son kaynaklar

Back
Top