Arkadaşlar merhaba,

Arduino ile ilgilenmeye başlayan neredeyse herkes, bir döneminde uzaktan kontrollü araba,bot veya quadrocopter yapmak istemiştir. Bu yazımızda Remote Control(RC) araç yapmak isteyen arkadaşlar için basit uzaktan kontrol devre ve kodunu anlatacağım. Bu yazıda iki Arduino’yu NRF24L01 modülü ile haberleştireceğiz ve ilk Arduino’dan butona basıldığında, diğer Arduino’daki ledin yanmasını sağlayacağız. Tabiki led yakmak işin basit kısmı fakat RC Car yaparsanız yine aynı mantıkta kalacaksınız ve butonlar joystick, ledler ise motor olacak. Biz burda sadece bir Arduino’dan diğerine veri yollamayı anlatacağız. Veriyi aldıktan sonra işlemek size kalmış.

İki Arduino’yu kablosuz haberleştirmenin bir çok yolu var. Bunlar, çok uzak mesafede haberleşebilen fakat fiyatı biraz tuzlu olan X-Bee modülleri, fiyatları daha da pahalı olan GPS veya GSM modülleri olabilir. Fakat ben bu projede fiyat/performans olarak son zamanlarda çıkmış en iyi ürün olan Nordic Semiconductor firmasının ürettiği ve internet ortamında yazılı olarak bir çok kaynağı bulunan NRF24L01 isimli kablosuz modülü kullanacağım.

Modül 2.4GHz frekansında kablosuz haberleşme yapmanıza imkan sağlayan düşük güç tüketimine sahip modüldür. Modül SPI arabirimini desteklemekte olup, 1 modül 126 taneye kadar modüle bağlanabilmektedir. Yani bir ev otomasyonu gerçekleştirdiğinizi düşünürsek, evimizdeki 126 tane nesneyi 1 tane NRF bağlı Arduino ile kontrol edebiliriz.

Uygulamada kullanılacak malzemeler ve araçlar şunlardır:

Projemizde SPI arabirimi ve modülümüz için 2 tane kütüphane kullanıyoruz. SPI kütüphanesi Arduino IDE’sini yüklediğimizde geliyor fakat modülümüz için kullanacağımız RF24-Master kütüphanesini bizim eklememiz gerekiyor. İlgili kütüphaneyi buradan indirebilirsiniz.

Kütüphaneyi indirdikten sonra winrar dosyası içindeki her şeyi C:\Program Files\Arduino\Library dosyası içerisine atıyoruz.

Kütüphaneleri ekledikten sonra devremizi kurup, arduinolarımıza kod yükleyebiliriz.

Fakat devreyi kurup kodları atmadan önce yapacağımız örneğin mantığını birazcık anlatmak istiyorum.

Verici kısmında, ilk önce verileri yollayacağımız bir kanal tanımlıyoruz, bu kanal üzerinden iletişim kuracağız. Yani bu kanal bir nevi bizim karşı tarafı parolamız. Karşı taraf bu parolayı görünce verilere alacak ve böylece iletişim tamamlanacak. Kanal tanımlandıktan sonra, NRF modülümüzü gönderim yapacak şekilde ayarlıyoruz(bu ayarlamalardan kod kısmında daha detaylı bahsedilecektir.). Ayarlamaları yaptıktan sonra, butona basıldığında NRF modülü ile karşı tarafa bir karakter yolluyoruz.

Alıcı kısmında ise, verileri alacağımız kanalı tanımlıyoruz. Bu kanal alıcı kısmındaki ile aynı olmalı çünkü parolamız demiştik ve parola iki tarafta da aynı olmalı. Kanalı tanımladıktan sonra bu sefer NRF modülümüzü okuma yapacak şekilde ayarlıyoruz. Bu sefer ise modülümüz sürekli olarak bir veri gelip gelmediğini kontrol ediyor. Bir veri geldiğinde, gelen verinin daha önce tanımladığımız olup olmadığını kontrol ediyoruz. Eğer doğru veri ise ledi yakıyoruz.

DEVRE ŞEMALARI

Alıcı Devresi

 

Alıcı Devresi
Alıcı Devresi

