Arkadaşlar selamlar, bu içerikte daha önce videosunu paylaştığım RC kumandanın pin bağlantılarından örnek kullanımına kadar detaylı bir rehber bulacaksınız. Bu proje fikri özellikle de taşınabilir ve kolay programlanabilir bir kumanda ihtiyacı sonrası ortaya çıktı. Her RC cihazın kendine özel kumandası ve bu kumandaların taşıma zorluğu bu projeyi ortaya çıkarmış oldu.
Bu kumandayı örümcek robottan RC tekneye aklınıza gelebilecek her projede kontrolcü olarak kullanabilirsiniz. Bu rehberde de kumandayı kullanmak için ihtiyaç duyabileceğiniz teknik detayları ve örnek kodları bulacaksınız. Elinizde bu kumanda olmasa dahi bu rehber ile NRF24L01 modüllerini yakından tanıyarak radyo kontrollü projelere giriş yapabilirsiniz.
RC Kumanda Özellikleri
Kumanda üzerinde farklı görevler atayabileceğiniz toplam 10 bileşen bulunuyor: Kumandanın iki tarafında da bulunan toplam 2 switch, 2 joystick, 2 potansiyometre ve yine kumandanın 2 tarafında bulunan toplam 4 adet buton. Kart üzerindeki tüm bileşenler klasik kumandalarda alışık olduğumuz düzene uygun şekilde dizili.

