Arduino İle NRF24L01 Kullanarak RC Araba Yapımı

18 17.665
Merhaba ben Atakan, bügün sizlerle nrf24l01 kablosuz haberleşme modülü kullanarak uzun menzilli bir RC Araba yapacağız, Hadi Başlayalım;

Öncelikle malzeme listesi;

  • 2 Adet Arduino (Nano Veya Uno)
  • 2 Adet Joystick
  • 2 Adet NRF24L01 Antenli modül
  • 1 Adet L298N Motor sürücü
  • 2 Adet DC motor
  • 2 Adet 9V pil ve Breadboard

Bu proje ile öğreneceklerimiz;

  • NRF24L01 modüllerinin haberleşmesi
  • Joystick modüllerinin kullanımı
  • Motor sürücü ile DC motor kontrolü
  • Ve 2 Arduino’nun kablosuz haberleşmesi

Ve şimdide devre şemalarını oluşturalım

Alıcı Devresi

 

Verici Devresi :

 

Verici (kumanda) Kodu :

#include <SPI.h>
#include <nRF24L01.h> // Çeşitli kütüphaneler dahil ediyoruz
#include <RF24.h>

#define CE_PIN 7 // CE pinini belirtiyoruz
#define CSN_PIN 8 // CSN pinini belirtiyoruz
#define x_axis A0 // 1.joysticten gelecek x verisinin pinini belirtiyoruz
#define y_axis A1 // 1.joysticten gelecek y verisinin pinini belirtiyoruz
#define x2_axisa A2 // 2. joystictenj gelecek x verisinin pinini belirtiyoruz
#define y2_axis A3 // 2. joystictenj gelecek y verisinin pinini belirtiyoruz

const uint64_t pipe = 0xE8E8F0F0E1LL; // Başka NRF modüllerinin sinyalleri ile karışmasın diye şifre atadık
RF24 radio(CE_PIN, CSN_PIN);
int data[0];
int data[1]; // Data adlı değişkenler tanımlıyoruz
int data[2];
int data[3];

void setup()
{
Serial.begin(9600); // seri iletişimi açtık
radio.begin(); // radio iletişimi açtık
radio.openWritingPipe(pipe);
}

void loop()
{

data[0] = analogRead(x_axis); // x verisini oku ve data 0 adında kaydet
data[1] = analogRead(y_axis); // y verisini oku ve data 1 adında kaydet
data[2] = analogRead(x2_axis); // x2 verisini oku ve data 2 adında kaydet
data[3] = analogRead(x2_axis); // y2 verisini oku ve data 3 adında kaydet
radio.write( data, sizeof(data) ); // bu verileri alıcıya data adında ilet

// hatalara karşı küçük bir önlem
Serial.print(analogRead(x_axis));
Serial.print(" ");
Serial.print(analogRead(A1));
Serial.print(" ");
//Serial.print(digitalRead(BUTON));
}
Alıcı (Araba) Kodu:

#include <SPI.h> // Gerekli kütüphaneleri dahil ettik dahil ettik
#include <nRF24L01.h>
#include <RF24.h>

#define CE_PIN 9 // CE pininin 9. pine bağlı olduğunu belirttik
#define CSN_PIN 10 // CSN pininin 10. pine bağlı olduğunu belirttik
const uint64_t pipe = 0xE8E8F0F0E1LL; // başka pir NRF modülü ile bağlantı karışmaması için şifre atadık
RF24 radio(CE_PIN, CSN_PIN);
int data[2]; // data adında bir değişken atadık
const int Motor1_Ileri = 7; // Sağ motorun ileri pinini belirttik
const int Motor1_Geri = 6;// sağ motorun geri pinini belirttik

const int Motor2_Ileri = 4;// Sol motorun ileri pinini belirttik
const int Motor2_Geri = 2;// Sol motorun geri pinini belirttik
void setup()
{
pinMode(Motor1_Ileri,OUTPUT);// Sağ motorun ileri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor1_Geri,OUTPUT);// Sağ motorun geri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor1_PWM,OUTPUT);// Sağ motorun PWM pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor2_Ileri,OUTPUT);// Sol motorun ileri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor2_Geri,OUTPUT);// Sol motorun geri pininden çıkış vereceğimizi belirttik belirttik
pinMode(Motor2_PWM,OUTPUT);// Sol motorun PWM pininden çıkış vereceğimizi belirttik belirttik
Serial.begin(9600);// Seri iletişimi başlattık...
radio.begin();// Radio haberleşmeyi başlattık...
radio.openReadingPipe(1,pipe);
radio.startListening();;
}