Alıcı devresinde 1 adet Arduino, 1 adet NRF24L01 ile 1 adet led devresi bulunmaktadır.

Verici Devresi

Verici Devresi
Verici Devresi

Verici devresinde ise 1 adet Arduino, 1 adet NRF24L01 ile 1 adet buton devresi bulunmaktadır.

Devreleri bu şekilde bağladıktan sonra geriye sadece Arduino’lara kod atmak kalıyor.

ARDUINO KODLARI

 Verici Kodları

#include  <SPI.h> 
#include "nRF24L01.h"
#include "RF24.h"     //Modül ile ilgili kütüphaneleri ekliyoruz
int mesaj[1];      //mesaj isminde bir dizi tanımlıyoruz
RF24 verici(9,10);     //kütüphane tarafından kullanılacak pinleri tanımlıyoruz
const uint64_t kanal = 0xE8E8F0F0E1LL; //kanalı tanımlıyoruz  
int buton = 7;      //butonun bağlı olduğu dijital pin

void setup(void)
{
 verici.begin();       //nrf yi başlatıyoruz
 verici.openWritingPipe(kanal);  //kanal id sı tanımlanıyor
}


void loop(void)
{
 if (digitalRead(buton) == HIGH)
 { 
 mesaj[0] = 123; 
 verici.write(mesaj, 1);   //mesaj değişkeni yollanıyor
 }
 }

Alıcı Kodları

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"           //Modül ile ilgili kütüphaneleri ekliyoruz
int mesaj[1];
RF24 alici(9,10);
const uint64_t kanal = 0xE8E8F0F0E1LL;
int led = 2;

void setup(void){
 Serial.begin(9600);
 
 alici.begin();
 alici.openReadingPipe(1,kanal);
 alici.startListening();
 pinMode(led, OUTPUT);
 }

void loop(void){
 if (alici.available())
 {
   bool done = false;    
   while (!done)
   {
     done = alici.read(mesaj, 1);      

     if (mesaj[0] == 123)
     {
       delay(10);
   digitalWrite(led, HIGH);
 }
     else {
       digitalWrite(led, LOW);
   }
     delay(10);
   }
 }
 }

Kodlarımızı bu şekilde yazıp, Arduino’larımıza yükledikten sonra ilk Arduino’dan butona bastığımızda ikinci Arduino’da ledin yandığını göreceğiz. Bu projeyi daha da geliştirip kendi RC arabanızı yapabilirsiniz.

İyi Çalışmalar 🙂

 

 