Kumanda üzerindeki 14 kanalı tanıyalım:
- Buton 1
- Buton 2
- Potansiyometre 1
- Potansiyometre 2
- Switch 1
- Switch 2
- Joystick 1 – X Ekseni
- Joystick 1 – Y Ekseni
- Joystick 1 – Buton
- Joystick 2 – X Ekseni
- Joystick 2 – Y Ekseni
- Joystick 2 – Buton
Yukarıda sıralanmış tüm kanallar kumandanın beyni olan Arduino Nano’nun GPIO pinlerine bağlı ve kullanımları son derece basit. Kanalların bağlı olduğu pinlere ve örnek uygulamalara rehberin ilerleyen kısımlarında detaylı bir şekilde değineceğim.
Arduino Nano ile Kolay Programlama
Arduino ekosistemi özellikle de NRF24L01 modülleri kullanmak için çok sayıda kolaylığa sahip. Dolayısıyla sadece bu rehberi takip ederek kumandayı programlayabilir ve hemen kullanmaya başlayabilirsiniz. Kumanda üzerinde Arduino Nano kullanılmasının başka bir sebebi de kartın boyutu. Kapladığı alan itibarıyla Nano, bu tarzda bir proje için kullanılabilecek en iyi Arduino modeli diyebilirim.
Kumandanın Kalbi: NRF24L01
Şimdi bu kartı “kumanda” yapan modülü yakından tanıyalım. Arduino Nano için “kumandanın beyni” benzetmesini yapıyorsak RF modülü için de “kumandanın kalbi” demek yanlış olmaz. Kumandada kablosuz iletişimi sağlayan haberleşme modülü NRF24L01 modülünün antenli bir versiyonu. NRF24L01 modülü RF projeleri için kullanabileceğiniz en uygun fiyattaki modül diyebilirim. Arduino ile RF projelerinde görmeye alışık olduğumuz dahili anteniyle satılan NRF24L01 modülleri ekonomik bir çözüm olsa da düşük menzil kapasitesinden dolayı bu projede antenli bir versiyonunu kullandım. Üzerinde güç amplifikatörü ve SMA anten ile tasarlanmış NRF24L01 modülü açık alanda 1000 metreye kadar iletişim vaat ediyor. Daha sonra doğruluğunu test etmeyi planladığım bu mesafe kendi projelerim için fazlasıyla yeterli. Ayrıca bir kumandayı kumanda görüntüsüne kavuşturan en büyük etkenlerden birinin üzerindeki anten olduğunu da eklemek isterim.
NRF24L01 modülü özellikleri:
- Frekans: 2.4 GHz ~ 2.5 GHz
- Çalışma Voltajı: 3V ~ 3.6V
- Max Akım: 115mA
- Multi Frekans: 125 Frekans
- Açık Havada Menzil: 800-1000m
6-12 V Güç Girişi
RC Kumanda 6-12V güç ile çalışmaktadır. Bu gerilim seviyesindeki herhangi bir güç kaynağını kumandayı çalıştırmak için kullanabilirsiniz. Fakat güç kaynağı için en ideal çözüm Li-ion ve Li-po piller gibi şarj edilebilen ve yüksek akım verebilen piller kullanmak olacaktır. NRF24L01 modülüne ihtiyacı olan stabil gücü sağlayabilmek için 2 veya 3 adet 18650 pili seri bağlayarak kullanabilirsiniz. Güç girişini kartın üst kısmındaki girişlere kablo veya header bağlayarak sağlayabilirsiniz. Bağladığınız pilleri sabitlemek için kumandanın arkasında batarya boşluğu bulunmaktadır. Pil yuvasını bu boşluğa çift taraflı bant ile yapıştırarak rahatça kullanabilirsiniz.
Kumandanın bir sonraki versiyonunda pilleri şarj edecek bir devreyi kart üzerine eklemeyi planlıyorum. Bu sayede şarj işlemini doğrudan kumanda üzerinden tamamlayabileceğim. Üst versiyonda yapacağım bir diğer geliştirme pil doluluk durumunu gösterecek ledleri kart üzerine eklemek olacak.
Özel Tasarım PCB
Kumandanın devre kartını kumanda şekline uygun ve klasik bir kumandadaki parçaların konumunu dikkate alarak tasarladım. Projenin gerber dosyalarını aşağıdaki butonu kullanarak indirebilirsiniz. Ayrıca proje için ihtiyaç duyacağınız tüm malzemeler ve malzemelerin linklerini aşağıda bulabilirsiniz.
Proje Malzemeleri:
- 1 x Arduino Nano (CH340)
- 1 x NRF24 PA NA Kablosuz Modül
- 2 x 2 Eksen Joystick
- 2 x Toggle Switch
- 2 x 10 K Potansiyometre
- 2 x Pot Başlığı
- 4 x Push Buton
- 1 x Sürgülü On/Off Switch
- 1 x 10 uf 25 V Kondansatör
- 1 x 100 uf 25V Kondansatör
- 1 x AMS1117 3.3V Voltaj Regülatörü
- 18650 Li-ion Pil
Kumanda için Özel 3B Tasarım
Projenin özel tasarım bir PCB’den tam manasıyla bir kumandaya dönüşmesi için bazı geliştirmeler gerekiyordu. Bu yüzden kartın arkasına ele kolay oturabilen bir parça projeye hem kısa devreden korunma özelliği hem de estetik bir görüntü kazandırdı. Bu parçayla beraber kartın üzerindeki özel kesim pleksi, pleksi ve kart arasındaki 3B parçalar ve buton parçaları projeyi gerçek bir ürüne dönüştüren son dokunuşlar oldu. Artık kumanda hem estetik hem de kompakt bir yapıya kavuşmuş oldu.
NRF24L01 RC Kumanda Nasıl Kullanılır?
Bu kısımda kumandadaki Arduino bağlantılarından örnek kodlara kumandayı programlamak için ihtiyaç duyabileceğiniz tüm bilgileri bulacaksınız. Kumandayı kullanmak için ihtiyaç duyacağınız tek yazılım Arduino IDE. Kod içerisinde kullanacağımız kütüphanelerin kurulumunu da yine bu başlık altında göreceğiz.
Pin Bağlantıları
Kumanda için kod oluşturmadan önce kart üzerindeki modüllerin Arduino Nano’nun hangi pinlerine bağlı olduğunu bilmemiz gerekiyor. Tüm bağlantıları aşağıdaki tablo üzerinden görebilirsiniz.