void loop() {
if ( radio.available() ) // Radio iletişimi başlat ve...
{
int y = data[1];// Gelen y verisini data 1 olarak kaydet
int x = data[0];// Gelen x verisini data 0 olarak kardet
int y2 = data[3];// Gelen y2 verisini data 3 olarak kaydet
int x2 = data[4];// Gelen x2 verisini data 4 olarak kardet
radio.read( data, sizeof(data) ); //Ardından bu verileri oku
if(y >= 400 && y <= 600) { // Eğer gelen y verisi 400 den büyük 600 den küçük ise
digitalWrite(Motor1_Ileri,LOW);
digitalWrite(Motor1_Geri,LOW); // Hareket etme
digitalWrite(Motor2_Ileri,LOW);
digitalWrite(Motor2_Geri,LOW);
}
if(y >= 800 && y <= 1023) { // Gelen y verisi 800 den büyük 1023 den küçük ise
digitalWrite(Motor1_Ileri,LOW);
digitalWrite(Motor1_Geri,HIGH);// Sağ motoru geri dönder
digitalWrite(Motor2_Ileri,LOW);
digitalWrite(Motor2_Geri,HIGH);// Sol motor geri dönder
}
if(y >= 0 && y <= 450) { // Gelen y verisi 0 dan büyük 450 den küçük ise
digitalWrite(Motor1_Ileri,HIGH);// Sağ motor ileri dönder
digitalWrite(Motor1_Geri,LOW);
digitalWrite(Motor2_Ileri,HIGH);// Sol motor ileri dönder
digitalWrite(Motor2_Geri,LOW);
}
if(x2 >= 0 && x2 <= 450) { // gelen x verisi 0 dan büyük 450 den küçük ise
digitalWrite(Motor1_Ileri,LOW);
digitalWrite(Motor1_Geri,HIGH);// Sağ motoru geri dönder
digitalWrite(Motor2_Ileri,HIGH);// Sol motor ileri dönder
digitalWrite(Motor2_Geri,LOW);
}
if(x2 >= 600 && x2 <= 1023) { //gelen x verisi 600 den büyük 1023 den küçük ise
digitalWrite(Motor1_Ileri,HIGH);//Sağ motor ileri döner
digitalWrite(Motor1_Geri,LOW);
digitalWrite(Motor2_Ileri,LOW);
digitalWrite(Motor2_Geri,HIGH); // Sol motor geri döner
}
}
}

Robotun ana mantığı kumandadan gelen x ve y verilerini değerlendiriyor ve bu verileri okuduktan sonra motor sürücü ile motorları kontrol ediyor.

 

Bunlar da İlgini Çekebilir
Cevap bırakın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