75 Yorumlar

  1. güzel yazı ama vericinin altında “Verici devresinde ise 1 adet Arduino, 1 adet NRF24L01 ile 1 adet led devresi bulunmaktadır.” yazmışsınız. İyide orada led değil düğme devresi var.

  2. bu modül ile iletişim sadece tek yönlü mü?
    yoksa çift yönlüde kullanılabiliyor mu?
    mesela ledi yak komutu gönderildi alıcı işlemi yaptı ledi yakıp geri bildirimi yapabiliyor mu ?

  3. C:\Users\fatih\Desktop\RE1\RE1.ino: In function ‘void loop()’:

    RE1:24: error: void value not ignored as it ought to be

    done = alici.read(mesaj, 1);

    ^

    exit status 1
    void value not ignored as it ought to be

    şekilnde bir hata ile karşılaşıyorum. neden kaynaklanabilir acaba?

    • Modül SPI üzerinden haberleşme yaptığı için Nano üzerindeki aynı numaralı pinlere bağlamanız yeterli olacaktır.

  4. “1 modül 126 taneye kadar modüle bağlanabilmektedir.” Ama Nasıl Heryerde Geçiyor Ama Nasıl Nasıl Nasıl 🙂

  5. Merhaba,
    Modülü o pinlerden başka pinlere bağlasakda aynı görevi görür mü? Ben ov7670 kamera ile birlikte kullanmak istiyorum kameraya basit bi komut verebilmek için alıcı olarak kullanacagım ama o pinler dolu boş olan diğer pinlere bağlasam da koddan değiştirsem yine işlemi gerçekleştirebilir miyim?

    • nRF24L01 modülü SPI haberleşmeye sahip olduğundan Arduino üzerindeki bu pinlere bağlantı yapmanız zorunludur. Birden fazla SPI cihaz çalıştırıyorsanız farklı cihazların chip select/slave select pinlerini farklı Arduino pinlerine bağlayarak haberleşmekte olduğunuz cihazı değiştirebilirsiniz.

  6. Merhaba,
    2 adet arduino yu haberleştirdim. Bir tanesinde sıcaklık verisi okuyarak diğerine gönderiyorum. Sorunsuz çalışıyor. Sormak istediğim, vericinin enerjisini kestiğimde alıcıda sıcaklık değeri sabit kalıyor sıfıra düşmüyor. Vericinin enerjisi kesildiğinde veya verici kapsama alanı dışına çıktığında alıcı hata versin veya gelen veriyi sıfıra düşsün. Bunu yapmak mümkün mü? Teşekkür ederim.

    • if (alici.available()) kullanarak alıcı ile bağlantı kopması durumunda yapılacakları belirtebilirsiniz.

  7. Merhabalar Bartu hocam teşekkür ederim verdiğiniz bilgiler için projenizi kurdum çalıştırdım ve 4 kanala kadar arttırdım fakat bir sorun çıkıyor işin içinden çıkamadım. Verici üzerinden bir veri yolladığımız anda haberleşme kopar ise o çıkış hep aktif kalıyor tx ledi söndüğünde tüm çıkışlara low komutu vermek istiyorum fakat yapamadım yardımcı olurmusunuz?

    • if (alici.available()) kullanarak alıcı ile bağlantı kopması durumunda yapılacakları belirtebilirsiniz.

  8. Merhaba, bir adet master nrf24l01 modülünden, 25 ayrı nrf24l01 slave modülünden gönderilecek datanın alınması mümkün müdür ?, örnek bir kod var mıdır?

  9. merhaba kolay gelsın Hocam 1 Haftadır hemen hemen ugrasıyorum. nanodan nanoya veya unodan unoya sıkıntı yok gayet basarılı calısıyor. artı megadan nanoya verı aktarımındada sorun yok ama nanodan megaya verı aktarırken sorun yasıyorum bu sorunu nasıl cozebılırım bır bılgınız varmı acaba

    • Büyük ihtimalle Arduino Mega kartları üzerinde yer alan SPI pinleri UNO ve Nano’daki gibi 13 (SCK), 12 (MISO), 11 (MOSI) ve 10 (SS) numaralı dijital pinlerde yer almadığı için böyle bir sorun yaşamaktasınız. Arduino Mega’ya ait bir pin şemasından ilgili pinlerin yerlerini bulup bağlantı yaptığınızda sorun çözülecektir.

  10. Merhaba. Buraya kadar olan anlatımlarınızın aynısını uyguladım ve çalıştı. Fakat bu projede her şeyi birebir yapmama rağmen led’i yakamadım. Bazı satırlara println’ler yerleştirerek hatayı yakalamaya çalıştım. Verici kısmında sorun yok fakat alıcıda if (alici.available()){Serial.println(“mesaj geldi”);……. yazıp deneyince port ekranına bir şey yazdırmadı. Acilen yetişmesi gereken bir projem var buradan veya mail’den yardımcı olur musunuz?

  11. Merhaba öncelikle verdiğiniz bilgiler için teşekkürler, Ben bir NRF24L01 modülü verici olarak programlayıp arduinodan bağımsız kullanabilir miyim ?
    Sadece modülü kullanmak istiyorum.

  12. Bizde de aynı sorun var; kodlar, bağlantılar birebir aynı. Ne yaptıysak if (alici.available()) içine girmiyor alıcı tarafı 🙁

    • Sorun olmaz, hatta birbirinden tamamiyle farklı iki mikrokontrolcüyü bile (örn. Arduino ile PIC) haberleştirebilirsiniz.

  13. Kullandığım araç 10 farklı harekete sahip bunun için 3 tane arduino joystick kullanmam gerekiyo. Bunun için 3 tane alıcı nrf24l01, 3 tane verici nrf24l01 mi kullanmam gerekiyor?

    • Hayır, böyle bir kullanıma gerek yoktur. Her bir joystick için okumalarınızı yaptırdıktan sonra tüm veriyi tek seferde bir adet verici NRF modülü kullanarak alıcı tarafındaki kartın okumasını sağlayabilirsiniz. Örnek olarak Arduino ile Kablosuz Gamepad Yapalım isimli yazımıza göz atabilirsiniz.

  14. error: void value not ignored as it ought to be

    done = alici.read(mesaj, 1);

    ^

    exit status 1
    void value not ignored as it ought to be

  15. Benim gibi sorun yaşayan arkadaşlar için uzun uğraşlardan sonra çözüm buldum:
    Ne yaptıysam kablo bağlantıları doğru olduğu halde iki NRF’yi haberleştirememiştim. Öncelikle NRF24L01 ucuz ürünle olduğu için farbrika çıkışı NRF üzerindeki pinleri ve diğer yerleri (lehimli yerleri) üzerinde kalıntılar olabiliyor. Bunun için pamuk ve selülozik tiner ile temizlemenizi öneririm. Daha sonra 3.3 Volt ve GND arasına 10uF’lık elektrolitik bir kondansatör bağlayınız. (Kondansatör’ün yönleri doğru olmalı eksi – yönü GND’ye gelecek!)
    Test etmek için RF’nin kendi kütüphanesi altında “GettingStarted” adında bir örnek uygulaması var. Onu kullanmanızı öneririm. Arduino->Dosya->Örnekler->RF24-master->GettingStarted
    Kütüphane için : https://github.com/maniacbug/RF24
    Yine sorun yaşayan olursa buradan yardımcı olmaya çalışırım.Bu arada ben antenli olan versiyonunu denedim.

  16. Çalışmanız programın 2082 bayt (6 %) saklama alanını kullandı. Maksimum 32256 bayt.
    Global değişkenler belleğin 28 byte kadarını (1%) kullanıyor. Yerel değişkenler için 2020 byte yer kalıyor. En fazla 2048 byte kullanılabilir.
    C:\Program Files (x86)\Arduino\libraries\examples içerisinde geçersiz kütüphane bulundu: C:\Program Files (x86)\Arduino\libraries\examples
    C:\Program Files (x86)\Arduino\libraries\tests içerisinde geçersiz kütüphane bulundu: C:\Program Files (x86)\Arduino\libraries\tests
    C:\Program Files (x86)\Arduino\libraries\examples içerisinde geçersiz kütüphane bulundu: C:\Program Files (x86)\Arduino\libraries\examples
    C:\Program Files (x86)\Arduino\libraries\tests içerisinde geçersiz kütüphane bulundu: C:\Program Files (x86)\Arduino\libraries\tests

    böyle bir sourun var nasıl çözcem veya kütüphaneyi yanlışmı attım aceba

  17. İyi günler. Acaba verici olarak kullandığımızı antenli olan ile kullanıp alıcı ise aynısı olsa uzun mesafede haberleşme yapılabilir mi?

    • Malesef hayır. NRF modüllerini kullanırken en düşük menzil sunan modülünüz ile sınırlanırsınız.

  18. Wireless modülü ile telefondan kontrollü drone yapmak mümkün müdür nasıl yapacaz malzemeler nelerdir kodlar nelerdir yardımcı olabilir misiniz

    • 1 veya 0 göndermek yerine, analogRead ile okuyacağınız potansın değerini 0-255 arasına çekerek (4’e bölebilir veya map() komutunu kullanabilirsiniz) bu değeri NRF aracılığıyla gönderebilirsiniz. Karşı tarafta da bu değeri analogWrite fonksiyonu ile PWM destekli bir pinden çıkış alarak LED’inizin parlaklığını kontrol edebilirsiniz.

    • NRF modülünde yer alan pinler breadboard ile kullanıma uygun değildir, dişi-erkek jumper kablo kullanarak Arduino’nuza bağlantı yapabilirsiniz.

  19. Mega ile nano arasında bağlantı kurmak istiyorum. Mega alıcı nano verici olacak şekilde nasıl düzenleyebilirim /Acil yardım edebilir misiniz!!!(nanoya buton taktim mega alıcı)

    • Yazımızda belirttiğimiz kütüphaneyi indirip, sonrasındaki işlemleri yapmanız gerekiyor (Yazımızda gerekli işlemler yazıyor).

  20. Öncelikle yapmış olduğunuz paylaşım için teşekkür ederim. Benim sorunum biraz ters olacak gibi, bu modülü kullanarak bir proje yaptım fakat haberleşme mesafesini azaltmak istiyorum ve başka bir değişle sinyal gücünü düşürmek istiyorum. Yardımcı olabilirseniz çok sevinirim.

    • Haberleşebilir. Hatta isterseniz Arduino ile Raspberry Pi, STM32 mikrokontrolcüler, PIC mikrokontrolcüler vs. gibi farklı marka-model cihazlar bile haberleşebilir. NRF modülleri birbiri ile uyumlu olduğu sürece sorun olmayacaktır.

  21. C:\Users\Windows 7\Desktop\atakan_al_c_\atakan_al_c_.ino:2:22: fatal error: nRF24L01.h: No such file or directory

    #include “nRF24L01.h”

    ^

    compilation terminated.

    exit status 1
    Error compiling for board Arduino/Genuino Uno.

    burda neyden bahsediyor yardımcı olurmusunuz

  22. İyi günler.. hocam uygulamanızı aynen yaptım fakat haberleşme sağlayamıyorum. Getting Started uygulamalarını çalıştırdığımda elimde ki wifi modüllerinin kanal numaralarının farklı olduğunu gördüm. Acaba onları nasıl yazacağız? Sizin wifi modüllerinin kanal numaralarını ya da başka bi rakam yazmamızın bir önemi var mı? Yoksa elimizde ki kanal numaraları neyse onu mu yazacağız?
    https://resmim.net/f/eAV5vF.jpg

      • Kullandığımız modüllerin WiFi özelliği bulunmamaktadır. Kendi aralarında özel bir protokol ile haberleşmektedirler. Kanal numarasını da biz kodda belirtmekteyiz. Sizin yüklemiş olduğunuz kod bu derste anlatılandan farklı, bu sebeple kanal numarasının değişmesi v.b. gibi durumlar konusunda birşey diyemeyeceğim.

  23. Hocam sizin kodları yüklediğimde çalışmıyor bende o yüzden RF24 ün kendi örneklerinde ki Getting Started uygulaması ile bu kanal numaralarına eriştim. Wifi kelimesini de yanlışlıkla kullandım wireless modülü diyecektim.
    Bu nrf ye düzgün voltaj alması için eklenen kapasitörlerin kaç volt olduğu önemli mi acaba? Ben 4.7mikrofarad 25 volt ve olmayınca 10mikrofarad 25 volt luk bir kapasitör kullandım normal haliyle çalışmadığı için. Ama bu şekilde de çalışmadı : ) Az önce denerken de wireless modülünün ısındığını farkettim acaba modül mü bozuldu. Elimde 3. bir modülde olmadığından test edemiyorum

    • Modülün besleme gerilimi 3.3V olduğu için bu değerin üzerindeki tüm kapasitörleri sorunsuzca kullanabilirsiniz. Bu tip modüllerde pin sırasını karıştırmak çok mümkün, bağlantılarınızı tekrardan kontrol etmenizi tavsiye ederim.

      • Youtube da ki kanalınızda İlge İpek ‘in yaptığı uygulamayı yazdım fakat orada kullanılan nrf24l01p.h kütüphanesini bulamadım açıklamalara da eklenmemişti. Acaba onu paylaşma şansınız var mı sizin ya da İlge bey’in?

        • Aslında bu kütüphane web de var buldum ama yüklerken hata veriyor. O yüzden sizin uygulamada kullandığınız kütüphane olursa daha iyi olur

    • Bağlantılarınızı tekrar kontrol etmeyi deneyebilirsiniz. Büyük olasılıkla bağlantınızda hata olduğu için programınız çalışmamaktadır.

CEVAP VER

Please enter your comment!
Please enter your name here