Ayrıca aşağıda tüm pin bağlantılarının yer aldığı kod parçacığını bulabilirsiniz. Kumandayı programlamadan aşağıdaki pin tanımlamalarını kodun başına eklemek işinizi kolaylaştıracağı gibi kodun okunurluluğunu da arttıracaktır.
/* *** RC Kumanda Arduino pin bağlantıları *** */ #define toggle_1 2 //toggle-1 #define toggle_2 3 //toggle-2 #define buton_1 6 //buton-1 #define buton_2 4 //buton-2 #define buton_3 5 //buton-3 #define buton_4 7 //buton-4 #define pot_1 A6 //potansiyometre-1 #define pot_2 A7 //potansiyometre-2 #define joy1_X A1 //joystick-1 x ekseni(VRx) #define joy1_Y A0 //joystick-1 y ekseni(VRy) #define joy1_buton A4 //joystick-1 buton #define joy2_X A3 //joystick-2 x ekseni(VRx) #define joy2_Y A2 //joystick-2 y ekseni(VRy) #define joy2_buton A5 //joystick-2 buton #define CE 9 //NRF24L01 CE pini bağlantısı #define CSN 10 //NRF24L01 CSN pini bağlantısı
Yukarıdaki kod parçacığını ekledikten sonra kod içerisinde pin numarasını yazmak yerine doğrudan bileşenin ismini yazabilirsiniz.

Pin tanımlamalarını yaparken dikkat edilmesi gereken en önemli nokta butonların tanımlanma şekli. Kumanda üzerindeki butonlar donanımsal bir pull-up veya pull-down direncine sahip değil. Bu yüzden butonları yazılımsal olarak pull-up yapmamız gerekiyor. Bu işlem sonrası butona basıldığında “0”; basılmadığında ise “1” değerinin alınacağını eklemek isterim. Kodunuzu yazarken bu durumu dikkate almanız gerekecektir.
Butonları Arduino içerisindeki dahili pull-up direncini aktif ederek kullanmak için:

NRF24L01 Arduino Kütüphanesi Kurulumu
Kumandada Arduino Nano kullanılmasının başlıca sebebinin NRF24L01 modülünün Arduino kartlarıyla kolay kullanımı olduğundan bahsetmiştim. NRF24L01 modülleri için yazılmış çok sayıda Arduino kütüphanesi mevcut. Bu kütüphaneler sayesinde hazır fonksiyonları kullanarak projeleri hızlı ve sağlıklı bir şekilde dilediğimiz gibi programlayabiliyoruz.
Kütüphaneyi Arduino’ya dahil ederek kodumuzda kullanmaya hazır hale getirmemiz gerekiyor. Kodu aşağıdaki github sayfasından “.zip” formatında indirebileceğiniz gibi doğrudan butonu kullanarak da indirebilirsiniz. Ayrıca kullandığımız kütüphanenin özelliklerini içeren detaylı bir dokümantasyona yine aşağıdaki link üzerinden ulaşabilirsiniz.
Kütüphane Github Sayfası: https://github.com/nRF24/RF24
Kütüphane Dokümantasyonu: https://tmrh20.github.io/RF24/
Kütüphaneyi eklemek için sıkıştırılmış formattaki dosyaları çıkartarak “C:\Program Files (x86)\Arduino\libraries” klasörünün içine taşıyabilirsiniz. Bir diğer yöntem ise ekleme işlemini Arduino IDE üzerinden yapmaktır. Arduino IDE üzerinden kütüphane eklemek için “Taslak > library ekle > .ZIP kitaplığı ekle” seçeneğine gelerek indirmiş olduğunuz “.zip” formatındaki kütüphaneleri kolayca ekleyebilirsiniz.

Örnek Uygulamalar
Bu başlık altında basit uygulamalarla kumanda üzerindeki kanalların kullanımını göreceğiz. Uygulamalar boyunca kullanacağımız iki kütüphaneden “RF24” kütüphanesinin kurulumunu önceki aşamada tamamladık. Uygulamalarda kullanacağımız diğer kütüphane Arduino IDE kurulumuyla birlikte dahili olarak gelen “SPI” kütüphanesi olacak. Dolayısıyla “SPI” kütüphanesi için bir kurulum yapmamız gerekmiyor.
NOT: RC kumanda uygulamalar boyunca verici görevini görecek olsa da haberleşmeyi sağlamak için bir de alıcı devresine ihtiyacımız olacak. Alıcı devresi için tasarlanmış bir PCB’yi yakında paylaşacağım. Fakat bu içerikte alıcı devresini breadboard üzerine kuracağız. Dolayısıyla alıcı için de bir Arduino kartına ve NRF24L01 modülüne ihtiyacınız olacak.
NRF24L01 RC Kumanda ile LED Yakma #1
Bu uygulamada RC kumanda üzerindeki butonları kullanarak 4 kırmızı LEDi kontrol edeceğiz. Kumanda üzerindeki her buton bir LEDin kontrolünden sorumlu olacak. Alıcı devresini şemadaki gibi kurarak işe başlıyoruz.