18 Yorum
  1. Arda Kaygı

    kod yanlış
    https://github.com/ckaplan634/uzaktan-kumandal-araba-
    buradan bakıp yapabilirsiniz tamamen denenmiş çalışma

  2. Mustafa

    int data [1]; hata veriyor

  3. Onurcan

    Kütüphaneler Nerede

  4. Cengiz Yeniyurt

    Kodların ikisi de hatalı

    1. ali akçay

      data[0]
      data[1]
      data[2]
      data[3]
      diye tanımladığı değişkenleri galiba numaraları yanlış yere yazdı.

  5. Efe Kayacı

    Merhabalar. Arabanın iskeleti için yapmış olduğum ve ekleyeceğim özellikler yüzünden araba modelim biraz ağır oldu.
    tüm özelliklerle birlikte araba yaklaşık 5 kilo. Bu arabayı kaldırabilmek için ne tür ve nasıl bir motor kullanmalıyım. Bilgi verebilir misiniz acaba ?

    1. OnurAtakanulusoy

      Merhaba yakin zamanda bende buna benzer raspberry pi kullanarak bir robot yaptım ilk basta standart 4wd robot araba kitinin ne kadar agir olacağını düşünmemiştim birdebonun üstüne motor sürücü vb şeyler eklenince araba bi hayli zorlanıyor açıkçası ben durumu 2 adet pili oyuncak arabalardan çıkan sarf edilebilir pil kullanarak cozdum piyasada oldukça güçlü motorlar var bunlar için motor sürücüler var birde iyi bir lipo pil almanız lazim başka turlu 5kg yerinden oynatamayiz bence standart motorların bi üstünü ve onlar eğer çok amper çekiyorsa kullandığımız motor sürücüyü ve iyi bir güç kaynağı kullanmanız lazim yanlız kullandığımız motor sürücüde guclu bir motor surucu eğer motorlar çok güçlü değilse değiştirmeye gerek yok

  6. ZAHİD

    ya çok güzelde çok önemli bir sorun var ben kodu kendim sıfırdan yazdım ama kullanırken araç menzilin dışına çıkınca yada kumandanın pili bitince kısacası alıcı ile verici arasındaki bağlantı kopunca araç aldığı son komutta kalıyor mesela ileri doğru hızla giderken bir anda bağlantı kopunca araba aynı hızla gitmeye devam ediyor ve bir yere çarpıp kırılıyor bunun için kod yazmayı çok denedim sonuna else komutunu koyunca araba hiç gitmiyor denedim onu bir tanesi çalıştı yaptıklarımın fakat genede iyi bir performans alamadım bu sorunun bilinen bir kodu var mı ?

    1. Onur Atakan

      Merhaba ilginiz için teşekkür ederim. Öncelikle modülden gelen sinyalleri arduino nun seri monitörüne yansıtın ve bilerek iletişimi kesin ve seri monitörde gelen bilgiyi atıyorum 0 bunuda aynı ileri geride olduğu gibi if komutu ile arabayı durduracak şekilde yapın menzile tekrar girince bağlanıyormu hiç denemedim ama en mantıklısı arabanın durması olacaktır

      1. özgür

        Motorların hareketlerini high, low şeklinde digital Değil de analog yapacak olsaydık, joystick i çevirdiğimiz oranda hızlanması ve dönmesi için nasıl bir değişiklik yapmalıyız. Çıkamadım işin içinden. Yardımcı olur musunuz?

        1. Onur Atakan Ulusoy

          Merhabalar bu konuda oldukça mantıklı bir sistem olacaktır pwm sinyal ile kullanmak bunun için ;

          L298n nin pinlerinden 4 ünü kullanık ama aslında 6 tane pin var bunlar en sağdaki ve en soldaki pinler bu pinlerden pwm sinyal verebiliyoruz buda hızını ayarlamamıza yarıyor.
          öncelikle bu söylediğim pinlere birer kablo bağlayın ve bu kabloyuda arduino nun örneğin 6 ve 11 pinlerine bağlayın burada dikkat etmeniz gereken pinin pwm çıkışı desteklemesi olmalı bunu yanındaki işaretten anlayabilirsiniz.

          bu pinleri kodda tanımlamamız lazım tabiki

          const int a = 10;
          const int b = 11;

          ardından ise bu pinleri yani motor hızını kontrol etmek için

          analogWrite(a, 150);
          analogWrite(b , 150);

          bunun gibi bir yol izleyerek sistemi kurabilirsizin

          1. Onur Atakan Ulusoy

            Birde cons int deki pinleri hangi pine bağladıysanız ona göre değiştirmeniz lazım

            birde void setup kısmına şunu eklemeniz lazım

            pinMode(a, OUTPUT);
            pinMode(b, OUTPUT);

    2. Onur Atakan ULUSOY

      Merhaba ilginiz için teşekkür ederim. Öncelikle modülden gelen sinyalleri arduino nun seri monitörüne yansıtın ve bilerek iletişimi kesin ve seri monitörde gelen bilgiyi atıyorum 0 bunuda aynı ileri geride olduğu gibi if komutu ile arabayı durduracak şekilde yapın menzile tekrar girince bağlanıyormu hiç denemedim ama en mantıklısı arabanın durması olacaktır

  7. mehmet

    Kodlarda çok büyük hatalar var.Dogrusu bu diye bakmayın

  8. Ahmet Efe Atabey

    Atakan bey, motor sürücü ile Arduino arasındaki kabloları Arduinonun PWM pinlerini kullanmanız gerekmez miydi???

    1. Onur Atakan Ulusoy

      Merhaba araba zaten pek çıkışlı olarak tasarlanan bu yüzden normal lojik çıkış veren pinlerde kullanilabilir açıklamasını yaparken pwm pin demişim kusura bakmayin

  9. Ahmet Efe Atabey

    Atakan, bey acaba robotun çalışma videosunu atabilirsiniz.

    1. Onur Atakan Ulusoy

      Bu konuda çok üzgünün, bu sene 8.sınıfım bu yüzden daha çok derslere odaklandım. Bu yüzden sistemi kuramadım. Anlayışınız için teşekkür ederim.