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 🙂

 

 

25 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.

CEVAP VER