Kullanılan Malzemeler:
Devreyi kurduktan sonra kod aşamasına geçebiliriz.
Bu aşamada verici ve alıcı devreleri için iki farklı kod yazmamız gerekiyor. Verici kısmında iletişim için kullanacağımız bir kanal belirlememiz gerekiyor. Hem alıcı hem de verici devresi için tanımlayacağımız bu adres iletişimi gerçekleştireceğimiz kanal olacak. Belirlediğimiz kanalı parola gibi de düşünebiliriz. Pin tanımlamalarını yaptıktan sonra RF modülü için bazı ayarlar yapmamız gerekiyor. Bu ayarları kod içerisindeki yorum satırlarını takip ederek daha detaylı inceleyebilirsiniz. “setup()” içindeki kodu tamamladıktan sonra “loop()” kısmına geçiyoruz. Burada “data” ismindeki dizinin elemanlarına butonlardan aldığımız okumaları kaydediyoruz. “Pin bağlantıları” bölümünde pull-up durumundaki butonlara basıldığında “0” değeri okunduğuna değinmiştim. Bu yüzden butonlardan gelen veriyi “!” ile tersleyerek kaydediyoruz. Son olarak da veriyi gönderecek fonksiyonu ekleyerek kodu tamamlıyoruz.
Verici Kodu:
#define buton_1 6
#define buton_2 4
#define buton_3 5
#define buton_4 7
#define CE 9
#define CSN 10
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(CE, CSN);
int data[4]; //Göndereceğimiz veriyi kaydedeceğimiz dizi
const byte address[6] = "00001"; //Adres tanımlaması
void setup()
{
pinMode(buton_1, INPUT_PULLUP); //Pin tanımlamaları
pinMode(buton_2, INPUT_PULLUP);
pinMode(buton_3, INPUT_PULLUP);
pinMode(buton_4, INPUT_PULLUP);
radio.begin(); //Haberleşmeyi başlat
radio.openWritingPipe(address); //Veri gönderilecek adres
radio.stopListening();//Modülü verici olarak tanımlıyoruz
}
void loop()
{
/*Butondan aldığımız değeri tersleyerek data dizisine kaydediyoruz*/
data[0] = !digitalRead(buton_1);
data[1] = !digitalRead(buton_2);
data[2] = !digitalRead(buton_3);
data[3] = !digitalRead(buton_4);
radio.write(data, sizeof(data)); //Veri Gönderimi
delay(10);
}
Alıcı kısmında da verici kodunda olduğu gibi kanal tanımlaması yapmamız gerekiyor. Buraya yazacağımız kanalın verici kodundakiyle aynı olması gerekiyor. Aksi taktirde iletişimin gerçekleşmeyeceğinden bahsetmiştik. Alıcı için kullanacağımız modülü okuma yapacak şekilde ayarlıyoruz. Ardından “loop()” içinde radyo modülüne gelen bir veri olup olmadığını “radio.available()” fonksiyonu ile kontrol ediyoruz. Veri gelmesi durumunda gelen veriyi “data” dizisine kaydederek bu verilere bağlı olarak LEDleri kontrol ediyoruz.
Alıcı Kodu:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
int data[4]; //Verilerin tutulacağı dizi
const byte address[6] = "00001"; //Adres tanımlaması
void setup()
{
for (int i = 2; i < 6; i++)
{
pinMode(i, OUTPUT); //4 LED için pin tanımlaması
}
radio.begin(); //Radyo iletişimini başlat
radio.openReadingPipe(1, address); //Adres tanımlaması
radio.startListening();
}
void loop()
{
for (int i = 2; i < 6; i++)
{
digitalWrite(i, LOW);
}
if (radio.available())
{
radio.read(data, sizeof(data)); //Veri okuması
for (int i = 2; i < 6; i++)
{
digitalWrite(i, data[i - 2]); //Gelen data durumuna göre LEDi kontrol et
}
}
delay(50);
}

RC Kumanda ile Servo Motor Kontrolü #2
Servo motorlar her RC araçta mutlaka bulunan motor çeşitleridir. Kendi yapacağımız RC araçlarda da servo motor kontrolüne mutlaka ihtiyaç duyacağız. Bu yüzden ikinci uygulama olarak kumanda üzerindeki joystick ile 2 adet servo motorun açılarını kontrol etmeyi göreceğiz.
Bu uygulamada da işe alıcı devresini kurarak ve devreye servoları bağlayarak başlıyoruz.

Kullanılan Malzemeler:
Servo motorları Joystick-1’i X ve Y ekseninde hareket ettirerek kontrol edeceğiz. Önceki uygulamada olduğu gibi bu çalışmada da RF modülünün ihtiyacı olan ayarları yapıyoruz. “loop()” kısmında joystick üzerinden X ve Y bilgisini okumamız gerekiyor. X ve Y eksenindeki hareketi “deger1” ve “deger2” değişkenleri içine kaydediyoruz. Joystickten aldığımız veriler Arduino’daki ADC(Analog-dijital dönüştürücü)’nin 10bitlik çözünürlüğe sahip olmasından dolayı 0-1023 aralığında olacak. Servo motorları 0-180 aralığındaki verilerle kontrol edebildiğimizden dolayı 0-1023 arasındaki değeri ölçeklendirmemiz gerekiyor. Bu yüzden map() fonksiyonu ile joystick üzerinden gelen 0-1023 aralığındaki değeri 0-180 aralığındaki bir değere dönüştürerek alıcıya gönderiyoruz.
Verici Kodu:
#define joy1_X A1
#define joy1_Y A0
#define CE 9
#define CSN 10
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(CE, CSN);
int deger1, deger2;
int data[2]; //Göndereceğimiz veriyi kaydedeceğimiz dizi
const byte address[6] = "00001"; //Adres tanımlaması
void setup()
{
radio.begin(); //Haberleşmeyi başlat
radio.openWritingPipe(address); //Veri gönderilecek adres
radio.stopListening();//Modülü verici olarak tanımlıyoruz
}
void loop()
{
deger1 = analogRead(joy1_X); //X ekseninden okuma yapıyoruz
deger2 = analogRead(joy1_Y); //Y ekseninden okuma yapıyoruz
/*0-1023 arasındaki değeri 0-180 skalasına alıyoruz*/
data[0] = map(deger1, 0, 1023, 0, 180);
data[1] = map(deger2, 0, 1023, 0, 180);
radio.write(data, sizeof(data)); //Veri Gönderimi
delay(10);
}
Alıcı kodunda servo motor kontrolü için gerekli olan “Servo.h” kütüphanesini koda dahil etmemiz gerekiyor. Bu kütüphane Arduino içerisinde dahili olarak bulunduğundan kütüphane indirme işlemi yapmamıza gerek yok. RF modülüne alıcı ayarlarını tanımladıktan sonra “loop()” içerisinde veri akışını kontrol ediyoruz. Veri gelmesi durumunda vericiden gelen ilk veriyi ilk motoru; ikinci veriyi ise diğer motoru sürmek için kullanıyoruz.
Alıcı Kodu:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>
RF24 radio(9, 10); // CE, CSN
Servo motor1, motor2;
int data[2]; //Verilerin tutulacağı dizi
const byte address[6] = "00001"; //Adres tanımlaması
void setup()
{
motor1.attach(5); //Servo motor pin bağlantıları
motor2.attach(6);
radio.begin(); //Radyo iletişimini başlat
radio.openReadingPipe(1, address); //Adres tanımlaması
radio.startListening();
}
void loop()
{
if (radio.available())
{
radio.read(data, sizeof(data)); //Veri okuması
motor1.write(data[0]); //0-180 arasındaki açı değerini uygula
motor2.write(data[1]);
}
delay(5);
}

İki basit uygulamayla beraber rehberin sonuna gelmiş olduk. Bu uygulamalar kumandanın çalışma şeklini gösteren basit projeler olsa da bu kumandayı ileride yapmayı planladığım farklı RC araçlarda kullanmayı planlıyorum. Siz de kumandayı farklı projelerinizde verici olarak kolaylıkla kullanabilirsiniz. Aklınıza takılanları yorumlar kısmında belirtebilirsiniz. Kumandanın bir sonraki versiyonunda görmek istediğiniz özellikleri de yine yorumlar kısmında paylaşabilirsiniz. Hoşça kalın! 🙂